前言

上一章已经成功导入了opencv,但并没说如何展示从摄像头获取图像并展示出来,这章将简单的说说怎么展示,以及里面出现的问题作修正

一、使用opencv正常展示图像

首先准备一个空的activity页面,在其xml布局中添加JavaCameraView,这个view宽高都可以,不过,我为了在这个view下面添加功能按钮,所以给了高度限制
示例代码

  <org.opencv.android.JavaCameraViewandroid:id="@+id/cameraView"android:layout_width="@dimen/dp_300"android:layout_height="@dimen/dp_250"android:layout_gravity="center" />

添加后,在activity中对其生命周期作一下简单的绑定,我个人是写在onResume,onPause和onDestroy三个生命周期中去了
示例代码

onResume中的代码

 override fun onResume() {super.onResume(){你自己的的JavaCameraView的名字}.connectCamera(width, height)}

onResume中的代码

 override fun onResume() {super.onResume()//这里的width和height是view的宽高,方便去获取一个最佳的展示的分辨率,毕竟你不想在一个小格子里展示4k图,也不想在一个大格子里展示160x120分辨率的图 by yinjun{你自己的的JavaCameraView的名字}.connectCamera(width, height)}

onPause中的代码

 override fun onPause() {super.onPause()//临时关闭camera,别锁屏还一直录,小心烧了你那4k摄像头 by yinjun{你自己的的JavaCameraView的名字}.cameraView.releaseCamera()}

onDestroy中的代码

 override fun onDestroy() {super.onDestroy()//直接释放摄像头,页面都没了,还要摄像头干嘛?by yinjun{你自己的的JavaCameraView的名字}.cameraView.disableView()}

做完上面的操作,运行到手机上,你的opencv就可以正常展示第一个图像。。。等等,似乎有一点点不对劲?
![请添加图片描述](https://img-blog.csdnimg.cn/a472609ad9e74433aa8b3df51d640aef.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd2VpeGluXzQ3NDkxNjY4,size_20,color_FFFFFF,t_70,g_se,x_16
这个东西,为啥是歪着的?看来得作一些小小的调优

二、opencv抓取画面调优

1.错误的角度调整

首先,是吧图片给转过来,让其可以正常展示图片,JavaCameraView中有一个监听方法setCvCameraViewListener,这个监听器除了能监听当前摄像头是开启还是关闭以外,它的onCameraFrame方法所返回的mat就是javaCameraView中展示的东西,吧这个mat旋转,展示正确的图像,需要注意的地方都写注释里了

代码如下(示例):

 cameraView.setCvCameraViewListener(object : CameraBridgeViewBase.CvCameraViewListener2 {override fun onCameraViewStarted(width: Int, height: Int) {Log.e("hehe", "开始")}override fun onCameraViewStopped() {Log.e("hehe", "结束")}override fun onCameraFrame(inputFrame: CameraBridgeViewBase.CvCameraViewFrame?): Mat {var result: Mat? = null//因为里面要干的事情有点多,这个回调又相当于子线程干完活要回主线程作展示,所以这里最好加个锁 by yinjunsynchronized(this) {if (result != null) {//先把图片摆正var angle = 90//这里注意一下,如果直接旋转90度,不做其他处理会导致调用前摄像头时直接上下翻转,所以要根据当前是不是前摄像头来改旋转值by yinjunif (cameraView.getmCameraIndex() == CameraBridgeViewBase.CAMERA_ID_FRONT) {angle = 270}//记得,吧你那图像的宽高一起改一下,不改?等着看扁扁图吧 by yinjunvar size = Size(result.width().toDouble(), result.height().toDouble())Imgproc.warpAffine(result, result, Imgproc.getRotationMatrix2D(Point((result.width() / 2).toDouble(), (result.height() / 2).toDouble()), angle.toDouble(), -1.0), size)}}//这个返回的mat就是你要用来展示的图像,你可用对其作其他更改,比如变灰,加框什么的操作之后再返回,但这就是后话了return result!!}})

写到这里,肯定有人稍微有些蒙蔽,我的javaCameraView里没有getmCameraIndex啊,因为这个参在opencv哪里是一个私有的参,你需要自己去手写一个方法调取,写的也很简单,直接在javaCameraView中添加一个方法就可以了

 public int getmCameraIndex(){return mCameraIndex;}

2.如何旋转摄像头

上面的注释里写了需要吧前摄转270°,可是opencv里似乎没有直接转摄像头的方法,怎么办?自己来办,直接准备一个按钮,为其配置以下点击事件

{你的按钮的名字}.setOnClickListener {//现在是前摄,切回后摄,现在是后摄,切回前摄 by yinjunif (cameraView.getmCameraIndex() == CameraBridgeViewBase.CAMERA_ID_FRONT) {cameraView.setCameraIndex(CameraBridgeViewBase.CAMERA_ID_BACK)} else {cameraView.setCameraIndex(CameraBridgeViewBase.CAMERA_ID_FRONT)}//设定完新的摄像头下标后,就可用停用,然后重启摄像头了 by yinjuncameraView.releaseCamera();cameraView.connectCamera(width, height)}

结尾

上述操作完成后,你就可以正常使用opencv展示摄像头出现的图像了,并且自由切换前后摄像头了,opencv的mat的宽高是通过connectCamera(width, height)中传入的宽高,在你摄像头支持分辨率中找到一个最佳的分辨率,所以不需要担心我这8k摄像头的手机,会不会一直拿8k图像,读爆我的内存之类的,不会,至此,opencv部分的操作基本上就大功告成了,后面会说如何接入tensorflow以及如何用tensorflow-lite作人脸识别和口罩识别并展示出是否佩戴口罩

ps:本来早就准备好一起上,但opencv对人连带口罩时的读取识别度太低了,dlib表现不错,但dlib性能问题堪忧,而且还因为用的一个模型比较大,用在移动端上有点内存杀手的意思,所以选内存占用更小的tensorflow-lite,但tensorflowlite的人脸识别的模型构建我还没看,估计要一段时间了,可能会先出一个opencv读取人脸的教程混混?

Android从零开始配置opencv+tensorflow进行人脸识别+口罩识别(二:opencv展示当前图像并作适当调整)相关推荐

  1. 视觉识别入门之识别 ——口罩识别

    视觉识别入门之识别 --口罩识别 ​ 时隔多月未动笔写文,一是自己初学很多不明白的地方都在快速地学习,从现在开始定期写文,我是水彩笔一根,但确是对着生活和学习充满极度热情的人,希望能带着读者们一起进步 ...

  2. 基于Python的OpenCV+TensorFlow+Keras人脸识别实现

    前言:本节要讲的人脸识别主要是借鉴了 一位研究生前辈的文章 我只是在他的基础上进行了改动,让代码能在现在的TensorFlow2.X 等的环境下运行 先看一下效果图 完整工程及源代码请点击链接下载:人 ...

  3. TensorFlow入门 | 人脸检测与识别

    人脸识别概述 人脸识别,特指利用分析比较人脸视觉特征信息进行身份鉴别的计算机技术.属于生物特征识别技术的一种. 广义的人脸识别实际包括构建人脸识别系统的一系列相关技术,包括人脸图像采集.人脸定位.人脸 ...

  4. 面部表情识别java_使用Python+OpenCV+dlib为人脸生成口罩

    来源:深度学习与计算机视觉 本文约4800字,建议阅读6分钟本文试图用OpenCV和dlib库来实现这个过程,在这里我们综合生成5种类型的口罩来绘制人脸图像. 本文使用OpenCV dlib库生成口罩 ...

  5. dlib库包的介绍与使用,opencv+dlib检测人脸框、opencv+dlib进行人脸68关键点检测,opencv+dlib实现人脸识别,dlib进行人脸特征聚类、dlib视频目标跟踪

    文章目录: 1 dlib库介绍 2 dlib人脸检测:绘制出人脸检测框 2.1 dlib人脸检测源码 2.2 opencv + dlib 人脸检测 2.3 dlib人脸检测总结 3 dlib人脸关键点 ...

  6. 使用Python+OpenCV+dlib为人脸生成口罩

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者Google ...

  7. 《OpenCv视觉之眼》Python图像处理十二 :Opencv图像轮廓提取之基于一阶导数的Roberts算法、Prewitt算法及Sobel算法

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  8. OpenCV+TensorFlow图片手写数字识别(附源码)

    初次接触TensorFlow,而手写数字训练识别是其最基本的入门教程,网上关于训练的教程很多,但是模型的测试大多都是官方提供的一些素材,能不能自己随便写一串数字让机器识别出来呢?纸上得来终觉浅,带着这 ...

  9. Unity之人脸识别对比(二)获取摄像头图像以及保存

    本章主要讲述unity开发中,如何获取摄像头的图像以及保存. 调用摄像头以及保存画面 调用摄像头这个比较简单,Unity已经封装了一些接口,直接调用就好了. (1)代码-封装摄像头画面获取以及保存 n ...

最新文章

  1. 技术总监到底要不要写代码?
  2. Spring整合的quartz任务调度的实现方式
  3. 【Mysql】win10上Mysq的l安装
  4. msflexgrid允许大选择_选择复式楼、跃层和别墅的装修业主如何做好家里的楼梯...
  5. 应该算是在说 delphi 的日志框架吧
  6. 简单的C语言程序合集
  7. day30,网络编程和各种协议
  8. 什么是端到端的训练或学习?
  9. cartographer的一些结果
  10. 利用python爬取电影资源
  11. dnf外挂java代码,使用Java实现简朴的斗地主案例_rust辅助,绝地求生卡盟
  12. 单级倒立摆的神经网络控制
  13. 力扣(leetcode)66.加一——c语言新手入门
  14. Autodesk 首届云编程马拉松过程纪实和感想
  15. 智能优化算法:秃鹰搜索算法 -附代码
  16. 什么是Vue生命周期函数,有哪些函数?各自在什么时候执行?
  17. surface装双系统后在移动硬盘上装ubuntu系统
  18. 45.常用的数学工具类2-三角函数的使用
  19. iPhone备忘录删了怎么恢复?恢复备忘录的两大方法!
  20. 单片机:看门狗程序简介

热门文章

  1. 吃野生动物真的是“猎奇”的生物本能驱动的?
  2. 初级软件测试工程师之必备SQL语句基础
  3. 远程桌面连接出现身份验证错误解决办法
  4. Android 查看系统Linux kernel版本号
  5. Global.asax全局文件应用
  6. foreach判断是否是第一次循环
  7. Axure设置图片和设置文本
  8. 如何谷歌浏览器清除缓存
  9. Kaptcha图片验证码工具
  10. MYSQL索引-覆盖索引