AS下配置OpenCV环境
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 23buildToolsVersion "23.0.2"defaultConfig {minSdkVersion 15targetSdkVersion 23}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
至此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) endifLOCAL_MODULE := ImgFun LOCAL_SRC_FILES := ImgFun.cpp LOCAL_LDLIBS += -lm -llog include $(BUILD_SHARED_LIBRARY)- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
4.向app目錄下build.gradle android{}中加入如下代碼:
sourceSets.main{jniLibs.srcDir 'src/main/libs' //set .so files directory to libsjni.srcDirs = [] //disable automatic ndk-build call} // call regular ndk-build(.cmd) script from app directorytask 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.dependsOn ndkBuild}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
記得在gradle.property中加上:android.useDeprecatedNdk=true;
并且將NDK目錄加入到local.properties中:
- 1
- 2
此時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=new int[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; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
定義MainActivity如下:
static {System.loadLibrary("ImgFun");}public static native int[] ImgFun(int []buf,int w,int h);ImageView mIv;Button btnNdk,btnRtn;@Overrideprotected 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() {@Overridepublic 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() {@Overridepublic 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);}});}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
6.運行程序,便可看到如下效果了~
參考博文:
1.android studio 使用 jni 編譯 opencv 完整實例 之 圖像邊緣檢測!從此在andrid中自由使用 圖像匹配、識別、檢測
2.Android Studio 配置OpenCV、NDK,并用Jni調用OpenCV
3.在Android中使用JNI調用Opencv本地代碼 配置方式 邊緣檢測 范例代碼
4.OpenCV在Android環境下的使用方法
5.OpenCV4Android Samples
總結
以上是生活随笔為你收集整理的AS下配置OpenCV环境的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 语音识别系统及科大讯飞最新实践
- 下一篇: 行人检测(Pedestrian Dete