Я работаю над проектом сшивания изображений, используя OpenCV 2.3.1 в Visual Studio 2010.
В настоящее время у меня есть 2 проблемы.
(Моя репутация не более 10, поэтому я могу опубликовать только 2 гиперссылки в этом сообщении. Я отправлю еще 2 в области комментариев)
Я выполнил шаги, указанные в следующей ссылке Сшивание 2 изображений в opencv
- Поиск функций SURF на обоих изображениях и их соответствие
- Удаление выбросов с помощью RANSAC
- Вычислительная гомография
- Искривление целевого изображения для опорного изображения
а приведенный ниже снимок - это результат, который у меня есть:
Два изображения снимаются с использованием камеры в том же положении, но в другом направлении (я использовал штатив).
Затем я попробовал еще один тест. На этот раз я все еще беру 2 изображения, используя одну и ту же камеру. Тем не менее, я немного переместил камеру с исходной позиции, а затем взял вторую картинку. Результат довольно ужасен, как показано:
Проблема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 Плохой результат)
В настоящее время застрял и понятия не имеет, что делать дальше. Надейтесь и оцените любую помощь. Спасибо.