Некоторые проблемы сшивки изображений - гомография?

Я работаю над проектом сшивания изображений, используя OpenCV 2.3.1 в Visual Studio 2010.

В настоящее время у меня есть 2 проблемы.

(Моя репутация не более 10, поэтому я могу опубликовать только 2 гиперссылки в этом сообщении. Я отправлю еще 2 в области комментариев)

Я выполнил шаги, указанные в следующей ссылке Сшивание 2 изображений в opencv

  • Поиск функций SURF на обоих изображениях и их соответствие
  • Удаление выбросов с помощью RANSAC
  • Вычислительная гомография
  • Искривление целевого изображения для опорного изображения

а приведенный ниже снимок - это результат, который у меня есть:

Два изображения снимаются с использованием камеры в том же положении, но в другом направлении (я использовал штатив).

enter image description here

Затем я попробовал еще один тест. На этот раз я все еще беру 2 изображения, используя одну и ту же камеру. Тем не менее, я немного переместил камеру с исходной позиции, а затем взял вторую картинку. Результат довольно ужасен, как показано:

enter image description here

Проблема1: ** Означает ли это, что ** если две камеры находятся в разных положениях, стандартная техника сшивания панорамы (основанная на гомографии или вращательной модели камеры) не будет работать?

Я попытался сшить изображения, сделанные на разных позициях, потому что в будущем я хотел бы реализовать алгоритм сшивания на двух камерах в разных положениях, чтобы расширить FOV, вроде как: (я выложу картинку в комментарии, PLZ проверить Widen FOV)

но теперь похоже, что я ошибаюсь: (.


Я только выяснил, что во время алгоритма поиск и сопоставление функций занимает большую часть времени.

Проблема 2: Могу ли я просто вычислить функции в определенной части (область перекрытия) из двух изображений и все еще выполнять трансформацию с использованием гомографии? т.е. НЕ для вычисления всего изображения.

Я так думаю, потому что, по-моему, нет необходимости вычислять функции во всем изображении, если я определяю количество области перекрытия между двумя изображениями. Если я могу просто вычислить и сопоставить функции в области перекрытия, это должно значительно увеличить скорость.

Первый приведенный ниже код - это исходный код, который вычисляет функции во всех изображениях.

    int minHessian = 3000;

    SurfFeatureDetector detector( minHessian );
    vector<KeyPoint> keypoints_1, keypoints_2;

    detector.detect( frm1, keypoints_1 );
    detector.detect( frm2, keypoints_2 );

    //-- Calculate descriptors (feature vectors)  
    SurfDescriptorExtractor extractor; ///

    Mat descriptors_1, descriptors_2;

    extractor.compute( frm1, keypoints_1, descriptors_1 );
    extractor.compute( frm2, keypoints_2, descriptors_2 );

Я сделал следующее, чтобы уменьшить время, необходимое для запуска всего алгоритма:

    //detector.detect( frm1(Rect(0.5*frm1.cols,0,0.5*frm1.cols,frm1.rows)), keypoints_1 );
    //detector.detect( frm2(Rect(0,0,0.6*frm2.cols,frm2.rows)), keypoints_2 );

    //-- Calculate descriptors (feature vectors)
    SurfDescriptorExtractor extractor; ///

    Mat descriptors_1, descriptors_2;

    extractor.compute( frm1(Rect(0.5*frm1.cols,0,0.5*frm1.cols,frm1.rows)), keypoints_1, descriptors_1 );
    extractor.compute( frm2(Rect(0,0,0.6*frm2.cols,frm2.rows)), keypoints_2, descriptors_2 );

Используя приведенный выше код, время вычисления значительно уменьшается, давая плохой результат: (Я опубликую изображение в комментарии, plz check Плохой результат)

В настоящее время застрял и понятия не имеет, что делать дальше. Надейтесь и оцените любую помощь. Спасибо.

Ответ 1

Проблема 1: Я не могу быть уверен, но проблема с шитьем, похоже, связана с переводом камеры между двумя картинками. Только с глобальным преобразованием гомографии, вы не можете полностью наложить 2 изображения. Гомографии достаточно только в следующих двух случаях:

  • Камера подвергается чистому вращению (без перевода)
  • Камера подвергается общему движению, но сцена плоская.

Тем не менее, ваша сцена довольно плоская (объекты довольно далеки по сравнению с переводом камеры), если не для бутылки. Таким образом, приближение по гомографии может быть достаточным. Вам просто нужно правильно смешать изображения. Для этого вам сначала нужно найти место для "вырезания" изображений, где минимальная разница между двумя изображениями и смешение (например, лапласиан). Для вашей проблемы с камерами, установленными на верхней части автомобиля, это приближение может по-прежнему быть разумным, поэтому вы все еще можете использовать модель гомографии.

Если гомография с правильным смешиванием недостаточна, вам может потребоваться рассмотреть либо методы 3D-реконструкции, либо другие методы, которые "расслабляют" требования к гомографии. В литературе есть пара статей, посвященных параллаксу во время мозаики. Тем не менее, они значительно сложнее, чем основная гомография.

Проблема 2: Да, это можно сделать, пока вы не уверены, где это перекрытие. Однако вам необходимо убедиться, что эта перекрывающаяся область не слишком мала, или же гомография, которую вы вычисляете, может быть искажена. Проблема с вашим офисным набором данных, по-видимому, связана с трансляцией камеры, как объяснялось ранее.

Наконец, вы можете немного настроить параметры обнаружения/согласования функции SURF. Точки функции кажутся немного на низкой стороне.