Opencv 图像拼接混合(Multiband blending)

Posted

技术标签:

【中文标题】Opencv 图像拼接混合(Multiband blending)【英文标题】:Opencv Image stitching blending (Multiband blending) 【发布时间】:2017-08-31 13:45:12 【问题描述】:

我正在尝试使用 cv::detail::MultiBandBlender 中的 cv::detail::MultiBandBlender 中的 OpenCV 3.2 中的搅拌器将我刚刚缝合在一起的图像中的接缝混合在一起,这些接缝位于 #include "opencv2/stitching/detail/blenders.hpp" 中。我能找到的文档不多,编码示例更少,但我设法找到了一个很好的博客来帮助解释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时出现错误

顺便说一句;在为搅拌机制作蒙版时,蒙版应该是整个图像还是只是在缝合过程中相互重叠的图像区域?

提前感谢您的帮助

编辑

我有它的工作,但现在得到这个结果混合成像。 这是未经混合的拼接图像以供参考。 关于如何改进的任何想法?

【问题讨论】:

我认为blender.prepare应该在blender.feed之前 @api55 这让它滚动,除了生成的混合图像只是一个灰色图像。有什么建议吗? 我看到你让它工作了。它们现在看起来相当不错:) 我认为您可以做一些直方图均衡以使其颜色更均匀?或其他一些方法.... 看看类似于***.com/questions/22315904/…的线性交叉混合 还可以看看 Stitcher 的实现以及它是如何使用搅拌机的。 【参考方案1】:
    在 blender.feed 之前使用 blender.prepare 重新设计你的面具(一半 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);

【讨论】:

以上是关于Opencv 图像拼接混合(Multiband blending)的主要内容,如果未能解决你的问题,请参考以下文章

使用opencv复制/混合不同大小的图像

opencv学习-图像混合

opencv怎么采集yuy2图像

OpenCV 例程 300篇255.OpenCV 实现图像拼接

OpenCV 例程 300篇255.OpenCV 实现图像拼接

OpenCV图像处理--常用图像拼接方法