【发布时间】:2012-06-23 11:33:30
【问题描述】:
我正在 Visual Studio 2010 上使用 OpenCV 2.3.1 进行图像拼接项目。
我目前有 2 个问题。
(我的声誉不超过10,所以我只能在这个帖子中发布2个超链接。我会在评论区发布另外2个)
我按照以下链接中提到的步骤进行操作 Stitching 2 images in opencv
- 在两张图片中查找 SURF 特征并进行匹配
- 使用 RANSAC 去除异常值
- 计算单应性
- 将目标图像变形为参考图像
而下图是我目前得到的结果:
两张图像是使用相机在相同位置但方向不同拍摄的(我使用了三脚架)。
然后我尝试了另一个测试。这次我仍然使用同一台相机拍摄 2 张图像。然而,我将相机从原来的位置移动了一点,然后我拍了第二张照片。 结果相当糟糕,如图所示:
问题1:**这是否意味着**如果两个摄像头在不同的位置,标准全景拼接技术(基于单应性或摄像头旋转模型)将不起作用?
我尝试拼接在不同位置拍摄的图像,因为将来我想在不同位置的 2 个相机上实现拼接算法,以扩大 FOV, 有点像这样:(我会在评论中发布图片,请检查加宽FOV)
但现在看来我走错路了:(。
我刚刚发现,在算法过程中,特征查找和匹配占用了大部分时间。
问题 2: 我可以只计算 2 张图像的某些部分(重叠区域)的特征,并仍然使用 Homography 执行转换吗? 即,不计算整个图像。
我这样认为是因为我认为如果我指定 2 个图像之间的重叠区域的数量,则不需要计算整个图像中的特征。如果我可以计算和匹配重叠区域的特征,它应该会大大提高速度。
下面显示的第一个代码是计算整个图像的特征的原始代码。
int minHessian = 3000;
SurfFeatureDetector detector( minHessian );
vector<KeyPoint> keypoints_1, keypoints_2;
detector.detect( frm1, keypoints_1 );
detector.detect( frm2, keypoints_2 );
//-- Calculate descriptors (feature vectors)
SurfDescriptorExtractor extractor; ///
Mat descriptors_1, descriptors_2;
extractor.compute( frm1, keypoints_1, descriptors_1 );
extractor.compute( frm2, keypoints_2, descriptors_2 );
我做了以下事情来尝试减少运行整个算法所需的时间:
//detector.detect( frm1(Rect(0.5*frm1.cols,0,0.5*frm1.cols,frm1.rows)), keypoints_1 );
//detector.detect( frm2(Rect(0,0,0.6*frm2.cols,frm2.rows)), keypoints_2 );
//-- Calculate descriptors (feature vectors)
SurfDescriptorExtractor extractor; ///
Mat descriptors_1, descriptors_2;
extractor.compute( frm1(Rect(0.5*frm1.cols,0,0.5*frm1.cols,frm1.rows)), keypoints_1, descriptors_1 );
extractor.compute( frm2(Rect(0,0,0.6*frm2.cols,frm2.rows)), keypoints_2, descriptors_2 );
使用上面的代码,计算时间显着减少,但结果不好: (我会把图片贴在评论里,请检查Bad Result)
目前卡住了,不知道下一步该做什么。真的希望并感谢任何帮助。 谢谢。
【问题讨论】:
-
您好,我刚刚更新了您添加图片的问题,看看是否正确。我觉得我把事情搞砸了。
-
是的,这就是我想做的 b4。谢谢。
标签: image opencv homography