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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 c1一下扣12分怎么办 换证体检过不了怎么办 唐山驾驶本到期换本怎么办 北京居住证变更地址了怎么办 眼睛弱视驾驶证换证不了怎么办? 驾照的分扣完了怎么办 驾照被扣了3分怎么办 交警扣了行驶证怎么办 报考驾照时手机号录错怎么办 摩托车被交警队拖走怎么办 汽车牌照被偷了怎么办 代理品牌个体工商营业证怎么办 2地交社保怎么办退休 驾驶证脱审3月怎么办 a1一次性扣12分怎么办 驾照在外地掉了怎么办 在外市考的驾照怎么办 驾照过期3个月怎么办 驾照过期6个月怎么办 b本扣分了6分怎么办 b2驾照提前换证有扣分怎么办 酒驾驾驶证被扣怎么办 驾驶证被扣了分怎么办 c1驾照扣了12分怎么办 结婚证丢了怎么办离婚手续 结婚证不见了怎么办离婚手续 科目一身份丢了怎么办 考驾照身份证过期了怎么办 酒驾发交通事故致人死亡怎么办 车保险快到期了怎么办 车保险贴掉了怎么办 小车撞凹进去了怎么办 被代位追偿了怎么办 车被别人抵押了怎么办 朋友没驾照借车怎么办 车子被朋友撞了怎么办 电车被交警扣了怎么办 e照扣了12分怎么办 驾驶证被扣33分怎么办 a2驾驶员扣33分怎么办 驾驶证被扣48分怎么办