我正在使用OpenCV 2.3.1和Visual Studio 2010进行图像拼接项目的开发。
目前我遇到了两个问题:
(因为我的声誉值不足10,所以我只能在此帖子中发布2个超链接。我将在评论区发布另外2个链接)
我按照以下链接中提到的步骤进行操作: Stitching 2 images in opencv
- 对两幅图像找出SURF特征点并匹配
- 利用RANSAC算法剔除离群点
- 计算单应性变换矩阵
- 将目标图像映射到参考图像上
下面的图片是我目前得到的结果:
两幅图像是由相机在同一位置但不同方向 (我使用了三脚架) 拍摄得到的。
然后我进行了另一个测试。这次我仍然使用同一台相机拍摄了两张照片。但是,我把相机从原来的位置移动了一点,然后拍摄了第二张照片。 结果相当糟糕,如下所示:
问题1:** 这是否意味着**如果两个相机处于不同的位置,标准全景图拼接技术(基于单应性变换或相机旋转模型)将无法工作?
我尝试对拍摄于不同位置的图像进行拼接,因为未来我想在不同位置使用2台相机实现拼接算法,以扩大视场范围,类似于这样:(请查看评论中的图片 Widen FOV)
但现在看起来我可能走了错误的方向 :(。
我刚刚发现,在算法过程中,特征点寻找和匹配占用了大部分时间。
问题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)
目前卡住了,不知道下一步该怎么做。非常希望能得到任何帮助和赞赏。 谢谢。