1

我尝试使用 MultiBandBlender 将我的图像混合到全景中,但它返回黑色全景。但 FeatherBlender 工作正常。我做错了什么?

blendImages(const std::vector<cv::Point> &corners, std::vector<cv::Mat> images)
{
    std::vector<cv::Size> sizes;
    for(int i = 0; i < images.size(); i++)
        sizes.push_back(images[i].size());
    float blend_strength = 5;
    cv::Size dst_sz = cv::detail::resultRoi(corners, sizes).size();
    float blend_width = sqrt(static_cast<float>(dst_sz.area())) * blend_strength / 100.f;
    cv::Ptr<cv::detail::Blender> blender = cv::detail::Blender::createDefault(cv::detail::Blender::MULTI_BAND);
    //cv::detail::FeatherBlender* fb = dynamic_cast<cv::detail::FeatherBlender*>(blender.get());
    //fb->setSharpness(1.f/blend_width);
    cv::detail::MultiBandBlender* mb = dynamic_cast<cv::detail::MultiBandBlender*>(blender.get());
    mb->setNumBands(static_cast<int>(ceil(log(blend_width)/log(2.)) - 1.));
    blender->prepare(corners, sizes);
    for(int i = 0; i < images.size(); i++)
    {
        cv::Mat image_s;
        images[i].convertTo(image_s, CV_16SC3);
        blender->feed(image_s, cv::Mat::ones(image_s.size(), CV_8UC1), corners[i]);
    }
    cv::Mat pano;
    cv::Mat panoMask = cv::Mat::ones(dst_sz, CV_8UC1);
    blender->blend(pano, panoMask);
    return pano;
}
4

3 回答 3

2

三种可能的原因:

  • 尝试将 allimage_s和 mask 保存在一个向量中,并使用以下结构进行馈送:

for (int i = 0; i < images_s.size(); ++i) blender->feed(images_s[i], masks[i], corners[i]);

  • 在混合之前不要初始化panoMask为那些。

  • 确保角落定义明确

于 2016-03-02T08:38:47.447 回答
0

嘿,我在 opencv 中使用 MultiBand 搅拌器时得到了相同的黑色全景。其实问题是通过改变解决的

cv::Mat::ones(image_s.size(), CV_8UC1)

cv::Mat::ones(image_s.size(), CV_8UC1)*255

这是因为Mat::ones将所有像素初始化为数值1,因此,我们需要将其乘以255以获得纯黑白蒙版。

而且,谢谢,你的问题解决了我的问题:)

于 2016-08-11T21:13:45.217 回答
0

实际上,由于 blender.get 功能,我无法使用 OpenCV 2.4 编译您的代码。在我构建的 OpenCV 2.4 中没有这样的功能。

无论如何,如果你想拍全景,你最好不要使用resultRoi功能。你需要boundingRect. 我想,很难为一张全景图获得所有水平对齐的图像。

另外,请在此处查看我的答案。它演示了如何使用MultiBandBlender.

于 2015-12-22T15:01:11.633 回答