Android上面搭建 Opencv的开发环境+摄像头开启

  最近要进行图像的处理,然后还是在Android上的应用,感觉资源不够用了,

·  两种使用方式,你可以将你想要的所有的函数,全部用 JNI/NDK  的方式,这个过段时间再写,单纯的搭建 JNI/NDK的环境没什么实际的意思,第二种方式就是 将Opencv的环境搭到 Android中,其实都是差不多的,JNI最后生成 .so 文件。方式不一样 本质上面差不多。先从简单的说起。

   ok, 第一  将Opencv的环境部署到 Android 上面去。

         第二 测试环境是否成功

         第三 获得图片 1、直接Imageview获取图片 2、相机获取图片  JavaCameraView 或是  Intent 系统的照相机

一、环境的搭建

      1、 首先你得安装 Androidtudio,其次先去 opencv的网站,下载 Android版的Opencv 网址:https://opencv.org/platforms/android/

      2、新建一个AS的工程,include C++ support 随你选不选(方便以后JNI的使用),一路确定到底。然后导入依赖,

 File  ---> new ---> import Module    找到 下载好的 opencvForAndroid 的目录(区别Visual Studio 这边不需要配置环境变量)导入类似于路径 D:\OpenCVandroidsdk\sdk\java  的路径   然后在dependency中添加依赖。更改 opencvXXX 中的编译版本跟自己的Android版本一致      大概如下所示:

3、拷贝相关的 .so 文件  复制到 app 下面的 libs目录

其实你根据你设备只要复制一个   armeabi  差不多大部分的都是这个了。要是不放心全部扔进来(每次编译的时候时间较长)

4、修改gradle的脚本,直接复制 粘贴就行了    在 build.gradle(app)  中添加

         app build.gradle 里面 dependency 里面添加  { implementation project(':openCVLibrary341')   这个会自动生成   }                          implementation fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar') 全部打包成。.jar

然后在 dependency 目录下添加:

task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs'){
    destinationDir file("$buildDir/native-libs")
    baseName 'native-libs'
    from fileTree(dir: 'libs', include: '**/*.so')
    into 'lib/'
}
tasks.withType(JavaCompile){
    compileTask -> compileTask.dependsOn(nativeLibsToJar)
}

5、测试是否成功  来副灰度图像的变化  Android 下的opencv和Visual Studio 中有点小区别,基本上也差不多

在 drawable 中放置一张图片,,layout中放置一个 ImageView  

 //将彩色图像变成灰色图像
    private void convert2Grey() {
        //新建对象
        Mat src = new Mat();
        Mat temp = new Mat();
        Mat dst = new Mat();

        Bitmap image = BitmapFactory.decodeResource(this.getResources(), R.drawable.wen);
        Utils.bitmapToMat(image, src);
        Imgproc.cvtColor(src, temp, Imgproc.COLOR_RGBA2BGR);
        Log.i("dachenopencv", "image type:+" + (temp.type() == CvType.CV_8UC3));
        Imgproc.cvtColor(temp, dst, Imgproc.COLOR_BGR2GRAY);
        Utils.matToBitmap(dst, image);
        DC_ImageView_ShowImg.setImageBitmap(image);
        //release memory
        src.release();
        temp.release();
        dst.release();
    }

二、如何处理

      Drawable中的图片可以处理了,但是你要是处理大量的图片,肯定不可能放 drawable 中,每次都会进行编译,放Assets中稍微好一点,不会被编译了,但是图片再大一点就不靠谱了。养成好的编程习惯,大量图片就扔SD卡中。注意外置和内置的区别。读取图片的方法,见另外一个博客,(Android文件路径的操作)

      进行摄像头的读写,这也是必须的。

     1、调用 Android 自带的摄像头

              权限:<uses-permission android:name="android.permission.CAMERA"/>

             然后开始拍照:     //开始拍照
         private void StartCamera() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);   //拍照
          startActivityForResult(intent);     
    }

    这样子就可以打开自带的摄像头了,但是呢,感觉单纯的就是一个调试,所以建议调用 startActivityForResult(intent, FLAG_YOU_Decide);   将拍的图片的文件路径保存出来,下次操作时,读取路径就行了,别傻乎乎的在Activity Fragment中传递图片,数据量肯定很大,

    2、使用 Opencv 的摄像头

       布局文件中添加:

<org.opencv.android.JavaCameraView

android:id="@+id/DC_OpencvCameraView"

android:layout_width="400dp"

android:layout_height="400dp"

android:visibility="gone" />

  

//初始化摄像头
private void CameraInitCamera() {
    //设置为可见
    DC_OpencvCameraView.setVisibility(SurfaceView.VISIBLE);
    // 0  前置  1  后置
    DC_OpencvCameraView.setCameraIndex(0);    //  0 是前置     1 是后置
    DC_OpencvCameraView.setCvCameraViewListener(this);    //set up frame listener
    DC_OpencvCameraView.enableFpsMeter();
    DC_OpencvCameraView.enableView();
    DC_OpencvCameraView.enableFpsMeter();
    //用完就直接释放
    if (DC_OpencvCameraView != null) {
        DC_OpencvCameraView.disableView();
    }
    DC_OpencvCameraView.enableView();
}

implements  CameraBridgeViewBase.CvCameraViewListener2   监听

//Opencv Camera 的操作
@Override
public void onCameraViewStarted(int width, int height) {

}

@Override
public void onCameraViewStopped() {

}

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
    Mat frame = inputFrame.rgba();
    return frame;
}

图片就出来了,你想怎么玩就怎么玩去吧

纯属个人的学习总结,亲测可以用,不足之处,请大家不吝赐教谢谢大家。

 

 

 

  • 0
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值