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
    评论
OpenCV是一个计算机视觉库,可以用来处理图像和视频。它提供了许多用于图像处理和计算机视觉任务的函数和工具。在提供的引用中,代码展示了如何使用OpenCV库来进行摄像头人脸检测。 首先,代码使用`cv2.VideoCapture(0)`打开本机的摄像头,然后通过循环读取每一帧图像。接下来,将图像转换为灰度图像,这有助于人脸检测算法的准确性。然后,通过调用`cv2.CascadeClassifier('haarcascade_frontalface_default.xml')`加载人脸识别文件。接着,使用`face_cascade.detectMultiScale()`函数检测图像中的人脸,并将检测到的人脸用矩形框标记出来。 在人脸检测后,代码使用`frame[y:y+h, x:x+w`来提取人脸区域。然后将人脸打码,这里的打码是通过缩小原始人脸图像的尺寸,然后将其重复放大以覆盖原始人脸区域。最后,使用`cv2.imshow()`显示图像,并使用`cv2.waitKey()`等待用户按下键盘上的 'q' 键退出程序。 总结来说,这段代码是通过OpenCV库实现了从摄像头实时采集图像,并进行人脸检测和打码的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [opencv MFC 摄像头 人脸识别](https://download.csdn.net/download/mygudou/5004145)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [小实验:python+opencv实现摄像头人脸识别、人脸马赛克](https://blog.csdn.net/aiyaya333/article/details/124399175)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值