Я пытаюсь использовать BRIEF дескриптор в OpenCV 3.1 для andoid. Чтобы добиться этого, OpenCV должен быть собран из исходного кода с _contrib. Поэтому я скомпилировал его без ошибок и также увидел, что BRIEF.cpp.o встроен в командное окно.
Поэтому, когда я пытаюсь использовать его, мое приложение для Android вылетает
Ошибка OpenCV: неверный аргумент (указанный тип экстрактора дескриптора не поддерживается.) В статическом cv :: javaDescriptorExtractor * cv :: javaDescriptorExtractor :: create (int), файл / home / maksim / рабочая область / android-pack / opencv / modules / features2d /misc/java/src/cpp/features2d_manual.hpp, строка 374
Поэтому я проверил features2d_manual.hpp. Строка 374 является выражением по умолчанию блока регистра переключателя:
CV_WRAP static javaDescriptorExtractor* create( int extractorType )
{
//String name;
if (extractorType > OPPONENTEXTRACTOR)
{
//name = "Opponent";
extractorType -= OPPONENTEXTRACTOR;
}
Ptr<DescriptorExtractor> de;
switch(extractorType)
{
//case SIFT:
// name = name + "SIFT";
// break;
//case SURF:
// name = name + "SURF";
// break;
case ORB:
de = ORB::create();
break;
//case BRIEF:
// name = name + "BRIEF";
// break;
case BRISK:
de = BRISK::create();
break;
//case FREAK:
// name = name + "FREAK";
// break;
case AKAZE:
de = AKAZE::create();
break;
default: //**this is line 374**
CV_Error( Error::StsBadArg, "Specified descriptor extractor type is not supported." );
break;
}
return new javaDescriptorExtractor(de);
Таким образом, ошибка явно возникает, потому что случай BRIEF прокомментирован. Поэтому я изменил это так:
#include "opencv2/xfeatures2d.hpp"
.
.
.
case BRIEF:
de = xfeatures2d::BriefDescriptorExtractor::create();
break;
.
.
.
default:
CV_Error( Error::StsBadArg, "---TEST--- Specified descriptor extractor type is not supported." );
break;
}
После перекомпоновки в новом каталоге и использования новой сборки, та же самая ошибка сохраняется. Даже «— ТЕСТ —» не включено в сообщение.
Поэтому мне интересно, почему мои изменения не имеют никакого эффекта.
Мне также интересно, почему путь к файлу:
/home/maksim/workspace/android-pack/opencv/modules/features2d/misc/java/src/cpp/features2d_manual.hpp
Этот каталог даже не существует в моей системе, и поиск в Google показал, что / home / maksim / является частью множества различных сообщений об ошибках на Android.
Фактический путь до строительства:
C: \ Users \ JJG-CD \ Desktop \ Build_Workspace \ OpenCV-3.1.0 \ Modules \ features2d \ разное \ Java \ SRC \ CPP \ features2d_manual.hpp
Я надеюсь, что кто-нибудь сможет объяснить мне, в чем заключается проблема, и в конечном итоге дать мне подсказку, как ее решить.
Ошибка, которую вы видите, почти наверняка происходит из библиотеки, на которую вы ссылаетесь, которая использует тот же заголовочный файл. Когда вы перекомпилируете свой код, изменив заголовок, это изменение заголовка вступает в силу только для кода, который вы на самом деле компилируете, а не для кода, который уже скомпилирован в библиотеках, которые вы также связываете.
Посмотрите на свою строку компиляции и рассмотрите все -l
варианты как возможные подозреваемые.
Это также объясняет несуществующую ссылку на каталог: этот каталог существовал и использовался в то время, когда сами библиотеки были скомпилированы на том компьютере, на котором они были скомпилированы.
Если вы хотите, чтобы изменение вашего заголовка вступило в силу в коде библиотеки, необходимо перекомпилировать саму библиотеку. Посмотрите файлы конфигурации вашего проекта: у вас, возможно, уже есть make
или же cmake
варианты сделать это.
Я уже сдался, но нашел решение случайно. Причина, по которой мои собственные встроенные библиотеки не использовались, заключалась в том, что эти библиотеки обычно предоставляются приложением opencv manager. Чтобы избавиться от менеджера OpenCV и использовать мои собственные библиотеки, мне просто нужно было статически инициализировать OpenCV.
static {
if (!OpenCVLoader.initDebug()) {
// Handle initialization error}
}
Более подробную информацию можно найти Вот