我正在尝试使用cv::detail::MultiBandBlender中的#include "opencv2/stitching/detail/blenders.hpp"中的OpenCV 3.2中的搅拌器将刚刚缝合在一起的图像中的接缝融合在一起。我可以找到的文档很多,而编码示例更少,但是我设法找到了一个不错的博客来帮助解释here的步骤。

当我运行代码时,我得到以下error:/opencv/modules/core/src/copy.cpp:1176: error: (-215) top >= 0 && bottom >= 0 && left >= 0 && right >= 0 in function copyMakeBorder
这是用于混合的代码(假设找到的针迹,warpPerspective和单应性正确)

//Mask of iamge to be combined so you can get resulting mask
Mat mask1(image1.size(), CV_8UC1, Scalar::all(255));
Mat mask2(image2.size(), CV_8UC1, Scalar::all(255));
Mat image1Updated, image2Updated;
//Warp the masks and the images to their new posistions so their are of all the same  size to be overlayed and blended
warpPerspective(image1, image1Updated, (translation*homography), result.size(), INTER_LINEAR, BORDER_CONSTANT,(0));
warpPerspective(image2, image2Updated, translation, result.size(), INTER_LINEAR, BORDER_TRANSPARENT,   (0));
warpPerspective(mask1, mask1, (translation*homography), result.size(), INTER_LINEAR, BORDER_CONSTANT,(0));
warpPerspective(mask2, mask2, translation, result.size(), INTER_LINEAR, BORDER_TRANSPARENT,   (0));

//create blender
detail::MultiBandBlender blender(false, 5);
//feed images and the mask areas to blend
blender.feed(image1Updated, mask1, Point2f (0,0));
blender.feed(image2Updated, mask2, Point2f (0,0));
//prepare resulting size of image
blender.prepare(Rect(0, 0, result.size().width, result.size().height));
Mat result_s, result_mask;
//blend
blender.blend(result_s, result_mask);

当我尝试做blender.feed时发生错误

附带一点说明;为搅拌器制作 mask 时, mask 应该是整个图像,还是只是针迹期间图像彼此重叠的区域?

感谢您的任何帮助

编辑

我有它的工作,但现在得到的结果混合成像。
c++ - Opencv图像拼接融合(多波段融合)-LMLPHP
这是未融合的拼接图像,仅供引用。 c++ - Opencv图像拼接融合(多波段融合)-LMLPHP
关于如何改进的任何想法?

最佳答案

  • 在blender.feed之前使用blender.prepare
  • 重新设计您的 mask (半个255半0)
  • //Mask of the image to be combined so you can get resulting mask
    Mat mask1, mask2;
    mask1 = optimalSeamMask(energy, path);
    mask2 = ones(mask1.rows, mask1.cols)*255-mask1
    
    Mat image1Updated, image2Updated;
    //Warp the masks and the images to their new posistions so their are of all the same  size to be overlayed and blended
    warpPerspective(image1, image1Updated, (translation*homography), result.size(), INTER_LINEAR, BORDER_CONSTANT,(0));
    warpPerspective(image2, image2Updated, translation, result.size(), INTER_LINEAR, BORDER_TRANSPARENT,   (0));
    warpPerspective(mask1, mask1, (translation*homography), result.size(), INTER_LINEAR, BORDER_CONSTANT,(0));
    warpPerspective(mask2, mask2, translation, result.size(), INTER_LINEAR, BORDER_TRANSPARENT,   (0));
    
    //create blender
    detail::MultiBandBlender blender(false, 5);
    //feed images and the mask areas to blend
    blender.prepare(Rect(0, 0, result.size().width, result.size().height));
    blender.feed(image1Updated, mask1, Point2f (0,0));
    blender.feed(image2Updated, mask2, Point2f (0,0));
    //prepare resulting size of image
    Mat result_s, result_mask;
    //blend
    blender.blend(result_s, result_mask);
    

    关于c++ - Opencv图像拼接融合(多波段融合),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45983034/

    10-13 07:05