我正在使用 Visual Studio 2010 上的 OpenCV 2.3.1 进行图像拼接项目。
我目前有2个问题。
(我的名气不超过10,所以我只能在这个帖子中发布2个超链接。我会在评论区再发布2个)
我按照以下链接 Stitching 2 images in opencv中提到的步骤进行操作
- 在两个图像中查找 SURF 特征并匹配它们
- 使用 RANSAC 去除异常值
- 计算单应性
- 将目标图像变形为参考图像
下图是我目前得到的结果:
使用相机在相同位置但在不同方向拍摄两张图像(我使用了三脚架)。
然后我尝试了另一个测试。这次我仍然使用同一台相机拍摄 2 张图像。然而,我将相机从原来的位置移动了一点,然后我拍了第二张照片。结果相当糟糕,如图所示:
问题1:**这是否意味着**如果两个摄像头在不同的位置,标准的全景拼接技术(基于单应性或摄像头旋转模型)将不起作用?
我尝试拼接在不同位置拍摄的图像,因为将来我想在不同位置的 2 个相机上实现拼接算法,以扩大 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)
目前卡住了,不知道下一步该做什么。真的希望并感谢任何帮助。谢谢。