我现在尝试使用opencv在C ++中将两个以上的图像对齐。问题是当我缝合超过2时,无法加载上一张图像。
例如,imageContainer现在包含三个图像。
第一张图片:
第二张图片:
第三张图片:
循环的第一次迭代:(组合第一个和第二个图像)
循环的第二次迭代:(组合第一次迭代的结果和第三次图像)
您可以看到在第二次迭代后,结果图像不包含该对象。 (最后一张图像的左侧全是黑色),
在main.cpp
中cv::Mat result = *imageContainer.begin();
for(vector<cv::Mat>::iterator itr = imageContainer.begin(); itr != imageContainer.end(); itr++){
if(itr == imageContainer.begin())
continue;
result = applySURF(result, *itr);
}
在SURF.cpp
cv::Mat applySURF(cv::Mat object, cv::Mat image){
/* More codes here but it won't affect solving the problem */
cv::Mat result;
cv::warpPerspective(image, result, transformationMat, cv::Size(object.cols + image.cols, image.rows));
cv::Mat half(result, cv::Rect(0, 0, image.cols, image.rows));
object.copyTo(half);
imshow("Object", object);
imshow("Result", result);
cvWaitKey(0);
return result;
}
我猜这个问题与感兴趣区域(ROI)有关。我该如何解决?
非常感谢。
答案 0 :(得分:2)
请尝试以下代码:)
我测试了一些案例并得出结论,如果目标图像的大小与源图像不同,它将重新分配要粘贴的新Mat。在您的情况下,ROI的大小与 object 不同,它会分配一个新的Mat half ,它与 result 无关 了。因此, copyTo 功能会将对象复制到 new Mat half 中,而不是 result 的ROI。
cv::Mat applySURF(cv::Mat object, cv::Mat image){
/* More codes here but it won't affect solving the problem */
cv::Mat result;
cv::warpPerspective(image, result, transformationMat, cv::Size(object.cols + image.cols, image.rows));
cv::Mat half(result, cv::Rect(0, 0, object.cols, object.rows));
object.copyTo(half);
cv::imshow("Object", object);
cv::imshow("Result", result);
cv::WaitKey(0);
return result;
}