opencv透视变换产生了不正确的变换,尽管存在良好的单应性



我在尝试获取perspectiveTransform()以产生我能理解的结果时遇到了问题。

我正在写一个图像匹配应用程序。这些图像大多是绘画。我匹配的是整体,整体,部分,部分,甚至部分。决议将有所不同。由于这种关系,通常使用的"对象"场景"术语不适用。因为对象实际上可以是场景,反之亦然。所以我使用查询图像和目标索引图像来描述查询和我匹配的图像。

我一直在学习各种OpenCV教程,将一幅图像与另一幅图像进行匹配,然后使用透视变换在识别的图像上放置边界框。。。但是我遇到了问题。

图像1-整个部分-图像匹配结果:查询图像(左),目标预索引img(右)

在添加到这个图片中,我们可以看到我有一个完整的部分关系。作为进行该处理的SIFT过程的一部分,图像已被缩放到最大边缘1000并变为灰度。

Query image dimensions x=1000, y=750  
Idx image dimensions x=667, y=1000  
Initial Flann matches: 501  
After Lowe's 2nd nn ratio: 48 matches  
RANSAC inliers: 37 matches  

代码。。

homography = Calib3d.findHomography(idxMatOfPoint2f, queryMatOfPoint2f, Calib3d.RANSAC, 5, mask, 2000, 0.995);
Mat query_corners = new Mat(4, 1, CvType.CV_32FC2);
Mat idx_corners = new Mat(4, 1, CvType.CV_32FC2);

query_corners.put(0, 0, new double[]{0, 0});
query_corners.put(1, 0, new double[]{queryImage.cols() - 1, 0});
query_corners.put(2, 0, new double[]{queryImage.cols() - 1, queryImage.rows() - 1});
query_corners.put(3, 0, new double[]{0, queryImage.rows() - 1});
Core.perspectiveTransform(query_corners, idx_corners, homography);

该代码的结果给出了以下数据(原始x,y:转换后的x,y)

Corners - Top-left  = 0.0,0.0 : 163.84683227539062,167.56898498535156  
Corners - Top-right = 999.0,0.0 : 478.38623046875,169.61349487304688  
Corners - Bot-right  = 999.0,749.0 : 491.45220947265625,411.24688720703125  
Corners - Bot-left  = 0.0,749.0 : 162.11233520507812,411.5089416503906  

现在很明显,画点的图像是错误的,但选择在上面画意味着我已经确定了这一点。然而,我发现奇怪的是,这个框是查询图像的整个大小,转换为第二个图像的空间。我没想到盒子会缩小尺寸和形状,甚至看起来与第一张图片不匹配。

变换后的x,y对我来说没有任何意义。有人能解释一下吗?

图像2-部分整体-图像匹配结果:查询图像(左),目标预索引img(右)

查看图像2,其中查询是目标idx图像的一部分和整体:

Initial Flann matches: 500
After Lowe's 2nd nn ratio: 21
RANSAC inliers: 17
query image dimensions x=1000, y=750
idx   image dimensions x=1000, y=609
Corners - Top-left  = 0.0,0.0 : -1228.55224609375,-923.1514282226562
Corners - Top-right = 999.0,0.0 : 3561.064453125,-930.8649291992188
Corners - Bot-right  = 999.0,749.0 : 2768.0224609375,1934.417236328125
Corners - Bot-left  = 0.0,749.0 : -699.1375732421875,2089.652587890625

再说一遍,这对我来说毫无意义。-1228?但这两个图像只有1000个,查询完全包含在目标idx图像中。

最后一张图片显示了这件事的挫败感。图3-整体在这里,我们可以看到经过透视变换的角点离得很远——它实际上比匹配的图像小……看起来透视变换函数返回的结果几乎是随机的。

有人能认出我做错了什么吗?我是否误解了视角转换?

感谢Micka。。。透视变换()中问题的答案是因为查询和预索引的图像点在函数调用中交换了。以下调用为匹配的图像提供正确的结果。

单应性=Calib3d.find单应性(queryMatOfPoint2f,idxMatOfPoint2f,Calib3d.RANSAC,5,mask,20000.995);

然而,单应性让一组奇怪的匹配通过,这是不应该被允许的。我将发布一个新的Q,因为透视变换现在已经解决了。

最新更新