我尝试使用MultiBandBlender将我的图像混合到pano中,但它会返回黑色pano。但是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;
}
答案 0 :(得分:1)
三个可能的原因:
image_s
和掩码保留在向量中,并使用以下结构提供: for (int i = 0; i < images_s.size(); ++i)
blender->feed(images_s[i], masks[i], corners[i]);
在混合之前,请勿将panoMask
初始化为<。
确保角落定义明确
答案 1 :(得分:0)
实际上,由于blender.get函数,我无法使用OpenCV 2.4编译代码。在我的OpenCV 2.4版本中没有这样的功能。
无论如何,如果你想制作全景照片,最好不要使用InternalWalk
功能。您需要resultRoi
。我想,要获得一幅全景图的所有水平对齐图像真的很难。
另外,请查看我的回答here。它演示了如何使用boundingRect
。
答案 2 :(得分:0)
嘿,我在opencv中使用MultiBand搅拌器时得到了相同的黑色pano。实际上,通过更改
解决了问题cv::Mat::ones(image_s.size(), CV_8UC1)
到
cv::Mat::ones(image_s.size(), CV_8UC1)*255
这是因为Mat::ones
将所有像素初始化为数字1
的值,因此,我们需要将其与255
进行多重处理以获得纯黑色&amp;白色面具。
谢谢,你的问题解决了我的问题:)