如何在Android jni中使用OpenCV

这里仅介绍如何在jni中调用opencv,不涉及java层。

一、下载opencv for android

点击下载地址,下载合适的版本, 注意是选择android pack。

下载之后解压,放在合适的地方,我放在


二、环境配置

首先是在Android.mk中添加如下语句:

#OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on

这两句是在编译的时候自动把opencv的依赖库拷贝到libs路径下。

然后我们以动态链接的方式加载opencv库:

OPENCV_LIB_TYPE :=SHARED

最后include opencv的mk:

include $(LOCAL_PATH)/../../../OpenCV-android-sdk/sdk/native/jni/OpenCV.mk

这里的路径和你放置opencv sdk的路径有关。

全部内容如下:


最后在Application.mk中加入如下语句,防止android不支持c的exception。

APP_CPPFLAGS := -fexceptions -frtti

三、测试

下面写一点简单的代码测试一下是否可以调用opencv 的API。

#include <opencv2/opencv.hpp>
#include "test.h"

#include <jni.h>
#include <android/log.h>

#ifndef LOG_TAG
#define LOG_TAG "JNITest"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#endif

using namespace cv;
string getString()
{
    string str = "Get string from .so file!";
    Mat img = imread("/sdcard/test.jpg", -1);
    if(img.empty())
    {
        LOGE("faild to read.");
    }
    Mat grey;
    cvtColor(img,grey,CV_RGB2GRAY);
    if(grey.empty())
    {
        LOGE("faild to convert.");
    }
    int ret = imwrite("/sdcard/grey.jpg", grey);
    LOGE("ret = %d", ret);
    return str;
}

#undef LOG_TAG

这段代码从sdcard上读取一张rgb图像,转化成灰度图并写入sdcard。

访问sdcard需要在AndroidManifest.xml中加入如下语句:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

转化前:


转化后:


另外:在android虚拟机进行测试的时候,报错找不到libopencv_java3.so,但是apk里明明已经打包了这个so库。搞不懂为什么,只好手动adb push libopencv_java3.so到/system/lib/下,就可以成功运行了。在真机上测试的时候并没有报这个错误。

猜你喜欢

转载自blog.csdn.net/heiheiya/article/details/80775242