我正在使用Android工作室在Android上使用opencv进行功能提取/匹配应用程序..我跟着these steps使用本机代码以使用SIFT或SURF算法..我已经复制了文件夹(armeabi,armeabi-v7a,...等)到jniLibs文件夹,这里是我的主要方法的代码
public class MainActivity extends Activity implements CvCameraViewListener2{
private Mat mRgba;
private Mat mGrayMat;
private CameraBridgeViewBase mOpenCvCameraView;
Mat descriptors ;
List<Mat> descriptorsList;
FeatureDetector featureDetector;
MatOfKeyPoint keyPoints;
DescriptorExtractor descriptorExtractor;
DescriptorMatcher descriptorMatcher;
boolean mIsJavaCamera = true;
static {System.loadLibrary("opencv_java");}
////////////////////////////////////////////////////////////////
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
//Log.i(TAG, "OpenCV loaded successfully");
mOpenCvCameraView.enableView();
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
@Override
public void onCameraViewStarted(int width, int height) {
mRgba = new Mat();
mGrayMat = new Mat();
featureDetector=FeatureDetector.create(FeatureDetector.SIFT);
descriptorExtractor=DescriptorExtractor.create(DescriptorExtractor.SURF);
descriptorMatcher=DescriptorMatcher.create(6);
keyPoints = new MatOfKeyPoint();
descriptors = new Mat();
}
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
final Mat rgba = inputFrame.rgba();
Imgproc.cvtColor(rgba, rgba, Imgproc.COLOR_RGBA2GRAY);
featureDetector.detect(rgba, keyPoints);
Features2d.drawKeypoints(rgba, keyPoints, rgba);
return rgba;
}
当我编译并运行应用程序时,它运行不到一秒钟然后崩溃。 你的推荐是什么? (我使用Android Studio 1.1而不是Eclipse)。
提前感谢。
答案 0 :(得分:1)
您正在使用BaseLoaderCallback方法,但您缺少OPENCV初始化。
在onCreate中包含以下代码行然后您将能够访问OPENCV代码。
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
答案 1 :(得分:0)
从我那里得到一个有根据的猜测:你确定SIFT和SURF实现被编译到你正在使用的库中吗?它们的探测器/描述符受到专利保护,因此包括在“非自由”中。 OpenCV的一部分。其他检测/描述方法工作正常的事实似乎支持这一点。 See here for more info.