opencv - 拼接2个以上的图像

时间:2012-02-12 16:16:17

标签: c++ image-processing opencv

我现在尝试使用opencv在C ++中将两个以上的图像对齐。问题是当我缝合超过2时,无法加载上一张图像。

例如,imageContainer现在包含三个图像。

第一张图片: First image

第二张图片: Second Image

第三张图片: Third Image

循环的第一次迭代:(组合第一个和第二个图像) First iteration

循环的第二次迭代:(组合第一次迭代的结果和第三次图像) Second iteration

您可以看到在第二次迭代后,结果图像不包含该对象。 (最后一张图像的左侧全是黑色),

在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)有关。我该如何解决?

非常感谢。

1 个答案:

答案 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;
}