Opencv:好点匹配但错误的单应性

时间:2013-12-23 21:55:09

标签: python opencv camera-calibration homography perspectivecamera

我正在尝试提取两个图像之间的单应矩阵。原始平面图像和包含第一个图像的另一个图像。我正在按照本教程https://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_feature2d/py_feature_homography/py_feature_homography.html#feature-homography中的步骤进行操作。

找到的匹配看起来很棒,但是当绘制包含图像的框时,它看起来是错误的,因为它不包含图像......但是其中一个边框没问题......那么发生了什么?单应矩阵是错误的还是仅仅是一个可视化问题?

Bad bounding box

我的代码如下:

M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0)
matchesMask = mask.ravel().tolist()

h,w = self.poster_original.shape
pts = np.float32([ [0,0],[w-1,h-1],[w-1,0],[0,h-1]]).reshape(-1,1,2)
dst = cv2.perspectiveTransform(pts,M)
self.undistorted_camera_image= cv2.polylines(self.undistorted_camera_image,[np.int32(dst)],True,255,3, cv2.LINE_AA)

编辑: 将角落的顺序更改为:

pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2)

我得到的结论是:

bb2

bb3

看起来有点不同但仍然不符合我的预期。

2 个答案:

答案 0 :(得分:0)

定义蓝色框时,指定这些角落

pts = np.float32([ [0,0],[w-1,h-1],[w-1,0],[0,h-1]]).reshape(-1,1,2)

但该示例使用

pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2)

他们将形成一个正方形(左上角 - >左下角 - >右下角 - >右上角),你的将形成别的东西(左上角 - >右下角 - >右上角 - >左下角。)

答案 1 :(得分:0)

如果我没错,单应性是正确的:两个角和线的对齐是完全正确的。

当海报的角落在相机后面时出现问题....当它们落后时,点的投影没有意义:你不能投射出负面的3d点因此,绘制海报的角落没有任何意义,但单应性是正确的。

这解释了为什么在其他可以看到整张海报的图片中,我可以完美地绘制海报边框。

如果我错了,请纠正我