从头开始实现cv2.warpPerspective()

问题描述 投票:0回答:2

当我决定从头开始编码以更好地理解其管道时,我正在使用 OpenCV 函数 cv2.warpPerspective 进行一些实验。尽管我(希望)遵循了每一个理论步骤,但似乎我仍然遗漏了一些东西,并且我正在努力理解什么。你能帮我吗?

SRC 图像(左)和真实 DST 图像(右)

cv2.warpPerspective 的输出与真实 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)

我的代码的输出

PS:输出图像是估计夏令时和真实夏令时的重叠,以更好地突出差异。

python opencv image-processing computer-vision homography
2个回答
3
投票

您的问题相当于打字错误。您混淆了坐标的命名。单应性假设为

(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]
并使用它们即可。

我建议修复命名方案,或在评论中将其定义在顶部。我建议坚持使用

x,y
而不是 i、j、u、v,然后用前缀/后缀扩展它们所在的空间(“src/dst/in/out”)。也许像
ox,oy
用于迭代,只是
xw,yw,w
用于单应性结果,通过除法变成
x,y
,以及
ix,iy
整数化)用于在 input 中采样?然后就可以使用
dst[oy, ox] = src[iy, ix]


0
投票

这是一个工作示例代码,根据 @Christoph 的建议,对任何感兴趣的人进行了少量修改和拼写错误修复。

src_img = post_img
dst = np.zeros(src_img.shape)
height, width = src_img.shape

for ox in range(height):
    for oy in range(width):
        xw, yw, w = homography_matrix.dot(np.array([ox, oy, 1]).T)

        tx, ty = int(xw / w), int(yw / w)

        # Check if it falls in the src domain
        c1 = tx >= 0 and tx < height
        c2 = ty >= 0 and ty < width

        if c1 and c2:
            dst[ty, tx] = src_img[oy, ox]

homography_matrix
是使用OpenCV函数计算的
cv2.findHomography

© www.soinside.com 2019 - 2024. All rights reserved.