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

时间:2015-02-21 22:07:37

标签: android opencv native sift surf

我正在使用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)。

提前感谢。

2 个答案:

答案 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.