Android Studio下OpenCV及JNI开发
来源:互联网 发布:软件的license 编辑:程序博客网 时间:2024/05/16 18:45
AS下配置OpenCV环境
1.下载OpenCV4Android安装包,本实例中使用OpenCV3.1。解压后问价目录如下:
- apk:OpenCV_3.1.0_Manager_3.10安装包,Android OpenCV手机端使用
- samples:样例代码
- sdk:Android开发程序使用SDK
2.新建project,点击file->new modular,选择OpenCV-android-sdk\sdk\java目录,确认。
3.点击file->Project Structure,选择app,添加dependencies->modular dependency,选择OpenCV3.1,确认
4.最后修改openCVLibrary310下build.gradle中配置,使其与app目录下build.gradle相同。
//openCVLibrary310下build.gradle
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
minSdkVersion 15
targetSdkVersion 23
}
至此AS下OpenCV配置已经结束,使用样例中的代码进行测试,此不赘述。
OpenCV JNI配置
1.本示例中对图像进行轮廓提取,程序主体使用c++实现。
在MainActivity中添加如下函数public static native int[] ImgFun(int []buf,int w,int h);
2.使用javah生成其所对应的头文件:
3.在main目录下新建jni文件夹,将生成的头文件放入该文件夹下,向其中添加ImgFun.cpp Android.mk Application.mk文件。分别写入如下代码:
#Android.mk中添加代码:
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
OPENCV_LIB_TYPE:=STATIC
ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
# include指向自己OpenCV-android-sdk\sdk\native\jni\OpenCV.mk对应位置
include D:\download\OpenCV-3.1.0-android-sdk\OpenCV-android-sdk\sdk\native\jni\OpenCV.mk
else
include $(OPENCV_MK_PATH)
endif
LOCAL_MODULE :=ImgFun
LOCAL_SRC_FILES :=ImgFun.cpp
LOCAL_LDLIBS += -lm -llog
include $(BUILD_SHARED_LIBRARY)
# Application.mk写入代码如下:
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptionsAPP_ABI := armeabi-v7a
4.向app目录下build.gradle android{}中加入如下代码:
sourceSets.main{
jniLibs.srcDir 'src/main/libs' //set .so files directory to libs
jni.srcDirs = [] //disable automatic ndk-build call
}
// call regular ndk-build(.cmd) script from app directory
task ndkBuild(type:Exec) { commandLine 'D:\\Users\\XXX\\AppData\\Local\\Android\\sdk\\ndk-bundle\\ndk-build.cmd', '-C', file('src/main').absolutePath//windows系统下的操作;将路径替换为自己NDK所在位置;tasks.withType(JavaCompile) {compileTask -> compileTask.dependsOnndkBuild }
记得在gradle.property中加上:android.useDeprecatedNdk=true
;
并且将NDK目录加入到local.properties中:
ndk.dir=D\:\\Users\\kangdekai\\AppData\\Local\\Android\\sdk\\ndk-bundle
sdk.dir=D\:\\Users\\kangdekai\\AppData\\Local\\Android\\sdk
此时build project便可以看到生成的ImgFun.so文件(第一次竟然因为项目名称有特殊符号没有成功)
5.定义ImgFun.cpp如下:
#include "com_example_jniopencv_MainActivity.h"
#include <stdio.h>
#include <stdlib.h>
#include <opencv2/opencv.hpp>
using namespace cv;
IplImage * change4channelTo3InIplImage(IplImage * src);
extern "C" {
JNIEXPORT jintArray JNICALL Java_com_example_jniopencv_MainActivity_ImgFun
(JNIEnv *, jclass, jintArray, jint, jint);
JNIEXPORT jintArray JNICALL Java_com_example_jniopencv_MainActivity_ImgFun
(JNIEnv *env, jclass obj, jintArray buf, jint w, jint h) {
jint *cbuf;
cbuf = env->GetIntArrayElements(buf, false);
if (cbuf == NULL) {
return 0;
}
Mat myimg(h, w, CV_8UC4, (unsigned char*) cbuf);
IplImage image=IplImage(myimg);
IplImage* image3channel = change4channelTo3InIplImage(&image);
IplImage* pCannyImage=cvCreateImage(cvGetSize(image3channel),IPL_DEPTH_8U,1);
cvCanny(image3channel,pCannyImage,50,150,3);
int* outImage=newint[w*h];
for(int i=0;i<w*h;i++)
{
outImage[i]=(int)pCannyImage->imageData[i];
}
int size = w * h;
jintArray result = env->NewIntArray(size);
env->SetIntArrayRegion(result, 0, size, outImage);
env->ReleaseIntArrayElements(buf, cbuf, 0);
return result;
}
}
IplImage * change4channelTo3InIplImage(IplImage * src) {
if (src->nChannels != 4) {
return NULL;
}
IplImage * destImg = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);
for (int row =0; row < src->height; row++) {
for (int col =0; col < src->width; col++) {
CvScalar s = cvGet2D(src, row, col);
cvSet2D(destImg, row, col, s);
}
}
return destImg;
}
定义MainActivity如下:
static {
System.loadLibrary("ImgFun");
}
public static native int[] ImgFun(int []buf,int w,int h);
ImageView mIv;
Button btnNdk,btnRtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView mtv=(TextView)findViewById(R.id.tv1);
// Test mytest=new Test();
// mtv.setText(mytest.myFun());
mtv.setText("你好!");
btnNdk=(Button)findViewById(R.id.button1);
btnRtn=(Button)findViewById(R.id.button2);
btnRtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mIv=(ImageView)findViewById(R.id.iV);
Bitmap img = ((BitmapDrawable) getResources().getDrawable(R.drawable.image)).getBitmap();
mIv.setImageBitmap(img);
}
});
btnNdk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
long current = System.currentTimeMillis();
Bitmap img1 = ((BitmapDrawable) getResources().getDrawable(
R.drawable.image)).getBitmap();
int w = img1.getWidth(), h = img1.getHeight();
int[] pix = new int[w * h];
img1.getPixels(pix, 0, w, 0, 0, w, h);
int[] resultInt = ImgFun(pix, w, h);
Bitmap resultImg = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);
resultImg.setPixels(resultInt,0, w, 0, 0, w, h);
long performance = System.currentTimeMillis() - current;
mIv.setImageBitmap(resultImg);
}
});
}
6.运行程序,便可看到如下效果了~
参考博文:
1.android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
2.Android Studio 配置OpenCV、NDK,并用Jni调用OpenCV
3.在Android中使用JNI调用Opencv本地代码 配置方式 边缘检测 范例代码
4.OpenCV在Android环境下的使用方法
5.OpenCV4Android Samples
- Android Studio下OpenCV及JNI开发
- Android Studio下OpenCV及JNI开发
- Android Studio下OpenCV及JNI开发
- Android Studio下JNI开发
- Android Studio下JNI开发
- Android Studio 下进行jni开发及打包方法
- Android Studio+OpenCV+jni
- android studio下JNI开发流程
- 一步一步做Android Studio下JNI开发
- 一步一步做Android Studio下JNI开发
- Android studio 下的JNI开发
- Android studio下JNI(NDK)开发
- Android studio下JNI(NDK)开发
- Android Studio下开发JNI第一步
- Android Studio下的JNI开发教程
- Android Studio平台下JNI开发:入门使用及常见错误
- Android Studio开发JNI
- Android Studio JNI开发
- java pdf转png
- 跨站请求伪造CSRF
- sklearn中Logistics Regression的coef_和intercept_的具体意义
- web开发性能优化---SEO优化篇
- TextField的实时监听
- Android Studio下OpenCV及JNI开发
- 1613-3-傅溥衍 总结《2016年10月26日》【连续第二十六天总结】
- Android studio 配合 genymotion 安装 使用
- 利用 Android Systrace 做performance 分析
- ubuntu14.04下调整交换分区大小及优化
- Yarn shuffle OOM错误分析及解决
- Android内存泄漏分析及调试
- 动态添加布局并且设置子布局水平居中,设置边距
- HDU 1724 (simpson积分)