查看: 2508|回复: 0

角蜂鸟实例教程 > Android > 人脸检测

[复制链接]

该用户从未签到

发表于 2018-8-7 08:55:35 | 显示全部楼层 |阅读模式
分享到:
本帖最后由 cll826 于 2018-8-5 16:35 编辑

人脸检测

本文主要给大家介绍如何在Android平台下使用角蜂鸟调用SSD-Mobilenet卷积神经网络,实现人脸检测

准备工作

1.配置环境等详情请参照Hello 2018里的快速开始,此处不具体阐述。
2.下载人脸检测所需模型graph_face_SSD文件,在您Android Studio中,当前module下新建assets包,将下载的模型文件复制到该目录下。
3.因工程需要处理图像,所以使用了javacv库,可从GitHub自行下载或点击链接从示例工程中拷贝到自己工程下。

具体实现
1.实现具体步骤:

  • 将graph文件传输到角蜂鸟里
  1. int status = allocateGraphByAssets("graph_face_SSD");
复制代码
  • 处理图像数据,分两种模式

  • 使用角蜂鸟内置摄像头:

  1. byte[] bytes = getImage(0.007843f, 1.0f);
复制代码
  2.使用外部图像来源:该模式下,传入角蜂鸟的数据要经过预处理,下面介绍的例子是使用手机摄像头的数据,图像大小为1280*720:
  1. SoftReference<Bitmap> softRef = new SoftReference<>(Bitmap.createBitmap(1280, 720, Bitmap.Config.ARGB_8888));
  2. Bitmap bitmap = softRef.get();
  3. allocations[0].copyTo(bitmap);
  4. Matrix matrix = new Matrix();
  5. matrix.postScale(300f / 1280, 300f / 720);
  6. Bitmap newbm = Bitmap.createBitmap(bitmap, 0, 0, 1280, 720, matrix,true);
  7. int[] ints = new int[300 * 300];
  8. newbm.getPixels(ints, 0, 300, 0, 0, 300, 300);
  9. float[] float_tensor = new float[300 * 300 * 3];
  10. for (int j = 0; j < 300 * 300; j++) {
  11. float_tensor[j * 3] = Color.red(ints[j]) * 0.007843f - 1;
  12. float_tensor[j * 3 + 1] = Color.green(ints[j]) * 0.007843f - 1;
  13. float_tensor[j * 3 + 2] = Color.blue(ints[j]) * 0.007843f - 1;
  14. }
  15. int status_load = mFaceDetectorBySelfThread.loadTensor(float_tensor, float_tensor.length, 1);
复制代码
  • 获取返回的处理结果,该mobilenetssd类型的神经网络,返回的结果解析如下:
  1. float[] result = getResult(0);
  2. int num = (int) floats[0];//第一个数为检测到的个数
  3. for (int i = 0; i < num; i++) {
  4. int x1 = (int) (floats[7 * (i + 1) + 3] * screenwidth);
  5. int y1 = (int) (floats[7 * (i + 1) + 4] * screenheight);
  6. int x2 = (int) (floats[7 * (i + 1) + 5] * screenwidth);
  7. int y2 = (int) (floats[7 * (i + 1) + 6] * screenheight);
  8. int wight = x2 - x1;
  9. int height = y2 - y1;
  10. int percentage = (int) (floats[7 * (i + 1) + 2] * 100);
  11. if (percentage <= 55) {
  12.     continue;
  13.   }
  14. if (wight >= screenwidth * 0.8 || height >= screenheight * 0.8) {
  15.     continue;
  16.   }
  17. if (x1 < 0 || x2 < 0 || y1 < 0 || y2 < 0 || wight < 0 || height < 0) {
  18.     continue;
  19.   }
  20. }
复制代码
  • 结果通过handler机制传给当前Activity,HornedSungemFrame用来接收图像和结果的实体类,DrawView负责将人脸的检测框画在屏幕上,具体代码可参考示例工程

2.注意事项:
  • 处理image图像区别:采用角蜂鸟内置的摄像头模式下,如果zoom为ture,获取的图像是640*360的BGR图像,如果zoom为false,获取的图像为1920*1080的图像,图像的排序需要注意,1080P的是BGR每个通道的数据传完才会传下个通道的。具体处理示例代码如下:

  1. opencv_core.IplImage bgrImage = null;
  2.     if (zoom) {
  3.       FRAME_W = 640;
  4.       FRAME_H = 360;
  5.       bgrImage = opencv_core.IplImage.create(FRAME_W, FRAME_H, opencv_core.IPL_DEPTH_8U, 3);
  6.       bgrImage.getByteBuffer().put(bytes);
  7.     } else {
  8.         FRAME_W = 1920;
  9.         FRAME_H = 1080;
  10.         byte[] bytes_rgb = new byte[FRAME_W * FRAME_H * 3];
  11.         for (int i = 0; i < FRAME_H * FRAME_W; i++) {
  12.             bytes_rgb[i * 3 + 2] = bytes[i];//r
  13.             bytes_rgb[i * 3 + 1] = bytes[FRAME_W * FRAME_H + i];//g
  14.             bytes_rgb[i * 3] = bytes[FRAME_W * FRAME_H * 2 + i];//b
  15.            }
  16.         bgrImage = opencv_core.IplImage.create(FRAME_W, FRAME_H, opencv_core.IPL_DEPTH_8U, 3);
  17.         bgrImage.getByteBuffer().put(bytes_rgb);
  18.        }
  19.   opencv_core.IplImage image = opencv_core.IplImage.create(FRAME_W, FRAME_H, opencv_core.IPL_DEPTH_8U, 4);
  20.   cvCvtColor(bgrImage, image, CV_BGR2RGBA);
复制代码
  • 处理getResult返回值:
  * 每7个数为一组数据
  * 数组的第一组数的第一个数表示检测到多少个人脸,剩下的6个数不作处理
  * 每组数据的第三个数是置信度,剩下的4个数分别为上下左右的坐标
  * 值类型都为float32

3.效果展示:


xiaoguotu.jpeg


友好提醒:因Android设备基本都是USB2.0,所以不建议使用1080P的图像,传输比较耗时,会有卡顿感,可以使用360P的图像,铺满屏幕即可

具体代码可去GitHub下载,地址如下SungemSDK-AndroidExamples

产品购买链接:https://www.cirmall.com/shop/?c=products&a=view&id=5113




回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

手机版|小黑屋|与非网

GMT+8, 2024-11-20 00:29 , Processed in 0.116318 second(s), 16 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.