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,

Другие вопросы по тегам