Некоторые проблемы сшивания изображения - гомография?
Я работаю над проектом сшивания изображений с использованием OpenCV 2.3.1 в Visual Studio 2010.
У меня сейчас 2 проблемы.
(Моя репутация не превышает 10, поэтому я могу опубликовать только 2 гиперссылки в этом сообщении. Я оставлю еще 2 в области комментариев)
Я следовал за шагами, упомянутыми в следующей ссылке Сшиваем 2 изображения в opencv
Finding SURF features in both images and match them Removing outliers with RANSAC Computing Homography Warping the target image to the reference imageи изображение ниже - результат, который я имею в настоящее время:
Два изображения сделаны с помощью камерыat the same position but in different direction(Я использовал штатив).
Затем я попробовал еще один тест. На этот раз я все еще делаю 2 снимка, используя одну и ту же камеру. Однако я немного переместил камеру из исходного положения, а затем сделал второй снимок. Результат довольно ужасен, как показано:
Problem1:**Does it mean that **if the 2 cameras are at different positions, the standard panorama stitching technique (based on a homography or camera rotational model) won't work?
Я попытался сшить изображения, снятые в разных положениях, потому что в будущем я хотел бы реализовать алгоритм сшивания на 2 камерах в разных положениях, чтобы расширить поле зрения, вроде как: (я выложу картинку в комментарии, пожалуйста, проверьтеWiden FOV)
но теперь похоже, что я иду не в ту сторону :(.
Я только что узнал, что во время алгоритма поиск и сопоставление функций занимает большую часть времени.
Problem 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 );
Используя приведенный выше код, время вычислений значительно сокращается, при этом получая плохой результат: (Я выложу картинку в комментарии, пожалуйста, проверьтеBad Result)
На данный момент застрял и понятия не имею, что делать дальше. Действительно надеюсь и благодарю любую помощь. Благодарю.