简体   繁体   English

Android Studio 2.1.2中的Android openCV和NDK集成

[英]Android openCV and NDK integration in android studio 2.1.2

I'm just getting started with Android NDK and openCV in android studio. 我刚刚开始使用Android Studio中的Android NDKopenCV

I have followed all the steps (which includes importing openCV-sdk) mentioned here https://www.learn2crack.com/2016/03/setup-opencv-sdk-android-studio.html and followed basic tutorials from Github samples for openCV https://github.com/opencv/opencv/tree/master/samples/android . 我遵循了此处提到的所有步骤(包括导入openCV-sdk) https://www.learn2crack.com/2016/03/setup-opencv-sdk-android-studio.html,并遵循了来自Github示例的基本教程进行openCV https://github.com/opencv/opencv/tree/master/samples/android Where in Tutorial2 It uses jni folder for C/C++ code when I compile and run the app I am getting following below error 当我编译和运行应用程序时,在Tutorial2中它将jni文件夹用于C / C ++代码,但出现以下错误

07-27 17:55:43.407 13197-13197/com.sample.opencvtest E/AndroidRuntime: FATAL EXCEPTION: main
                                                                   Process: com.sample.opencvtest, PID: 13197
                                                                   java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.sample.opencvtest-1/base.apk"],nativeLibraryDirectories=[/data/app/com.sample.opencvtest-1/lib/arm, /data/app/com.sample.opencvtest-1/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]] couldn't find "libopenCVLibrary310.so"
                                                                       at java.lang.Runtime.loadLibrary(Runtime.java:367)
                                                                       at java.lang.System.loadLibrary(System.java:1076)
                                                                       at com.sample.opencvtest.Tutorial2$1.onManagerConnected(Tutorial2.java:54)
                                                                       at com.sample.opencvtest.Tutorial2.onResume(Tutorial2.java:121)
                                                                       at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1258)
                                                                       at android.app.Activity.performResume(Activity.java:6327)
                                                                       at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3092)
                                                                       at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)
                                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
                                                                       at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                       at android.os.Looper.loop(Looper.java:148)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

The error occur at statement 错误发生在语句

// Load native library after(!) OpenCV initialization
System.loadLibrary("openCVLibrary310"); // Confusing part here what should be pointed here in place of "openCVLibrary"

Below is MainActivity code 以下是MainActivity代码

public class Tutorial2 extends Activity implements CameraBridgeViewBase.CvCameraViewListener2
{
    private static final String TAG = "OCVSample::Activity";

    private static final int VIEW_MODE_RGBA = 0;
    private static final int VIEW_MODE_GRAY = 1;
    private static final int VIEW_MODE_CANNY = 2;
    private static final int VIEW_MODE_FEATURES = 5;

    private int mViewMode;
    private Mat mRgba;
    private Mat mIntermediateMat;
    private Mat mGray;

    private MenuItem mItemPreviewRGBA;
    private MenuItem mItemPreviewGray;
    private MenuItem mItemPreviewCanny;
    private MenuItem mItemPreviewFeatures;

    private CameraBridgeViewBase mOpenCvCameraView;

    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this)
    {
        @Override
        public void onManagerConnected(int status)
        {
            switch (status)
            {
                case LoaderCallbackInterface.SUCCESS:
                {
                    Log.i(TAG, "OpenCV loaded successfully");

                    // Load native library after(!) OpenCV initialization
                    System.loadLibrary("openCVLibrary310");

                    mOpenCvCameraView.enableView();
                }
                break;
                default:
                {
                    super.onManagerConnected(status);
                }
                break;
            }
        }
    };

    public Tutorial2()
    {
        Log.i(TAG, "Instantiated new " + this.getClass());
    }

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        Log.i(TAG, "called onCreate");
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        setContentView(R.layout.tutorial2_surface_view);

        mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial2_activity_surface_view);
        mOpenCvCameraView.setVisibility(CameraBridgeViewBase.VISIBLE);
        mOpenCvCameraView.setCvCameraViewListener(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        Log.i(TAG, "called onCreateOptionsMenu");
        mItemPreviewRGBA = menu.add("Preview RGBA");
        mItemPreviewGray = menu.add("Preview GRAY");
        mItemPreviewCanny = menu.add("Canny");
        mItemPreviewFeatures = menu.add("Find features");
        return true;
    }

    @Override
    public void onPause()
    {
        super.onPause();
        if (mOpenCvCameraView != null)
            mOpenCvCameraView.disableView();
    }

    @Override
    public void onResume()
    {
        super.onResume();
        if (!OpenCVLoader.initDebug())
        {
            Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
        }
        else
        {
            Log.d(TAG, "OpenCV library found inside package. Using it!");
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }
    }

    public void onDestroy()
    {
        super.onDestroy();
        if (mOpenCvCameraView != null)
            mOpenCvCameraView.disableView();
    }

    public void onCameraViewStarted(int width, int height)
    {
        mRgba = new Mat(height, width, CvType.CV_8UC4);
        mIntermediateMat = new Mat(height, width, CvType.CV_8UC4);
        mGray = new Mat(height, width, CvType.CV_8UC1);
    }

    public void onCameraViewStopped()
    {
        mRgba.release();
        mGray.release();
        mIntermediateMat.release();
    }

    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame)
    {
        final int viewMode = mViewMode;
        switch (viewMode)
        {
            case VIEW_MODE_GRAY:
                // input frame has gray scale format
                Imgproc.cvtColor(inputFrame.gray(), mRgba, Imgproc.COLOR_GRAY2RGBA, 4);
                break;
            case VIEW_MODE_RGBA:
                // input frame has RBGA format
                mRgba = inputFrame.rgba();
                break;
            case VIEW_MODE_CANNY:
                // input frame has gray scale format
                mRgba = inputFrame.rgba();
                Imgproc.Canny(inputFrame.gray(), mIntermediateMat, 80, 100);
                Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2RGBA, 4);
                break;
            case VIEW_MODE_FEATURES:
                // input frame has RGBA format
                mRgba = inputFrame.rgba();
                mGray = inputFrame.gray();
                FindFeatures(mGray.getNativeObjAddr(), mRgba.getNativeObjAddr());
                break;
        }

        return mRgba;
    }

    public boolean onOptionsItemSelected(MenuItem item)
    {
        Log.i(TAG, "called onOptionsItemSelected; selected item: " + item);

        if (item == mItemPreviewRGBA)
        {
            mViewMode = VIEW_MODE_RGBA;
        }
        else if (item == mItemPreviewGray)
        {
            mViewMode = VIEW_MODE_GRAY;
        }
        else if (item == mItemPreviewCanny)
        {
            mViewMode = VIEW_MODE_CANNY;
        }
        else if (item == mItemPreviewFeatures)
        {
            mViewMode = VIEW_MODE_FEATURES;
        }

        return true;
    }

    public native void FindFeatures(long matAddrGr, long matAddrRgba);
}

I have added jniLibs folder under app--> src--> main and copy armeabi-v7a and x86_64 folders from openCV-SDK-->native-->libs . 我在jniLibs app--> src--> main下添加了jniLibs文件夹,并从openCV-SDK-->native-->libs armeabi-v7a app--> src--> main armeabi-v7a openCV-SDK-->native-->libs复制armeabi-v7ax86_64文件夹。 Also added jni folder under app--> src--> main and have three files Android.mk, Application.mk and jni_part.cpp 还在Android.mk, Application.mk and jni_part.cpp app--> src--> main下添加了jni文件夹,并具有三个文件Android.mk, Application.mk and jni_part.cpp

jni_part.cpp code jni_part.cpp代码

#include <jni.h>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/features2d.hpp>
#include <vector>

using namespace std;
using namespace cv;

extern "C" {
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_FindFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba);

JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_FindFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba)
{
    Mat& mGr  = *(Mat*)addrGray;
    Mat& mRgb = *(Mat*)addrRgba;
    vector<KeyPoint> v;

    Ptr<FeatureDetector> detector = FastFeatureDetector::create(50);
    detector->detect(mGr, v);
    for( unsigned int i = 0; i < v.size(); i++ )
    {
        const KeyPoint& kp = v[i];
        circle(mRgb, Point(kp.pt.x, kp.pt.y), 10, Scalar(255,0,0,255));
    }
}
}

I am stuck here. 我被困在这里。 Any type of help would be appreciated 任何类型的帮助将不胜感激

its beacause android is looking for "libopenCVLibrary310.so" in your /jniLibs folder and cannot find it. 它的原因是android在/ jniLibs文件夹中寻找“ libopenCVLibrary310.so”,但找不到它。

you should check your Android.mk file and android build.gradle file where you have mentioned 您应该检查您提到的Android.mk文件和android build.gradle文件

if you want to check opencv is succesfully integrated or not the you can try 如果您想检查opencv是否成功集成,可以尝试

System.loadLibrary("libopencv_java3"); System.loadLibrary(“ libopencv_java3”);

if you still get error then you have integrated opencv wrong. 如果仍然出现错误,则说明集成了opencv错误。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM