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, он может внутренне удалить выбросы (неправильные соответствия точек).