Opencv SIFT未定义引用问题

时间:2017-04-23 16:44:00

标签: android c++ opencv android-ndk java-native-interface

在函数keypoint_calc(cv::Mat)': FilePath/MyFirstOpenCVJNI-master/jni/first-opencvjni.cpp:35: undefined reference to cv :: xfeatures2d :: SIFT :: create(int,int,double,double,double)'

./ obj / local / arm64-v8a / objs / first-opencvjni / first-opencvjni.o:在函数sift_descriptor(cv::Mat, std::vector<cv::KeyPoint, std::allocator<cv::KeyPoint> >)': FilePath/MyFirstOpenCVJNI-master/jni/first-opencvjni.cpp:45: undefined reference to cv :: xfeatures2d :: SIFT :: create(int,int,double,double ,双)&#39;

#include <jni.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv/cv.h>
#include <opencv2/opencv.hpp>
#include <GLES2/gl2.h>
#include <android/log.h>

#include <opencv2/flann/flann.hpp>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/nonfree/nonfree.hpp"
#include "opencv2/nonfree/features2d.hpp"
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <iostream>

#define  LOG_TAG    "cpp-file"

是我的包含。

在上面提到的那些行中,我有以下代码。

cv::Ptr<cv::xfeatures2d::SIFT> feature_detector = cv::xfeatures2d::SIFT::create(200);

cv::Ptr<cv::xfeatures2d::SIFT> feature_detector = cv::xfeatures2d::SIFT::create(200);

我是JNI的菜鸟,任何帮助都会受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

链接器报告未定义的引用。您的项目( Android.mk CMakeLists.txt )应包含OpenCV库。 SIFT获得专利,因此它不是免费的预构建OpenCV Android发行版的一部分。您可以单独构建 libnonfree.so 并将其用作应用程序中的预构建共享库,也可以将SIFT编译为静态库。

详细说明可以找到herehere,但它们可能需要适应最新版本(3.2)和新NDK版本。如果您不关心最新版本,也可以下载prebuilt binaries

答案 1 :(得分:0)

经过几天的努力终于能够解决contrib模块,经过一些工作后遇到了一篇非常好的可自行解释的文章来构建带有Extra模块的opencv。相同的链接是here

如果有人想使用已经构建的带有contrib额外模块的opencv master,他们可以随意使用我的repo,同样的链接是this,本文仅适用于windows ,仅仅是为了信息,因为我没有在Mac上跟进。