2016-09-23 11 views
0

Я вычисляю гомографию между двумя изображениями img1 и img2 (изображения содержат в основном один плоский объект, поэтому гомография хорошо работает между ними), используя стандартные методы в OpenCV в python. А именно, я вычисляю совпадения точек между изображениями с помощью просеивания, а затем вызываю cv2.findHomography.Гомография и масштабирование изображения в opencv

Чтобы сделать вычисления быстрее я масштабироваться вниз два изображения в small1 и small2 и выполнять расчеты на этих меньших копий, так что вычислить матрицу гомография H, которая отображает small1 в small2. Однако в конце я хотел бы рассчитать матрицу гомографии, чтобы проецировать одно полноразмерное изображение img1 на другое полноразмерное изображение img2.

Я думал, что я мог бы просто преобразовать матрицу гомография H следующим образом H_full_size = A * H * A_inverse где A матрица, представляющая масштабирование от img1 к small1 и A_inverse является обратным. Однако это не работает. Если я применил cv2.warpPerspective к уменьшенному изображению small1 с H, все будет как ожидается, и результат (в основном) перекрывается с small2. Если я применил cv2.warpPerspective к полноразмерному изображению img1 с H_full_size, результат не соответствует img2.

Однако, если я проецирую точки совпадений (обнаруженные на уменьшенных изображениях) с использованием A (используя что-то вроде projected_pts = cv2.perspectiveTransform(pts, A)), а затем я вычислил H_full_size из них, все работает нормально.

Любая идея, что я могу делать неправильно здесь?

ответ

1

Как я вижу, проблема заключается в том, что гомография применяет перспективную проекцию, которая является нелинейным преобразованием (она линейна только при использовании однородных координат), которая не может быть представлена ​​как нормальная матрица преобразования. Поэтому умножение такой проекционной матрицы с некоторыми другими преобразованиями приводит к нежелательным результатам.

Вы можете попробовать умножая исходную матрицу H поэлементно с:

S = [1,1, окалины; 1,1, шкала; 1/масштаб 1/масштаб 1]

H_full_size = S * H ​​

, где масштаб, например, 2, если вы уменьшали размер исходного изображения на 2.

+0

Я пришел к тому же, хорошо «масштаба на противоположный », решение https://stackoverflow.com/a/48915151/2057762 – jns

0

Я думаю, что ваше предположение неверно в этом отрывке

H_full_size = A * H * A_inverse, где A матрица, представляющая масштабирование от img1 к small1

происходит от людей «любви» от симметрии. Из шутки ваша формула правильна после введения гипотезы, которую я собираюсь выставить. Если я начну с этого рассмотрения (это вполне эквивалентна функции CV2 CV2, warpPerspective - формула верна относительно масштабного коэффициента)

img2 = H_fullsize*img1 

вы можете получить свою собственную формулу.

small2 = B*img2 
small1 = A*img1 
small2 = H*small1 
B*img2 = H*A*img1 

что вполне эквивалентно (если В обратим)

img2 = B_inverse*H*A*img1 

и вопрос стал

H_fullsize = B_inverse*H*A 

Таким образом, вопрос стал: вы уверены, что масштаб матрицы от img1 к small1 равна матричной шкале от img2 до small2? (или, по крайней мере, они отличаются величиной постоянного масштабного коэффициента)?

Если это ваш случай, помните, что, как вы пишете, гомографические работы только между плоскими изображениями (или в случае чистого вращения). Предполагая, что у вас есть 80% точек SIFT на плоскости и 20% баллов из этой плоскости, гомеопатия считает все эти точки такими, какие они были в плоскости, и найти преобразование H, которое минимизирует ошибки (, а не идеально подходит только для 80 % точек в плоскости). также ошибки, которые очевидны в разрешении 1080p изображения может быть не столь очевидным в разрешении 320P изображения (вы не указываете сколько вы уменьшаете изображения!)

+0

благодарит вас за ответ. Да, img1 и img2 и того же размера, и они уменьшаются на один и тот же фактор - извините, я должен был сделать это более ясным в исходном сообщении. Таким образом, в ваших терминах A такое же, как B –