Python Opencv:点匹配很好,但单应性错误

Python Opencv:点匹配很好,但单应性错误,python,opencv,camera-calibration,homography,perspectivecamera,Python,Opencv,Camera Calibration,Homography,Perspectivecamera,我试图提取两幅图像之间的单应矩阵。原始平面图像和包含第一个平面图像的另一个图像。我将遵循本教程中的步骤 找到的匹配项看起来很棒,但是当绘制包含图像的框时,它看起来是错误的,因为它不包含图像…但是其中一个边框是正确的。。。发生了什么事?单应矩阵是错误的还是仅仅是一个可视化问题 我的代码如下所示: M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0) matchesMask = mask.ravel().tolist() h

我试图提取两幅图像之间的单应矩阵。原始平面图像和包含第一个平面图像的另一个图像。我将遵循本教程中的步骤

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

我的代码如下所示:

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)
我得到的东西有:


这看起来有点不同,但仍然不是我所期望的。

在定义钝化框时,指定这些角点

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)

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

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

当海报的角落在相机后面时,问题就出现了。。。。由于它们在后面,点的投影没有意义:无法投影位于opitcal轴负部分的3d点,因此绘制海报的角没有任何意义,但是单应性是正确的

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


如果我错了,请纠正我

你说的“它错了”是什么意思?我希望图像周围都是边界框…不确定你指的是什么边界框。正确图像中的白线。它们是图像的边界,我也有同样的问题。问题解决了吗?对。你说得有道理,但还没有解决。。。我已经更新了这个问题。谢谢您可以尝试绘制/变换整个长方体,而不是绘制/变换整个长方体,例如长方体的中心或半个长方体或整个长方体上的网格。