2015-02-02 5 views
0

Кто-нибудь поделится своими знаниями об обнаружении функции OpenCV и извлечении фидуциальных маркеров?Фидуциальные маркеры - OpenCV - Обнаружение и соответствие функций

Я пытаюсь найти фидуциарный маркер (см. Изображение ниже) (самосозданный стиль ARTAG с использованием MS Paint) в сцене.

enter image description here

Использование функции обнаружения угла Harris, я могу адекватно найти углы изображения маркеров. Точно так же, используя обнаружение угла Харриса, я могу найти большинство углов маркера в сцене. Затем я использую SIFT для извлечения дескрипторов для изображения маркера и образа сцены. Затем я попробовал как BF, так и FLANN для соответствия функций. Тем не менее, оба алгоритма соответствия обычно совпадают с неправильными углами.

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

часть кода:

GoodFeaturesToTrackDetector harris_detector(6, 0.15, 10, 3, true); 
vector<KeyPoint> keypoints1, keypoints2; 

harris_detector.detect(im1, keypoints1); 
harris_detector.detect(im2, keypoints2); 

SiftDescriptorExtractor extractor; 

Mat descriptors1, descriptors2; 

extractor.compute(im1, keypoints1, descriptors1); 
extractor.compute(im2, keypoints2, descriptors2); 

BFMatcher matcher; 
//FlannBasedMatcher matcher; 
std::vector<DMatch> matches; 
matcher.match(descriptors1, descriptors2, matches); 
+0

Есть ли у вас пытался использовать SIFT (а не GFFT), чтобы найти ключевые точки? –

+0

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

+0

SIFT прав в том, что он делает. Ключевые точки не обязательно должны быть углы. Какие результаты вы получаете при замене GFFT на SIFT? –

ответ

1

вы можете попробовать использовать детектор ORB, который представляет собой слияние БЫСТРОГО детектора Keypoint и КОРОТКО дескриптора. это быстро и лучше, чем BRIEF дескриптор, потому что позже не вычисляет ориентацию.

  1. вы нашли пример использования ORB в образцах/CPP/tutorial_code/features2D/AKAZE_tracking или enter link description here
  2. или есть питон проект, который делает аналогичную задачу, как ваш покорный fiducial
+0

Спасибо! Я просмотрю эти – P3d0r