title: Android OpenCV环境搭建与Demo展示
tags: Opencv
date: 2020-2-02 00:53:00


最终效果

视频展示:

https://www.bilibili.com/video/av86393649/

【Android opencv】硬件工程师假期无聊硬撸安卓opencv开发

【Android opencv】优化动态修改参数UI

前言:

首先,这个项目说实话我做了两年,上学的时候很想做这个东西,由于当时能力不足,对于编程方面的知识储备也不足,而且对于未知的东西有种渴望,但是无奈心有余而力不足,导致自己的很多想法都放弃了,有些甚至夭折了。

环境配置:

Android studio版本:V3.5.2
OpenCV版本:3.4.6
接下来我将逐一给大家截图分析环境的搭建过程,后面应该还会录制一期视频来讲解。
资料下载:
工程仓库地址:
https://github.com/az666/Android-Opencv
opencv-3.4.6-android-sdk.zip
https://download.csdn.net/download/switch_love_case/12129739
SO库:libopencv_info.so (用于免Manager APP) https://download.csdn.net/download/wawayuchibang/10614343
博主APK文件: https://fir.im/ve24

备注: 下面的所有流程成立的前提是你的AndroidStudio能够正常工作!即代表你的AndroidStudio的运行环境是OK的。不然后面出现问题不好排查。



  1. 首先,在你的Android Studio能正常工作的前提下,新建一个项目,注意新版的Android Studio
    是可以直接新建C++依赖的。

  1. 注意这里要选择C++14

  1. 到这里如果编译无错,证明你的Android Studio是可以正常运行的(如果有错误,需要你自己排查下,因为版本不同,我不在讲解错误排查),可以暂停一下,由于OpenCV需要NDK和Cmake支持,这里需要配置一下,勾选下载即可。

OpenCV—JAVA库安装

  1. 接下来开始安装Opencv库支持
  2. 导入刚刚下载的opencvSDK里面的JAVA库


  3. 这个时候,等待初始化完成,不出意外地话 应该会报错:
    删除掉报错的那一行即可,因为新版的Android Studio已经不允许在First文件里声明最小版本了,删除即可。

OpenCV—JAVA库依赖

  1. 下面开始添加依赖


致此,已基本配置OK

OpenCV—免Manger APP配置

  1. 官方的Opencv Android支持是需要配合另外一个APP来实现的图像处理,这样使用起来很不友好,接下来进行移植。 按照图中文件路径,将文件夹下所有文件拷贝至 jniLibs文件夹下(如果没有自己新建一个)

人脸级联分类库移植

  1. 将下载的SDK文件夹下(G:\2019_AI_learn\opencv-3.4.6-android-sdk\OpenCV-android-sdk\sdk\etc\lbpcascades)的人脸数据拷贝至如图路径下的raw文件夹(新建一个)下即可。

最终测试代码移植与调试

MainActivity.java代码:

public class MainActivity extends AppCompatActivity implementsCameraBridgeViewBase.CvCameraViewListener2, View.OnClickListener {private CameraBridgeViewBase cameraView;private CascadeClassifier classifier;private Mat mGray;private Mat mRgba;private int mAbsoluteFaceSize = 0;private boolean isFrontCamera;// 手动装载openCV库文件,以保证手机无需安装OpenCV Manager   不加这里将导致无法初始化 级联分类器(开机闪退)static {System.loadLibrary("opencv_java3");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA}, 1);}initWindowSettings();setContentView(R.layout.activity_main);cameraView = (CameraBridgeViewBase) findViewById(R.id.camera_view);cameraView.setCvCameraViewListener(this); // 设置相机监听initClassifier();cameraView.enableView();Button switchCamera = (Button) findViewById(R.id.switch_camera);switchCamera.setOnClickListener(this); // 切换相机镜头,默认后置}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.switch_camera:cameraView.disableView();if (isFrontCamera) {cameraView.setCameraIndex(CameraBridgeViewBase.CAMERA_ID_BACK);isFrontCamera = false;} else {cameraView.setCameraIndex(CameraBridgeViewBase.CAMERA_ID_FRONT);isFrontCamera = true;}cameraView.enableView();break;default:}}// 初始化窗口设置, 包括全屏、横屏、常亮private void initWindowSettings() {getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);}// 初始化人脸级联分类器,必须先初始化private void initClassifier() {try {InputStream is = getResources().openRawResource(R.raw.lbpcascade_frontalface);File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);File cascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml");FileOutputStream os = new FileOutputStream(cascadeFile);byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = is.read(buffer)) != -1) {os.write(buffer, 0, bytesRead);}is.close();os.close();classifier = new CascadeClassifier(cascadeFile.getAbsolutePath());} catch (Exception e) {e.printStackTrace();}}@Overridepublic void onCameraViewStarted(int width, int height) {mGray = new Mat();mRgba = new Mat();}@Overridepublic void onCameraViewStopped() {mGray.release();mRgba.release();}@Override// 这里执行人脸检测的逻辑, 根据OpenCV提供的例子实现(face-detection)public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {mRgba = inputFrame.rgba();mGray = inputFrame.gray();// 翻转矩阵以适配前后置摄像头if (isFrontCamera) {Core.flip(mRgba, mRgba, 1);Core.flip(mGray, mGray, 1);} else {//如果发现后摄出现了镜像  把下面的注释打开即可  魅族不需要
//            Core.flip(mRgba, mRgba, -1);
//            Core.flip(mGray, mGray, -1);}float mRelativeFaceSize = 0.2f;if (mAbsoluteFaceSize == 0) {int height = mGray.rows();if (Math.round(height * mRelativeFaceSize) > 0) {mAbsoluteFaceSize = Math.round(height * mRelativeFaceSize);}}MatOfRect faces = new MatOfRect();if (classifier != null)classifier.detectMultiScale(mGray, faces, 1.1, 2, 2,new Size(mAbsoluteFaceSize, mAbsoluteFaceSize), new Size());Rect[] facesArray = faces.toArray();Scalar faceRectColor = new Scalar(0, 255, 0, 255);for (Rect faceRect : facesArray)Imgproc.rectangle(mRgba, faceRect.tl(), faceRect.br(), faceRectColor, 3);return mRgba;}@Overrideprotected void onPause() {super.onPause();if (cameraView != null) {cameraView.disableView();}}@Overrideprotected void onDestroy() {super.onDestroy();cameraView.disableView();}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {switch (requestCode) {case 1:if (grantResults.length > 0 &&grantResults[0] == PackageManager.PERMISSION_GRANTED) {} else {Toast.makeText(this, "权限拒绝", Toast.LENGTH_SHORT).show();}}}
}

activity_main.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><org.opencv.android.JavaCameraViewandroid:id="@+id/camera_view"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><Buttonandroid:layout_margin="10dp"android:text="'皮'"android:id="@+id/switch_camera"android:layout_width="43dp"android:layout_height="37dp"android:layout_gravity="center_vertical" />
</LinearLayout>

接下来不出意外地话,代码错误会比较少,如下:
是由于依赖库冲突导致,利用快捷键更改为Opencv即可。

修改完以后编译,直接真机调试,会出现下图错误,原因为Opencv库的版本(过低)或者与本APP版本不一致,修改一下即可

APP真机安装调试


致此,所有流程完毕。后续会有更详细的视频讲解。
物联网学习群:476840321
UP博客: http://wenzheng.club

Android OpenCV环境搭建与Demo展示相关推荐

  1. OpenCV环境搭建(一)

    OpenCV环境搭建 环境搭建为OpenCV的python(一下简称py)开发环境搭建,建立在py3的环境和语法上实现的. windows系统搭建 系统环境:windows 10 + python 3 ...

  2. Android开发环境搭建与入门Hello World

    一直没机会接触手机开发,很想开发一款手机围棋软件,今天先学习一下环境搭建与Hello World吧. 环境配置对于没入门的很麻烦,谁如果有需要留下QQ邮箱,我发给你.不客气,呵呵. 推荐一本书: Go ...

  3. 【Android入门】1、Android 入门概念、Android Studio 环境搭建并运行首个 App

    文章目录 一.Android 简介 1.1 Android 四大组件 1.2 Android 操作系统架构 1.3 Android 技术栈整体感官 二.Android Studio环境搭建并运行首个A ...

  4. 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第一章:Android开发环境搭建

    第 1 章 Android开发环境搭建 本章介绍了如何在个人电脑上搭建Android开发环境,主要包括:Android开发的发展历史是怎样的.Android Studio的开发环境是如何搭建的.如何创 ...

  5. OpenCV图像处理--Qt+OpenCV环境搭建

    LinuxQt+Opencv 环境搭建参照 LinuxQT+第三方库配置 WindowsQt+OpenCV环境搭建 一.下载opencv环境 opencv环境下载 2.Qt+OpenCV环境测试 新建 ...

  6. Android开发环境搭建及常见问题解决方法

    Android开发环境搭建及常见问题解决方法 参考文章: (1)Android开发环境搭建及常见问题解决方法 (2)https://www.cnblogs.com/rwxwsblog/p/476978 ...

  7. Android开发环境搭建全程演示(jdk+eclip+android sdk)

    Android开发环境搭建全程演示(jdk+eclip+android sdk) http://files.cnblogs.com/Bany/Android%E5%BC%80%E5%8F%91%E7% ...

  8. Android Studio环境搭建

    Android Studio环境搭建 个人博客 欢迎大家多多关注该独立博客. ###[csdn博客](http://blog.csdn.net/peace1213)  一直想把自己的经验分享出来,记得 ...

  9. Android开发环境搭建全程演示(jdk+eclipse+android sdk)

    全程演示android开发环境的搭建过程,无需配置环境变量.所有软件都是写该文章时最新版本 一 相关下载 (1) java JDK下载: 进入该网页: http://java.sun.com/java ...

  10. 【下班后学Android】Android开发环境搭建

    Android开发环境搭建方法: 方法一:百度搜索"Android开发环境搭建":http://jingyan.baidu.com/article/bea41d437a41b6b4 ...

最新文章

  1. CentOS 6.X 关闭不需要的 TTY 方法
  2. mysql route mycat_mycat
  3. C语言课后习题(25)
  4. python 等差数列list_Python3基础 list range+for 等差数列
  5. CSUOJ 1010: Water Drinking
  6. idea中创建jsp项目详细步骤
  7. opencv python 灰度化,opencv-python 图像灰度化
  8. PyQt5简易本地视频播放器
  9. zzuli oj 1077
  10. @Modifying 注解
  11. 清华大学计算机系刘景财,2017年清华大学计算机系硕士录取名单
  12. 企鹅号转正后是2级账号还有用吗,企鹅号不被系统推荐怎么办
  13. 2006年美国商业科技创新250强-----SUN公司第六!
  14. keil5的安装详解(看完必会,不会你打我)
  15. 5g通用模组是什么_5G通用模组需要做哪些温湿度可靠性测试?
  16. shoug oracle,oracle 浅谈索引
  17. caffe与Python接口的配置(VC2013 Windows CUDA7.5 Python2.7.12)
  18. 华大单片机HC32L130 / HC32L136 / HC32F030 系列硬件开发指南
  19. 音乐制作软件英文精简版-Nuendo 5 v5.1.1 WiN
  20. java trigger_Quartz教程四:Trigger

热门文章

  1. 高级面试大全【面试大全之78问-第二刊】
  2. Linux中有关用户管理命令以及相关介绍
  3. BurpSuite v2.1的使用(修改代理篇)
  4. MathType--公式使用不再烦恼
  5. Patch Match Stereo文献+代码
  6. Ubuntu18.04 LTS 卸载gnome桌面
  7. CommandNotFoundError: Your shell has not been properly configured to use ‘conda activate‘.To initi
  8. js算法的深度优先遍历和广度优先遍历
  9. 传闻建模工资月入十万是否真实
  10. Oracle三班倒分时段查询数据的一种实现方式