我正在尝试在OpenCV 3.1中使用Brief描述符用于andoid。为了实现OpenCV必须使用_contrib从源代码构建。所以我编译它没有错误,也可以看到在命令窗口中构建的BRIEF.cpp.o beeing。
因此,当我尝试使用它时,我的Android应用程序崩溃了
OpenCV错误:静态cv :: javaDescriptorExtractor * cv :: javaDescriptorExtractor :: create(int),file / home / maksim / workspace / 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;
}
在新目录中重建并使用新版本后,完全相同的错误是持久的。甚至没有&#34; --- TEST ---&#34;包含在消息中。
所以我想知道为什么我的改变没有任何效果。
我也想知道为什么文件路径是:
/home/maksim/workspace/android-pack/opencv/modules/features2d/misc/java/src/cpp/features2d_manual.hpp
这个dirctory甚至不存在于我的系统上并且谷歌搜索显示,/ home / maksim /是android上许多不同错误消息的一部分。
构建前的实际路径是:
C:\用户\ JJG-CD \桌面\ Build_Workspace \的OpenCV-3.1.0 \模块\ features2d \杂项\ java中\ SRC \ CPP \ features2d_manual.hpp
我希望有人可以向我解释问题是什么,并最终给我一个如何解决问题的提示。
答案 0 :(得分:0)
您看到的错误几乎肯定来自您链接到使用相同头文件的库。当您重新编译已更改标头的代码时,该标头更改仅对您实际编译的代码生效,而不是您已链接的库中已编译的代码。
查看您的编译行并将所有-l
选项视为可能的嫌疑人。
这也解释了不存在的目录引用:这个目录存在并且是在编译它们的任何机器上编译库本身时使用的。
如果希望标题更改在库代码中生效,则需要重新编译库本身。看看您的项目配置文件:您可能已经有make
或cmake
个选项来执行此操作。
答案 1 :(得分:0)
我已经放弃但是偶然找到了解决方案。我自己构建的库没有被使用的原因是这些库通常由opencv管理器应用程序提供。要摆脱OpenCV管理器并使用我自己的库,我只需要静态初始化OpenCV。
static {
if (!OpenCVLoader.initDebug()) {
// Handle initialization error}
}
可以找到更多详细信息here