扭曲透视和缝合/重叠图像(C ++)

时间:2015-08-28 08:29:46

标签: c++ opencv feature-detection

我正在检测和匹配一对图像的特征,使用典型的探测器 - 描述符 - 匹配器组合,然后findHomography来生成变换矩阵。

在此之后,我希望两个图像重叠(第二个(imgTrain)超过第一个(imgQuery),所以我使用变换矩阵扭曲第二个图像:< / p>

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

从现在开始,我不知道如何制作包含原始imgQuery并且上面有扭曲imgTrainWarped的图片。 我考虑两种情况: 1)最终图像大小为imgQuery的大小 2)最终图像的大小足以容纳imgQueryimgTrainWarped的一个,因为它们只是部分重叠,而不是完全重叠。据我所知,第二种情况可能在图像周围有黑色/空白区域。

4 个答案:

答案 0 :(得分:6)

你应该扭曲到与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,您将测试在变形之前图像的大小(通过使用变换)并将两个图像复制到足够大的目标图像。

答案 1 :(得分:1)

您是否尝试使用从不同方向从同一视点拍摄的两张重叠照片创建全景图像?如果是这样的话,我会关注第一个&#34;第二个&#34;部分。将全景图拼接在一起的正确方法是将两个图像沿着重叠部分的中心线(对称轴)向下切割,而不是将一个图像的一部分添加到(整个)另一个图像。

答案 2 :(得分:0)

可接受的答案有效,但使用BORDER_TRANSPARENT可以更轻松:

cv::warpPerspective(imgTrain, imgQuery, TRANSFORMATION_MATRIX, imgQuery.size(), INTER_LINEAR, BORDER_TRANSPARENT);

使用BORDER_TRANSPARENT时,imgQuery的源像素保持不变。

答案 3 :(得分:0)

对于OpenCV 4 INTER_LINEAR和BORDER_TRANSPARENT 可以通过使用解决 cv :: InterpolationFlags :: INTER_LINEAR,cv :: BorderTypes :: BORDER_TRANSPARENT,例如

cv::warpPerspective(imgTrain, imgQuery, TRANSFORMATION_MATRIX, imgQuery.size(), cv::InterpolationFlags::INTER_LINEAR, cv::BorderTypes::BORDER_TRANSPARENT);