android - 使用 SIFT/SURF 进行特征提取 在 android 上使用 opencv 使用 Android Studio

标签 android opencv native sift surf

我正在使用 android studio 在 android 上使用 opencv 开发特征提取/匹配应用程序。我关注了 these steps使用 native 代码以使用 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)。

提前致谢。

最佳答案

您正在使用 BaseLoaderCallback 方法,但缺少 OPENCV 初始化。

在您的 onCreate 中包含以下代码行然后您将能够访问 OPENCV 代码。

OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);

关于android - 使用 SIFT/SURF 进行特征提取 在 android 上使用 opencv 使用 Android Studio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28651923/

相关文章:

javascript - flutter : execute JavaScript library in native machine (android | IOS) not in webView

java - 在 Android map 应用程序中更改 map 类型

android - 在单选组中选择了两个单选按钮

android - 在 Android 中将符号转换为 HTML 实体代码

c++ - 在 C++ 解释器中动态分配变量的最佳方法

java - GWT 在编译时无法从 "User Module"找到* native 方法*

c++ - 眼动追踪,需要注视追踪方法

matlab - 不裁剪的图像重映射

c++ - 使用规范化函数/opencv 和 c++ 获取内存分配错误

android - 我为什么要使用 ActionbarSherlock?