如何在Android jni中使用OpenCV
程序员文章站
2024-03-21 20:59:34
...
这里仅介绍如何在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/下,就可以成功运行了。在真机上测试的时候并没有报这个错误。