OpenCV findHomography дает бессмысленные результаты

Я делаю программу, которая отслеживает возможности с ORB из OpenCV (2.43) Я следовал этому руководству и использовал советы отсюда.

Моя цель - отследить объект в видеопотоке (лицо) и нарисовать вокруг него прямоугольник.

Моя программа находит ключевые точки и соответствует им правильно, но когда я пытаюсь использовать findHomography + perspectiveTransform чтобы найти новые углы для изображения, обычно возвращает некоторые бессмысленные значения типа (хотя иногда это возвращает правильную гомографию).

Вот пример изображения:пример

Вот соответствующая проблемная часть:

Mat H = findHomography( obj, scene, CV_RANSAC );  

//-- Get the corners from the image_1 ( the object to be "detected" )
std::vector<Point2f> obj_corners(4);
obj_corners[0] = cvPoint(0,0); obj_corners[1] = cvPoint( img_object.cols, 0 );
obj_corners[2] = cvPoint( img_object.cols, img_object.rows ); obj_corners[3] = cvPoint( 0, img_object.rows );
std::vector<Point2f> scene_corners(4);

perspectiveTransform( obj_corners, scene_corners, H);

//-- Draw lines between the corners (the mapped object in the scene - image_2 )
line( img_matches, scene_corners[0] + Point2f( img_object.cols, 0), scene_corners[1] + Point2f( img_object.cols, 0), Scalar(0, 255, 0), 4 );
line( img_matches, scene_corners[1] + Point2f( img_object.cols, 0), scene_corners[2] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );
line( img_matches, scene_corners[2] + Point2f( img_object.cols, 0), scene_corners[3] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );
line( img_matches, scene_corners[3] + Point2f( img_object.cols, 0), scene_corners[0] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );

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

PS Исходное изображение для отслеживания - это область, которая копируется с видеовхода, а затем отслеживается в новых изображениях с этого входа, имеет ли это значение?

1 ответ

Функция perspectiveTransform оценивает гомографию в предположении, что ваш соответствующий набор точек не подвержен ошибкам. Однако в реальных данных вы не можете этого допустить. Решение состоит в том, чтобы использовать надежную функцию оценки, такую ​​как RANSAC, для решения проблемы гомографии в качестве переопределенной системы уравнений.

Вы можете использовать findHomography вместо этого функция, которая возвращает гомографию. Ввод этой функции представляет собой набор точек. Этот набор требует как минимум 4 очка, но больший набор лучше. Гомография - это только оценка, но она более устойчива к ошибкам. Используя флаг CV_RANSAC, он может внутренне удалить выбросы (неправильные соответствия точек).

Другие вопросы по тегам