2014-09-24 2 views
-1

Я пытаюсь выполнить обнаружение объекта с помощью OpenCV на iOS. Я использую this code sample from the documentation.OpenCV DescriptorExtractor возвращает пусто

Вот мой код:

Mat src = imread("src.jpg"); 
Mat templ = imread("logo.jpg"); 

Mat src_gray; 
cvtColor(src, src_gray, CV_BGR2GRAY); 

Mat templ_gray; 
cvtColor(templ, templ_gray, CV_BGR2GRAY); 

int minHessian = 500; 

OrbFeatureDetector detector(minHessian); 

std::vector<KeyPoint> keypoints_1, keypoints_2; 

detector.detect(src_gray, keypoints_1); 
detector.detect(templ_gray, keypoints_2); 

OrbDescriptorExtractor extractor; 

Mat descriptors_1, descriptors_2; 

extractor.compute(src_gray, keypoints_1, descriptors_1); 
extractor.compute(templ_gray, keypoints_2, descriptors_2); 

Проблема находится на линии extractor.compute(src_gray, keypoints_1, descriptors_1);, которая оставляет descriptors_1 всегда пустой.

src и templ не являются пустым.

Любые мысли?

Благодаря

+0

Является ли keypoints_1 пустым? – Dennis

+0

Да, 'keypoints_1' пуст. – Eric

+0

Тогда вы не можете рассчитать дескрипторы, и поэтому дескрипторы_1 пуст. – Dennis

ответ

0

Прежде всего, я думаю, что если вы хотите использовать детекторы функций и дескрипторы вы должны сообщить себе о том, как они работают. Вы можете видеть эту тему, ответ «Пенелопа» объясняет все лучше, чем я могу сделать: https://dsp.stackexchange.com/questions/10423/why-do-we-use-keypoint-descriptors

После первого шага, я думаю, вы должны знать лучше, как детектор ОРБА/Дескриптор работа (если и действительно хочет использовать его), каковы ее параметры и т.д. Для этого и можно проверить OpenCV документацию и ORB бумаги:

http://docs.opencv.org/modules/features2d/doc/feature_detection_and_description.html https://www.willowgarage.com/sites/default/files/orb_final.pdf

Я говорю это потому, что вы установили параметр «minHessian» на детекторе ОРБ, когда " minHessian 'на самом деле является параметром из SURF-детектора.

В любом случае проблема с вашим кодом не в этом. Попробуйте загрузить ур изображения, как, например, вы следующие:

Mat src = imread("src.jpg", CV_LOAD_IMAGE_GRAYSCALE); 
Mat templ = imread("logo.jpg", CV_LOAD_IMAGE_GRAYSCALE); 

Затем обнаружить ключевые точки:

detector.detect(src, keypoints_1); 
detector.detect(templ, keypoints_2); 

и теперь проверить, если keypoints_1 и keypoints_2 не пусты. Если они идут на удаление дескриптора! Он должен работать

Надеюсь, что это поможет

Смежные вопросы