Использование 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 все еще происходит.
Я предполагаю, что вы получите исключение при первом появлении 'descriptor.compute'. Попытайтесь иметь два экземпляра 'дескрипторы1' и' дескрипторы2' вместо CvMat []. Если это не помогает, попробуйте напечатать количество ключевых точек после 'detect.detect'. – JonesV
Спасибо за ваш ответ. Вы правы, ошибка возникает при первом вызове '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
Вы пытались использовать 'Mat' для хранения изображений и дескрипторов вместо' CvMat'? 'CvMat' теперь устарел; вместо этого используйте вместо этого 'Мат'. Это может устранить проблему с исключением. – Alexey