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

Par*_*nce 6 c++ opencv feature-detection

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

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

cv::Mat imgQuery, imgTrain;
...    
TRANSFORMATION_MATRIX = cv::findHomography(...)
...
cv::Mat imgTrainWarped;
cv::warpPerspective(imgTrain, imgTrainWarped, TRANSFORMATION_MATRIX, imgTrain.size());
Run Code Online (Sandbox Code Playgroud)

从这里开始,我不知道如何生成包含原始图像imgQuery与扭曲imgTrainWarped就可以了.我考虑两种情况:1)其中最终图像的大小是imgQuery 2的大小.其中最终图像的大小足以容纳两者,imgQuery并且imgTrainWarped因为它们仅部分地重叠,而不是完全重叠.我理解第二种情况可能在图像周围的某处有黑/空格.

Mic*_*cka 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);
Run Code Online (Sandbox Code Playgroud)

请尝试告诉我这是否正常并解决scenario 1.对于场景2,您将测试在变形之前图像的大小(通过使用变换)并将两个图像复制到足够大的目标图像.