2013-06-17 2 views
2

Использование OpenCV-2.4.5-android-sdk, Я пытаюсь совместить два изображения с обнаружением функции (детектор ORB и согласование помех). Unfortunateley, я всегда получаю исключение NullPointerException при вычислении дескрипторов. Что я делаю не так?OpenCV 2.4.5 android, FeatureDetector, DescriptorExtractor

 FeatureDetector detector = FeatureDetector.create("ORB"); 
     DescriptorExtractor descriptor = DescriptorExtractor.create("ORB"); 
     BFMatcher matcher = new BFMatcher(Hamming.normType, true); 

     KeyPoint keypoints1 = new KeyPoint(); 
     KeyPoint keypoints2 = new KeyPoint(); 
     CvMat[] descriptors = new CvMat[2]; 

     //ORB orb = new ORB(); 

     //orb.detect(image1, null, keypoints1); 
     detector.detect(image1, keypoints1, null); 
     descriptor.compute(image1, keypoints1, descriptors[0]); 

     detector.detect(image2, keypoints2, null); 
     //orb.detect(image2, null, keypoints2); 
     descriptor.compute(image2, keypoints2, descriptors[1]); 

     // matcher should include 2 different image's descriptors 
     DMatch matches = new DMatch(); 
     matcher.match(descriptors[0], descriptors[1], matches, null); 

Интересно, если у меня есть изменение, чтобы выполнить обнаружение функции с помощью openCV на Android без андроида-ndk. Предложите ли вы попытаться написать и интегрировать собственный код C++?

Update: После restructureing настройки проекта, вслед за этим: http://docs.opencv.org/trunk/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.html#dev-with-ocv-on-android описание, код выглядит следующим образом:

FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB); 
    DescriptorExtractor descriptor = DescriptorExtractor.create(DescriptorExtractor.ORB); 
    DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING); 

    MatOfKeyPoint keypoints1 = new MatOfKeyPoint(); 
    MatOfKeyPoint keypoints2 = new MatOfKeyPoint(); 
    Mat[] descriptors = new Mat[2]; 

    //ORB orb = new ORB(); 
    //orb.detect(image1, null, keypoints1); 
    detector.detect(image1, keypoints1, null); 
    descriptor.compute(image1, keypoints1, descriptors[0]); 

    detector.detect(image2, keypoints2, null); 
    //orb.detect(image2, null, keypoints2); 
    descriptor.compute(image2, keypoints2, descriptors[1]); 

    // matcher should include 2 different image's descriptors 
    MatOfDMatch matches = new MatOfDMatch(); 
    matcher.match(descriptors[0], descriptors[1], matches); 

NPE все еще происходит.

+0

Я предполагаю, что вы получите исключение при первом появлении 'descriptor.compute'. Попытайтесь иметь два экземпляра 'дескрипторы1' и' дескрипторы2' вместо CvMat []. Если это не помогает, попробуйте напечатать количество ключевых точек после 'detect.detect'. – JonesV

+0

Спасибо за ваш ответ. Вы правы, ошибка возникает при первом вызове 'desriptor.compute'. Я попытался создать два дескриптора 'дескрипторы1 'и' дескрипторы2', но затем я получил вывод LogCat: 'OpenCV Error: Bad argument (Неизвестный тип массива) в cv :: Mat cv :: cvarrToMat (const CvArr *, bool, bool, int), файл /home/saudet/projects/javacv-cppjars/opencv-2.4.5/modules/core/src/matrix.cpp, строка 698' В моем примере тестирования размер keypoints1 после 'detector.detect' составлял 31 Я не уверен, если это число ключевых точек. – Julia

+0

Вы пытались использовать 'Mat' для хранения изображений и дескрипторов вместо' CvMat'? 'CvMat' теперь устарел; вместо этого используйте вместо этого 'Мат'. Это может устранить проблему с исключением. – Alexey

ответ

1

Вы, кажется, пропустили выделение объектов в массив descriptors[].

descriptors[0] = new CvMat(); 
    descriptors[1] = new CvMat(); 
0

Выделение объектов, например.

Mat descriptortwo = new Mat(); 

, а затем удалить нулевой аргумент из необязательного параметра маски, например, так:

detector.detect(image1,keypoints1); 

Думает, что это следует сделать трюк :)

0

Попробуйте initializate thouse матрицы. Вместо того чтобы сказать Mat[] descriptors = new Mat[2];

попробовать: Mat descriptors1= new Mat(); Mat descriptors2= new Mat();

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