2019独角兽企业重金招聘Python工程师标准>>>

最近公司需要做一个人脸检测的新功能,在网上找了找,有很多开源的第三方库都可以用,例如OpenCV,虹软,Face++,百度,阿里等等。

由于在APP的需求,只能本地检测,所以Face++,百度,阿里这些需要用HTTP进行网络请求返回结果的,只能舍弃了。集中研究OpenCV以及虹软。

首先介绍一下虹软,这家公司开源了so库以及jar包,可直接下载集成到项目中,简单配置之后就可检测人脸,而且识别率还是不错的。可借鉴此博客点击打开链接。详细教你在Android Studio中使用虹软检测以及识别人脸。

接下来讲一下使用OpenCV开源库检测人脸。其实OpenCV非常强大,有兴趣的同学可以去查阅一下。目前只讲一下使用OpenCV通过Camera动态检测人脸。OpenCV搭建流程可百度,内容很多,这里仅做简单说明。

首先下载OpenCV4Android Demo,新建项目等操作省略,然后倒入OpenCV Samples中的face_detection项目,使用NDK编译检测的so库,倒入OpenCV SDK中的java Module到项目中,在app/src/main目录下新建jniLibs,复制sdk/native/libs/armeabi-v7a/libopencv_java3.so到jniLibs/armeabi-v7a中(可多选,arm,x86等,由于我只需要v7a即可,只倒入这个),复制sdk/native/jni/include到jniLibs下。可直接下载代码OpenCVJ。

到此搭建完工程,点击运行,发现只有横屏下才能正确检测到人脸,但是项目需求是在竖屏下检测人脸,怎么办,接着寻找答案,发现这篇博客OpenCV on Android 开发 (4)竖屏预览图像问题解决方法-续,在此多谢这位兄台的先驱行动,使用Core.rotate函数,最后一个参数填入Core.ROTATE_90_CLOCKWISE,旋转Gray Mat后可正确检测到人脸,返回MatOfRect,再把MatOfRect放入到mRgba中,再次通过Core.rotate函数,但是最后一个参数需填入Core.ROTATE_90_COUNTERCLOCKWISE,再返回到CameraBridgeViewBase中的deliverAndDrawFrame中,经过此操作后可以正确显示出人脸检测框。

使用上述方法就基本完成了。按照惯例,文章没有写完,肯定会有但是的,没错,这里也有。

但是:实际使用时,发现帧率只有10帧左右,完全无法接受,整个页面都是卡顿的,怎么办,接着寻找方法。想到一个idea,既然是检测,我只需要OpenCV的检测功能,不需要OpenCV来自己画图,直接使用camera的预览效果,我只把人脸检测框画到预览图上面去就好,这样可以保证预览不卡顿,只是检测框可能要一点时间才能显示,这也是无法避免的了。

首先看xml文件: ` <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:opencv="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent">

<org.opencv.android.JavaCameraViewandroid:id="@+id/fd_activity_surface_view"android:layout_width="match_parent"android:layout_height="match_parent"opencv:camera_id="back"/><Buttonandroid:id="@+id/fd_switch_camera_view"android:layout_width="100dp"android:layout_height="100dp"android:layout_marginLeft="220dp"android:layout_marginRight="20dp"android:layout_marginTop="20dp"/><ImageViewandroid:id="@+id/fd_image_view"android:layout_width="match_parent"android:layout_height="match_parent"/>
</RelativeLayout>

使用JavaCameraView开启Camera,id为fd_switch_camera_view为切换前置后置摄像头,id为fd_image_view用来显示人脸检测框。再看FdActivity.java文件,只展示主要修改地方:`
@Overridepublic Mat onCameraFrame(CvCameraViewFrame inputFrame){mGray = inputFrame.gray();Utils.bitmapToMat(mAlphaBitmap, mRgba);//使前置的图像也是正的if (mOpenCvCameraView.getCameraIndex() == CameraBridgeViewBase.CAMERA_ID_FRONT){Core.flip(mRgba, mRgba, 1);Core.flip(mGray, mGray, 1);}if (mAbsoluteFaceSize == 0){int height = mGray.rows();if (Math.round(height * mRelativeFaceSize) > 0){mAbsoluteFaceSize = Math.round(height * mRelativeFaceSize);}if (mNativeDetector != null){mNativeDetector.setMinFaceSize(mAbsoluteFaceSize);}}MatOfRect faces = new MatOfRect();Core.rotate(mGray, gMatlin, Core.ROTATE_90_CLOCKWISE);Core.rotate(mRgba, Matlin, Core.ROTATE_90_CLOCKWISE);if (mNativeDetector != null){mNativeDetector.detect(gMatlin, faces);}Rect[] faceArray = faces.toArray();for (Rect rect : faceArray){Imgproc.rectangle(Matlin, rect.tl(), rect.br(), new Scalar(0, 255, 0, 255), 2);}Core.rotate(Matlin, mRgba, Core.ROTATE_90_COUNTERCLOCKWISE);deliverAndDrawFrame(mRgba);return mRgba;}
protected void deliverAndDrawFrame(Mat modified){boolean bmpValid = true;if (modified != null){try{Utils.matToBitmap(modified, mCacheBitmap, true);}catch (Exception e){Log.e(TAG, "Mat type: " + modified);Log.e(TAG, "Bitmap type: " + mCacheBitmap.getWidth() + "*" + mCacheBitmap.getHeight());Log.e(TAG, "Utils.matToBitmap() throws an exception: " + e.getMessage());bmpValid = false;}}if (bmpValid && mCacheBitmap != null){mHandler.post(new Runnable(){@Overridepublic void run(){Matrix matrix = new Matrix(); // I rotate it with minimal processmatrix.preTranslate((mViewWidth - mCacheBitmap.getWidth()) / 2, (mViewHeight - mCacheBitmap.getHeight()) / 2);matrix.postRotate(90f, (mViewWidth) / 2, (mViewHeight) / 2);float scale = (float) mViewWidth / (float) mCacheBitmap.getHeight();matrix.postScale(scale, scale, mViewWidth / 2, mViewHeight / 2);//                    final Matrix matrix = new Matrix(); // I rotate it with minimal process//                    matrix.preTranslate((mViewWidth - mCacheBitmap.getWidth()) / 2, (mViewHeight - mCacheBitmap.getHeight()) / 2);//                    matrix.postRotate(90, mViewWidth / 2, mViewHeight / 2);//                    float scale = (float) mViewWidth / (float) mViewHeight;//                    matrix.postScale(scale, scale, mViewWidth / 2, mCacheBitmap.getHeight() / 2);Bitmap bitmap = Bitmap.createBitmap(mCacheBitmap, 0, 0, mCacheBitmap.getWidth(), mCacheBitmap.getHeight(), matrix, false);mImageView.setImageBitmap(bitmap);}});}}

上面两部分代码都为FdActivity中,将MatOfRect贴到Mat中,再转换成Bitmap显示到ImageView中。

JavaCameraView.java的修改:

initializeCamera函数增加

mCamera.setPreviewDisplay(getHolder());

mCamera.setDisplayOrientation(90);

CameraBridgeBaseView.java的修改 ` protected void deliverAndDrawFrame(CvCameraViewFrame frame) { Mat modified;

    if (mListener != null){modified = mListener.onCameraFrame(frame);}else{modified = frame.rgba();}

}

只需要调用onCameraFrame的回调即可,不用再贴图了。到此基本完成。后续还需要优化,等优化完再更新。。。。----------更新更新-----------回调onCameraFrame函数时,将Mat先缩小,然后再开始检测,可以大幅提升检测速度。使用Imgproc.resize()函数即可,具体使用可网上查阅。

转载于:https://my.oschina.net/bangbangda/blog/3032557

OpenCV4Android人脸检测功能相关推荐

  1. android关闭人脸检测功能,【Android知识】录像预览模式下打开人脸检测

    开发的一款高通平台Android 9.0基于Camera2实现的预览界面通过侧键实现拍照,录像等功能的应用中,预览界面默认是采用的原生的VideoModule.java界面实现,测试发现设置中开启人脸 ...

  2. 使用 JavaScript,也能在 Web 应用中实现人脸检测功能?!

    想要实现一个面部识别的功能究竟该怎么做?在本文中,我们将以 JavaScript 库 pico.js 为依托,手把手教你如何为一款应用添加面部检测功能. 作者 | Jonathan Freeman 译 ...

  3. android人脸检测开发——使用GMV API(google mobile vision library)开发人脸检测功能

    授人以鱼不如授人以渔:建议看以下官网资料! 从一张图片中检测人脸及脸部器官的教程:https://developers.google.cn/vision/android/detect-faces-tu ...

  4. 图像处理基本方法-c语言调用opencv实现人脸检测功能

    图像处理基本方法-c语言调用opencv-实现BMP图片中人脸检测功能 使用opencv检测bmp图片中人脸,主要使用cvHaarDetectObjects函数实现. 函数定义 CvSeq* cvHa ...

  5. java 人脸检测_Java+opencv3.2.0实现人脸检测功能

    说到人脸检测,首先要了解Haar特征分类器.Haar特征分类器说白了就是一个个的xml文件,不同的xml里面描述人体各个部位的特征值,比如人脸.眼睛等等.OpenCV3.2.0中提供了如下特征文件: ...

  6. python人脸检测与微信小程序_微信小程序实现人脸检测功能

    本文为大家分享了微信小程序实现人脸检测的具体代码,供大家参考,具体内容如下 因为本文章的人脸检测技术运用的是百度云人工智能,首先要有百度云的账号. 近期,人脸识别已经升级到了V3,开启了测试,所以也依 ...

  7. Python调用笔记本摄像头,并实现人脸检测功能

    回家第一天感觉好无聊,一天睡了十几个小时,电视剧也看完了,就玩玩Python调用笔记本摄像头并实现人脸检测. 我们使用的是Python中的opencv库实现人脸检测,前面已经有一篇博客介绍如何下载op ...

  8. OpenCV4Android开发实录(2): 使用OpenCV3.4.1库实现人脸检测

    OpenCV4Android开发实录(2): 使用OpenCV3.3.0库实现人脸检测 转载请声明出处:http://write.blog.csdn.net/postedit/78992490 Ope ...

  9. 【机器学习】最容易实现的基于OpenCV的人脸检测代码、检测器及检测效果

    基于opencv自带的人脸检测模型,实现简单的人脸检测功能,可作为机器学习初学者练手使用.简单易学,具体的方法及代码如下. 1.运行结果 输入原图 输出结果 2.工程需要加载的opencv库如下: 3 ...

最新文章

  1. linux系统中怎么驱动U盘
  2. 【HDU】3441 Rotation
  3. 小白入门PyTorch | 第一篇:什么是PyTorch?
  4. CPU检测工具CPU-Z
  5. mysql视图有哪几种_数据库报表的视图有几种?每种视图的功能是什么?
  6. html php 混编 H1,在一个HTML中h1标签能出现几次?h1标签和标题标签的差别是什么?...
  7. unity3d 不规则外发光描边_Shader案例之内发光和边缘泛光效果
  8. 图片加马(一句话木马)
  9. P1742 最小圆覆盖
  10. IS-IS(笔记整理)
  11. oopc——5.多态
  12. SQL SERVER 2016 AlwaysOn 无域集群+负载均衡搭建与简测
  13. svn merger的时候 报远程主机强迫_SVN与Git比较(二)版本库与工作区
  14. PyTorch与PyTorch Geometric的安装
  15. “那不勒斯”服务器芯片,那不勒斯定名 AMD发布全新CPU品牌EPYC
  16. golang 模拟键盘输入
  17. 2020.8.28丨蛋白质组产品介绍、方案设计和案例解析
  18. 微软“黑屏”原来是纸老虎
  19. 给软件添加注册码【笔记】
  20. object-c 中的 self 含义

热门文章

  1. 【转发】 iphone开发随笔,有用的
  2. Fedora10字体安装与美化
  3. 读书笔记 effective c++ Item 41 理解隐式接口和编译期多态
  4. MySQL 存储引擎和锁
  5. MATLAB读取和写入Excel文件
  6. Velocity简单语法及VelocityHelper封装
  7. 2017linux版本号,Linux基本命令 2017-11-27
  8. 四针角oled屏连接arduino_和孩子一起做个显示温湿度的oled屏桌面摆件[青创小电视]...
  9. Android通话记录CallLog简单摘要
  10. ViewPager里面ImageView图片切换出现bug