Давайте посмотрим на этот базовый учебник под названием Features2D + Homography для поиска известного объекта. Он использует SurfFeatureDetector для обнаружения функций:
SurfFeatureDetector detector( minHessian );
std::vector<KeyPoint> keypoints_object, keypoints_scene;
detector.detect( img_object, keypoints_object );
detector.detect( img_scene, keypoints_scene );
Тогда он использует SurfDescriptorExtractor
вычислять дескрипторы (векторы признаков), используя обнаруженные признаки.
Мои вопросы:
****прибавление****
1) В этом примере использовался алгоритм обнаружения признаков Surf. Я сделал свой собственный алгоритм (Трайкович), и он отлично работает — все углы (особенности изображения) найдены. Затем я пытаюсь использовать SurfDescriptorExtractor, как это было в примере.
Проблема в том, что SurfDescriptorExtractor не хочет использовать мои обоснованные точки правильно (полученное изображение появляется с неправильными соединениями, это означает, что экстрактор не рассчитал векторы правильно).
2) Мне нужно сделать это точно, используя opencv, в этом все дело;
3) «Детектор признаков» — это алгоритм, который пытается найти ключевые точки (элементы или углы) на изображении, «экстрактор дескрипторов» — это алгоритм, который вычисляет векторы признаков для лучшего понимания положения и направления ключевой точки;
4) В заключение, в примере все ключевые точки связаны на обоих изображениях (как вы можете видеть на последнем рисунке урока) и затем выделены прямоугольником. Но когда я использую алгоритм Трайковича, они подключены неправильно, поэтому нет выделенного прямоугольника.
Хотя мы не можем точно определить проблему, не глядя на вашу реализацию и, возможно, даже проведя некоторые исследования, я могу указать вам направление решения: исходный код OpenCV, который вы можете сравнить с их реализацией.
Посмотрите на detectAndCompute()
функция:
Обнаружение угла Харриса работает немного по-другому, как и его API:
Других решений пока нет …