opencv - сшивание более 2-х изображений - PullRequest
2 голосов
/ 12 февраля 2012

Я сейчас пытаюсь совместить более двух изображений вместе в C ++ с opencv.Проблема в том, что когда я прошиваю более 2, предыдущее изображение не может быть загружено.

Например, теперь imageContainer содержит три изображения.

Первое изображение: First image

Второе изображение: Second Image

Третье изображение: Third Image

Первая итерация цикла: (Объединение первого и второго изображения) First iteration

Вторая итерация циклацикл: (объединение результата первой итерации и третьего изображения) Second iteration

Вы можете видеть, что после второй итерации изображение результата не содержит объект.(Левая сторона последнего изображения полностью черная),

В main.cpp

cv::Mat result = *imageContainer.begin();
for(vector<cv::Mat>::iterator itr = imageContainer.begin(); itr != imageContainer.end(); itr++){
    if(itr == imageContainer.begin())
        continue;
    result = applySURF(result, *itr);
}

В SURF.cpp

cv::Mat applySURF(cv::Mat object, cv::Mat image){

/* More codes here but it won't affect solving the problem */

    cv::Mat result;
    cv::warpPerspective(image, result, transformationMat, cv::Size(object.cols + image.cols, image.rows));

    cv::Mat half(result, cv::Rect(0, 0, image.cols, image.rows));
    object.copyTo(half);

    imshow("Object", object);
    imshow("Result", result);
    cvWaitKey(0);

    return result;
}

Я думаю, проблема связанав область интересов (ROI).Как я могу решить это?

Большое спасибо.

1 Ответ

2 голосов
/ 01 марта 2012

Попробуйте следующий код:)

Я проверил некоторые случаи и пришел к выводу, что если размер целевого изображения не совпадает с исходным, он перераспределяет новый мат для вставки. В вашем случае размер ROI отличается от object , он выделяет новый Mat half , и он не связан с result больше. Таким образом, ваша copyTo функция копирует объект в новую половину Mat вместо ROI result .

cv::Mat applySURF(cv::Mat object, cv::Mat image){

/* More codes here but it won't affect solving the problem */

    cv::Mat result;
    cv::warpPerspective(image, result, transformationMat, cv::Size(object.cols + image.cols, image.rows));

    cv::Mat half(result, cv::Rect(0, 0, object.cols, object.rows));
    object.copyTo(half);

    cv::imshow("Object", object);
    cv::imshow("Result", result);
    cv::WaitKey(0);

    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...