Sil*_* JC 10 opencv image homography
我正在使用Visual Studio 2010上的OpenCV 2.3.1进行图像拼接项目.
我目前有2个问题.
(我的声誉不超过10,所以我只能在这篇文章中发布2个超链接.我会在评论区发布另外2个)
我按照以下链接中提到的步骤 在opencv中拼接2个图像
以下图片是我目前的结果:
使用相机在相同位置但在不同方向拍摄两张图像(我使用三脚架).
然后我尝试了另一个测试.这次我仍然使用相同的相机拍摄2张图像.但是,我将相机从原来的位置移开了一点,然后拍了第二张照片.结果如下所示:
问题1:**这是否意味着**如果2个摄像机处于不同的位置,标准的全景拼接技术(基于单应性或相机旋转模型)将不起作用?
我试图缝在不同位置拍摄的图像,因为在未来,我想实现对2台相机在不同位置的拼接算法,以拓宽视野,排序是这样的:(我会发布的图片在评论, plz检查加宽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 );
Run Code Online (Sandbox Code Playgroud)
我做了以下事情,试图减少运行整个算法所需的时间:
//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 );
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,计算时间显着减少,同时给出错误的结果:(我将在评论中发布图片,plz检查错误的结果)
目前卡住了,不知道接下来该做什么.真的希望并且能够提供任何帮助.谢谢.
小智 7
问题1: 我不能确定,但拼接的问题似乎是由于两张照片之间的相机转换.只有全局单应变换,你无法完美地叠加2幅图像.Homography仅在以下2种情况下足够:
也就是说,如果不是瓶子,你的场景相当平坦(物体与相机的平移相比相当远).因此,单应性的近似可能仍然是足够的.你只需要正确地混合图像.要做到这一点,首先需要找到一个地方"剪切"两幅图像之间差异最小的图像,并应用(例如拉普拉斯)混合.对于安装在汽车顶部的摄像头的问题,这种近似可能仍然是合理的,因此您仍然可以使用单应性模型.
如果具有适当混合的单应性是不够的,您可能需要查看3D重建技术或"放松"单应性要求的其他方法.文献中有几篇论文涉及镶嵌过程中的视差.然而,这些比基本的单应性拼接复杂得多.
问题2: 是的,只要您确定重叠位置,就可以完成.但是,您需要确保此重叠区域不会太小,否则您计算的单应性可能会出现偏差.如前所述,您的办公室数据集的问题似乎是由于摄像机翻译造成的.
最后,您可能需要稍微调整SURF特征检测/匹配参数.特征点似乎略偏低.