2015-08-28 22 views
2

我正在检测并匹配一对图像的特征,使用典型的检测器 - 描述符 - 匹配器组合,然后使用findHomography生成变换矩阵。翘曲透视和针迹/重叠图像(C++)

在此之后,我想在两个图像上重叠(在第一个(imgQuery)的第二个(imgTrain),所以我使用使用变换矩阵翘曲第二图像:

cv::Mat imgQuery, imgTrain; 
...  
TRANSFORMATION_MATRIX = cv::findHomography(...) 
... 
cv::Mat imgTrainWarped; 
cv::warpPerspective(imgTrain, imgTrainWarped, TRANSFORMATION_MATRIX, imgTrain.size()); 

从 我考虑两种情况: 1)其中最后一张图像的尺寸是imgQuery的尺寸 2)最后一张图片的尺寸为imgQuery 2)一个最终图像的大小足以容纳机器人的地方h imgQueryimgTrainWarped,因为它们仅部分重叠,不完全重叠。我理解这第二种情况可能会在图像周围的某处出现黑色/空白区域。

回答

4

其后,您应该将其翘曲到与imgQuery具有相同尺寸的目标矩阵,然后遍历整个变形图像并将像素复制到第一个图像,但前提是该变形图像实际上包含扭曲像素。这很容易通过扭曲额外的面具来完成。请试试这个:

cv::Mat imgMask = cv::Mat(imgTrain.size(), CV_8UC1, cv::Scalar(255)); 
cv::Mat imgMaskWarped; 
cv::warpPerspective(imgMask , imgMaskWarped, TRANSFORMATION_MATRIX, imgQuery.size()); 

cv::Mat imgTrainWarped; 
cv::warpPerspective(imgTrain, imgTrainWarped, TRANSFORMATION_MATRIX, imgQuery.size()); 

// now copy only masked pixel: 
imgTrainWarped.copyTo(imgQuery, imgMaskWarped); 

请尝试,并告诉这是否是确定并解决scenario 1。对于场景2,您将测试在变形之前图像必须有多大(通过使用变换)并将两个图像复制到足够大的目标图像。

+0

嗯...我有点困惑。我是你写的代码,但是我得到了这个:http://j.mp/warp001。 (在这里可以看到两个匹配的图像:http://j.mp/warp002)。你怎么看? – MRHOUJOU

+0

你可以'cv :: imwrite'' imgTrainWarped'和'imgQuery'翘曲后请将它们分享给我? – Micka

+0

包装后:imgQuery是http://j.mp/imgQuery,imgMaskWarped是http://j.mp/imgMaskWarped和imgTrainWarped是http://j.mp/imgTrainWarped – MRHOUJOU

1

您是否尝试在两个重叠的图片中从不同方向的相同视角拍摄出全景图?如果是这样,我关心的是“第一个第二个”部分。将全景拼接在一起的正确方法是将两幅图像沿着重叠部分的中心线(对称轴)切割下来,而不是将一个图像的一部分添加到(整个)另一个图像。

+0

我的意思是重叠的意思,其中一个图像保持不变,而另一个被绘制“在”它。我认为,先前的步骤是否切掉第一个图像(重叠)的一部分不会影响最终结果,因此这两个过程都应该这样做。我可能会误解你... – MRHOUJOU

+0

首先,图像是如何拍摄的?如果相机并行移动,例如在水平飞行的不同时间拍摄的航拍照片,则忽视我的评论。但是,如果摄像机被放置在一个固定点,并在第一次和第二次拍摄之间旋转一点点,那么重叠部分不会在重叠部分的对称轴上完美匹配。 – Strangled