如何

问题描述:

我使用Python绑定的OpenCV与压缩图像使用cv2.findHomography()。我正在使用关键点检测和描述(即SURF,SIFT,...)来查找目标图像中包含的模板图像,但有一个问题:模板可能会被“挤压”在目标图像中,比率与目标图像不同。如何

这不会findHomography()的工作,因为它假设一个简单的透视变换,不能有这种拉伸。

有什么方法可以做到这一点?我曾经想过增量扩展目标图像的数量以改变宽高比,并且在每次迭代时使用findHomography,但据我所知,没有办法比较拟合的质量(因为我使用RANSAC找到最合适的),所以我不能说出它最适合的挤压水平。

计数可能通过查看返回的掩码长度正确地从RANSAC匹配点的数量?这看起来很糟糕。

这不适用于findHomography(),因为它假定了一个简单的透视变换,它不能进行这种拉伸。

这是不正确的;即使是仿射变形也包括stretching the aspect ratios甚至剪切变形,并且单应性甚至通过非均匀变形来扩大这种变形。例如,仿射变换由矩阵

2 0 0 
0 1 0 

将由两个因素水平拉伸的图像给定,与此短节目看出:

import cv2 
import numpy as np 

img = cv2.imread('lena.png') 
affine_warp = np.array([[2, 0, 0], [0, 1, 0]], dtype=np.float32) 
dsize = (img.shape[1]*2, img.shape[0]) 
warped_img = cv2.warpAffine(img, affine_warp, dsize) 

cv2.imshow("2x Horizontal Stretching", warped_img) 
cv2.waitKey(0) 

产生输出:Lena stretched 2x wide

所以这不是你的问题。同形异形允许更强的翘曲。你运行RANSAC自己或让findHomography()功能通过RANSAC决定你的观点?请发布您的预期输出和您当前的代码,可能在一个反映您遇到的问题的新问题中。

+0

谢谢,你是完全正确的。我的代码工作正常,当我认为我的图像被拉伸时,我错了,他们实际上只是在侧面填充了一些额外的东西。我误解了维基百科有关Homography的文章,其中说单应性涉及“同一平面的任何两个图像”,我认为这意味着表面上的同一图像。我没有意识到它也可以编码仿射变换。谢谢! –