android如何封装函数opencv,Android NDK层编译OpenCV代码开发详解
原标题:Android NDK层编译OpenCV代码开发详解Android NDK层编译OpenCV代码开发详解使用Android NDK开发编译OpenCV C++代码,这个在OpenCV4Android开发中会经常遇到的要求,因为OpenCV4Android SDK多数Java代码都是基于JNI调用,如果对于实时性与应用要求比较高的场合来说,多次频繁调用JNI层本身就会导致很大的资源开销,这个
原标题:Android NDK层编译OpenCV代码开发详解
Android NDK层编译OpenCV代码开发详解
使用Android NDK开发编译OpenCV C++代码,这个在OpenCV4Android开发中会经常遇到的要求,因为OpenCV4Android SDK多数Java代码都是基于JNI调用,如果对于实时性与应用要求比较高的场合来说,多次频繁调用JNI层本身就会导致很大的资源开销,这个时候就需要将全部的处理封装在C++层,在C++中调用OpenCV相关API函数,同时通过在JNI层面定义本地方法,力争做到每次处理图像,只调用JNI一次,这样就会达到比较高的运行速度与好的用户体验。下面我们就从OpenCV4Android SDK与Android NDK开发环境搭建,OpenCV C++程序实现,编译完成与运行各个环节介绍如何在Android NDK层面编译OpenCV C++代码实现JNI调用。
一:环境搭建
首先下载Android Studio与Android SDK,在Android Studio中创建一个新项目,然后参照【OpenCV学堂】之前的文章《OpenCv3.2集成Android Studio开发配置》完成OpenCV4Android开发环境搭建即可。
二:JNI接口定义
在MainActivity中添加一个native本地方法即可
publicnativevoidconvertGray(longsrcAddress,longdstAddress);三:OpenCV C++代码实现
然后在app/src下面新建一个目录jni,然后创建一个cpp源文件,把下面的代码copy到其中保存
#include
#include
#include
#include
#include
#defineLOG_TAG"MYOPENCV_TEST"
#defineLOGE(...)__android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#defineLOGW(...)__android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
#defineLOGD(...)__android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#defineLOGI(...)__android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
usingnamespacecv;
usingnamespacestd;
extern"C"{
JNIEXPORTvoidJNICALLJava_com_example_zhigang_myapplication_MainActivity_convertGray(JNIEnv*env,jobject,jlong srcAddress,jlong dstAddress)
{
Mat&src=*(Mat*)srcAddress;
Mat&dst=*(Mat*)dstAddress;
cvtColor(src,dst,COLOR_BGR2GRAY);
LOGD("Method Deion: %s","convert to gray image...");
}
}
其中com.example.zhigang.myapplication.MainActivity表示当前MainActivity完整的包路径。定义的JNI方法为convertGray,两个参数分别是源图像的地址与输出的灰度图像的地址,实现的功能是把彩色图像转换为灰度图像。
四:编译运行
上述代码要想完整的编译与运行,需要创建两个文件Android.mk与Application.mk文件,然后把下面的内容copy到Android.mk中去:
LOCAL_PATH:=$(callmy-dir)
include $(CLEAR_VARS)
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
include D:/opencv-3.3/opencv/android/install/sdk/native/jni/OpenCV.mk
LOCAL_MODULE:=gray_converter
LOCAL_SRC_FILES:=gray_mat.cpp
LOCAL_LDLIBS+=-llog-ldl
include $(BUILD_SHARED_LIBRARY)
其中include的路径是你OpenCV4Android SDK实际所在的路径,然后把下面内容copy到Application.mk中去:
APP_STL:=gnustl_static
APP_CPPFLAGS:=-frtti-fexceptions
APP_ABI:=armeabi-v7a
APP_PLATFORM:=android-14
然后对当前项目添加NDK支持,打开cmd,切换到src/jni目录,然后运行下面的命令行: /ndk-build 即可完成编译,生成的so文件copy到app/libs中去即可,然后就可以在MainActivity的onCreate方法中通过如下代码加载库文件, System.loadLibrary("gray_converter"); 然后就可以参考上面提到文章调用完成代码演示即可。代码如下:
privatevoidconvertGray(){
Matsrc=newMat();
Mattemp=newMat();
Matdst=newMat();
Bitmapimage=BitmapFactory.decodeResource(this.getResources(),R.drawable.lena);
Utils.bitmapToMat(image,src);
Imgproc.cvtColor(src,temp,Imgproc.COLOR_RGBA2BGR);
Log.i("CV","image type:"+(temp.type()==CvType.CV_8UC3));
//Imgproc.cvtColor(temp, dst, Imgproc.COLOR_BGR2GRAY);
convertGray(temp.getNativeObjAddr(),dst.getNativeObjAddr());
Utils.matToBitmap(dst,image);
ImageViewimageView=(ImageView)findViewById(R.id.image_lena);
imageView.setImageBitmap(image);
// release memory
src.release();
temp.release();
dst.release();
}
最终运行结果:

责任编辑:
更多推荐



所有评论(0)