OpenCV MultiBandBlender не работает
Я пытаюсь смешать мои изображения в панораму с помощью 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;
}
3 ответа
Три возможные причины:
- Попробуй сохранить все
image_s
и маски в векторе, и питаются следующей структурой:
for (int i = 0; i < images_s.size(); ++i)
blender->feed(images_s[i], masks[i], corners[i]);
Не инициализировать
panoMask
перед смешением.Убедитесь, что углы хорошо определены
Привет, я получал то же самое черное панорамирование при использовании MultiBand Blender в opencv. На самом деле проблема была решена путем изменения
cv::Mat::ones(image_s.size(), CV_8UC1)
в
cv::Mat::ones(image_s.size(), CV_8UC1)*255
Это потому что Mat::ones
инициализировать все пиксели в числовое значение 1
Таким образом, нам нужно умножить это с 255
чтобы получить чистую черно-белую маску.
И, спасибо, ваш вопрос решил мою проблему:)
На самом деле, я не могу скомпилировать ваш код с OpenCV 2.4 из-за функции blender.get. В моей сборке OpenCV 2.4 такой функции нет.
В любом случае, если вы хотите сделать панораму, лучше не использовать resultRoi
функция. Тебе нужно boundingRect
, Полагаю, действительно сложно получить все горизонтально выровненные изображения для одной панорамы.
Также посмотрите мой ответ здесь. Это демонстрирует, как использовать MultiBandBlender
,