我正在对OpenCV Function cv2.warpPerspective做一些实验,然后我决定从头开始编写它的代码,以便更好地理解它的流程.尽管我遵循了(希望)每一个理论步骤,但似乎我仍然遗漏了一些东西,我很难理解到底是什么.你能帮帮我吗?

SRC image (left) and True DST Image (right)

Output of the cv2.warpPerspective overlapped on the True DST

# Invert the homography SRC->DST to DST->SRC
hinv = np.linalg.inv(h)
src = gray1
dst = np.zeros(gray2.shape)
h, w = src.shape

# Remap back and check the domain
for ox in range(h):
    for oy in range(w):

        # Backproject from DST to SRC
        xw, yw, w = hinv.dot(np.array([ox, oy, 1]).T)

        # cv2.INTER_NEAREST
        x, y = int(xw/w), int(yw/w)

        # Check if it falls in the src domain
        c1 = x >= 0 and y < h
        c2 = y >= 0 and y < w

        if c1 and c2:
            dst[x, y] = src[ox, oy]

cv2.imshow(dst + gray2//2)

Output of my code

PS:输出的图像是估计DST和真实DST的重叠,以更好地突出差异.

推荐答案

你的问题总共是typo分.你把你的坐标命名搞混了.单应为(x,y,1)级,相当于(j,i,1)级.

只需在计算中使用(x, y, 1),并在结果中使用(xw, yw, w)(然后使用x,y = xw/w, yw/w).如果表述得当,w倍反映了这一数学过程.

避免索引到.shape.这些指数并不能"说话".只需做(height, width) = src.shape[:2]步,然后使用它们.

我建议修改命名方案,或者在 comments 中最上面定义它.我建议坚持使用x,y,而不是i、j、u、v,然后使用前缀/后缀扩展它们所在的空格("src/dst/in/out").也许像ox,oy这样用于迭代,只有xw,yw,w用于单应结果,通过除法变成x,y,ix,iy(integerized)用于input中的采样?那么你可以用dst[oy, ox] = src[iy, ix]

Python相关问答推荐

导入错误:无法导入名称';操作';

如何将数据帧中的timedelta转换为datetime

以异步方式填充Pandas 数据帧

操作布尔值的Series时出现索引问题

分解polars DataFrame列而不重复其他列值

BeatuifulSoup从欧洲志愿者服务中获取数据和解析:一个从EU-Site收集机会的小铲子

是否将Pandas 数据帧标题/标题以纯文本格式转换为字符串输出?

有没有一种方法可以根据不同索引集的数组从2D数组的对称子矩阵高效地构造3D数组?

使用元组扩展字典的产品挑战

如何从具有完整层次数据的Pandas框架生成图形?

滑动子数组美容工作在IDE上,但不是在leetcode上

优化数组加法(y,x,RGBA)

使用GEKKO将两个总体拟合到测量值如何优化第一个数据点

运行时错误:在python3.8中,等待未与future 异步词典理解一起使用

考虑线宽的两个并排条形图

新进程不会在运行FastApi的Docker中启动

PYTHON中的regex与PostgreSQL等其他系统中的regex有区别吗?

壁虎中的动态优化

Python .删除DataFrame中的标题标签(&U;UNNAMED:0),并将其余标题标签向左移动(不更改值)

在LangChain和OpenAI嵌入中没有从链中获取源文档