Android Studio中使用JNI调用OpenCV本地代码Canny 边缘检测
来源:互联网 发布:微团购软件哪个好 编辑:程序博客网 时间:2024/06/07 02:11
Android Studio中使用JNI调用OpenCV本地代码Canny 边缘检测
1.add activity_canny.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btn_ndk" android:text="use C++ OpenCV process img"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btn_restore" android:text="restore"/> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/img"/></LinearLayout>
2.CannyActivity
public class CannyActivity extends Activity { static { System.loadLibrary("canny"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } public static native int[] cannyImg(int[] buf,int w, int h);}
3.add img process
public class CannyActivity extends Activity { private ImageView img; private Button btnNdk,btnRestore; static { System.loadLibrary("canny"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_canny); init(); } private void init() {// this.setTitle("use ndk to change img to grayscale"); btnNdk = (Button) findViewById(R.id.btn_ndk); btnNdk.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { processImg(); } }); btnRestore = (Button) findViewById(R.id.btn_restore); btnRestore.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setOriImg(); } }); img = (ImageView) findViewById(R.id.img); setOriImg(); } private void processImg() { long current = System.currentTimeMillis(); Bitmap imgBitmapProc = ((BitmapDrawable) getResources().getDrawable( R.drawable.starry_night)).getBitmap(); int w = imgBitmapProc.getWidth(); int h = imgBitmapProc.getHeight(); int [] pix = new int[w*h]; imgBitmapProc.getPixels(pix,0,w,0,0,w,h); int[] resInt = cannyImg(pix,w,h); Bitmap resImg = Bitmap.createBitmap(w,h, Bitmap.Config.RGB_565); resImg.setPixels(resInt,0,w,0,0,w,h); long performance = System.currentTimeMillis() - current; img.setImageBitmap(resImg); btnNdk.setText("w:" + String.valueOf(imgBitmapProc.getWidth() +",h:"+String.valueOf(imgBitmapProc.getHeight()) +",ndk perform time:"+String.valueOf(performance)+" millsecond")); } private void setOriImg() { Bitmap imgBit = ((BitmapDrawable) getResources().getDrawable( R.drawable.starry_night)).getBitmap(); img.setImageBitmap(imgBit); } /** * * @param buf * @param w width the current view width * @param h height the current view height */ public static native int[] cannyImg(int[] buf,int w, int h);}
4.build project
5.generate .h
6.
javah -classpath app/build/intermediates/classes/debug:
/home/gjc/Android/Sdk/platforms/android-23/android.jar:
openCVLibrary300/build/intermediates/classes/debug
-d app/src/main/jni com.gjc.androidopencv.canny.CannyActivity
7. .h file
/* * Class: com_gjc_androidopencv_canny_CannyActivity * Method: cannyImg * Signature: ([III)[I */JNIEXPORT jintArray JNICALL Java_com_gjc_androidopencv_canny_CannyActivity_cannyImg (JNIEnv *, jclass, jintArray, jint, jint);
8.cannyImg.cpp
#include <jni.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_gjc_androidopencv_canny_CannyActivity_cannyImg (JNIEnv *env, jclass clazz, jintArray buf, jint w, jint h){ jint *cbuf; cbuf = env->GetIntArrayElements(buf,JNI_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;}
9.Android.mk
LOCAL_PATH :=$(call my-dir)include $(CLEAR_VARS)OPENCV_LIB_TYPE:=STATICinclude /home/gjc/Downloads/OpenCV-android-sdk/sdk/native/jni/OpenCV.mkLOCAL_MODULE:=cannyLOCAL_SRC_FILES:=cannyImg.cppinclude $(BUILD_SHARED_LIBRARY)
10.Application.mk
APP_STL:=gnustl_static APP_CPPFLAGS:=-frtti -fexceptions APP_ABI:=armeabi armeabi-v7a
11.compile .so use ndk-build
0 0
- Android Studio中使用JNI调用OpenCV本地代码Canny 边缘检测
- 在Android中使用JNI调用Opencv本地代码 配置方式 边缘检测 范例代码
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法实现边缘检测代码(2)
- 【OpenCV】Canny 边缘检测
- opencv-canny边缘检测
- opencv canny边缘检测
- openCV Canny边缘检测
- 【openCV】Canny边缘检测
- opencv:canny边缘检测
- opencv-Canny 边缘检测
- opencv Canny边缘检测
- openCV canny边缘检测
- opencv canny边缘检测
- opencv canny边缘检测
- OpenCV Canny边缘检测
- Android opencv(三) 边缘检测Sobel、Canny
- UESTC--1264--人民币的构造(数学规律)
- C语言 指针与数组,结构体
- 装箱问题(01背包)
- 自定义View实现微信主页渐变效果
- 开启新线程实现电子广告牌
- Android Studio中使用JNI调用OpenCV本地代码Canny 边缘检测
- UESTC--1263--The Desire of Asuna(贪心)
- 在o(1)时间内删除链表中结点
- 【天蝎WG-概念篇】数据仓库之星型结构
- cocoaPods安装
- 网络爬虫
- ip routing 开启三层路由模式
- JS中数组排序
- linux下挂载U盘