Opencv: хорошие совпадения точек, но неправильная омография

Я пытаюсь извлечь матрицу гомографии между двумя изображениями. Исходное плоское изображение и другое изображение, содержащее первое. Я следую инструкциям в этом руководстве https://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_feature2d/py_feature_homography/py_feature_homography.html#feature-homography.

Найденные совпадения выглядят великолепно, но при рисовании прямоугольника, содержащего изображение, он выглядит неправильно, потому что он не содержит изображения... но одна из границ в порядке... Так что же происходит? Является ли матрица гомографии неправильной или это просто проблема визуализации?

Плохая ограничивающая рамка

Мой кусок кода выглядит так:

M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0)
matchesMask = mask.ravel().tolist()

h,w = self.poster_original.shape
pts = np.float32([ [0,0],[w-1,h-1],[w-1,0],[0,h-1]]).reshape(-1,1,2)
dst = cv2.perspectiveTransform(pts,M)
self.undistorted_camera_image= cv2.polylines(self.undistorted_camera_image,[np.int32(dst)],True,255,3, cv2.LINE_AA)

РЕДАКТИРОВАТЬ: изменение порядка углов на:

pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2)

Я получаю такие вещи, как:

bb2

bb3

Это выглядит немного иначе, но все же не то, что я ожидал.


person Josep Bosch    schedule 23.12.2013    source источник
comment
Что вы имеете в виду под этим неправильно?   -  person Hannes Ovrén    schedule 24.12.2013
comment
Я ожидаю, что ограничивающая рамка вокруг изображения...   -  person Josep Bosch    schedule 24.12.2013
comment
Не уверен, о какой ограничивающей рамке вы говорите.   -  person Hannes Ovrén    schedule 24.12.2013
comment
Белые линии на правом изображении. Они предназначены для того, чтобы быть границами изображения   -  person Josep Bosch    schedule 24.12.2013
comment
У меня та же проблема. Проблема исправлена?   -  person lilouch    schedule 10.07.2014
comment
проверьте мой ответ ниже.   -  person Josep Bosch    schedule 11.07.2014


Ответы (2)


Когда вы определяете поле размытия, вы указываете эти углы

pts = np.float32([ [0,0],[w-1,h-1],[w-1,0],[0,h-1]]).reshape(-1,1,2)

но в примере используется

pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2)

У них получится квадрат (левый верхний -> левый нижний -> правый нижний -> правый верхний), у вас получится что-то другое (левый верхний -> правый нижний -> правый верхний -> левый нижний). ).

person Hannes Ovrén    schedule 23.12.2013
comment
Верно. У вас есть точка зрения, но она еще не решена ... Я обновил вопрос. Спасибо! - person Josep Bosch; 24.12.2013

Если я не ошибаюсь, гомография правильная: два угла и выравнивание линий совершенно правильное.

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

Это объясняет, почему на других изображениях, где вы можете видеть весь плакат, я могу идеально нарисовать границы плаката.

Пожалуйста, поправьте меня, если я ошибаюсь

person Josep Bosch    schedule 10.07.2014
comment
вы можете попробовать это, покрасив/преобразовав не всю коробку, а например. центр коробки или половина коробки или сетка по всей коробке. - person Micka; 09.12.2014