4611
- 收藏
- 点赞
- 分享
- 举报
关于人脸识别的实例
本帖最后由 Heguming 于 2015-11-6 14:22 编辑
分享一个人脸识别的实例,已将其封装成一个FaceDistinguishClass类,附件中为该类的应用实例。
[code]
package com.example.facedistinguish;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.media.FaceDetector;
import android.media.FaceDetector.Face;
import android.view.View;
public class FaceDistinguishClass extends View {
private Bitmap bitmap;
private float imageWidth;
private float imageHeight;
private FaceDetector faceDetector;
private FaceDetector.Face[] faces;
private int faceDetectedNumber = 0;
private static final int FACENUMBER = 100;
public FaceDistinguishClass(Context context, Bitmap bitmap) {
super(context);
this.bitmap = bitmap;
imageWidth = bitmap.getWidth();
imageHeight = bitmap.getHeight();
faces = new FaceDetector.Face[FACENUMBER];
faceDetector = new FaceDetector((int) imageWidth, (int) imageHeight,
FACENUMBER);
faceDetectedNumber = faceDetector.findFaces(bitmap, faces);
}
public void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
canvas.drawBitmap(bitmap, 0, 0, null);
Paint paint = new Paint();
paint.setColor(Color.GREEN);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(3);
for (int i = 0; i < faceDetectedNumber; i++) {
Face face = faces;
PointF pointF = new PointF();
face.getMidPoint(pointF);
float myEyesDistance = face.eyesDistance();
canvas.drawRect((int) (pointF.x - myEyesDistance * 2),
(int) (pointF.y - myEyesDistance * 2),
(int) (pointF.x + myEyesDistance * 2),
(int) (pointF.y + myEyesDistance * 2), paint);
}
}
public int getFaceNumber() {
return faceDetectedNumber;
}
}
[/code]
该类通过构造函数FaceDistinguishClass(Context context, Bitmap bitmap)接收传入的Bitmap对象,然后实例化一个FaceDetector对象用于人脸识别。通过调用FaceDetector.findFaces(Bitmap bitmap, FaceDetector.Face[] faces)方法获取人脸识别数量,赋值给faceDetectedNumber变量。
在onDraw(Canvas canvas)方法中,先通过Canvas.drawBitmap(Bitmap bitmap, float left, float top, Paint paint)方法,绘制出该图片视图,后通过Canvas.drawRect(float left, float top, float right, float bottom, Paint paint)方法,在每个识别出的人脸四周,绘制出一个矩形方框。最后,如果需要,可通过调用getFaceNumber()方法获取返回的人脸识别数量。
使用时,用户只需在相应位置实例化一个FaceDistinguishClass对象,仍后传入需要识别的Bitmap对象,即可完成对图像的人脸识别及绘制。
效果如下:
不知细心的读者有没有发现,在图片的右下角,有一位搂着孩子的母亲,并没有被人脸识别出来。通过调试,发现执行faceDetector.findFaces(bitmap, faces)方法后,获取的人脸数量有误,即少识别的了一个。
"Ctrl" + MouseLeft 进入该方法,发现人脸识别数量,实际上是通过fft_detect(Bitmap bitmap)方法获取的。至于fft_detect(bitmap)方法,该方法为jni层方法,在FaceDistinguishClass 中,有如下声明:native private int fft_detect(Bitmap bitmap)。
由于jni层不可见,最终没有弄清未识别出的原因。不过通过函数名分析,极有可能是傅立叶变换出的问题。不知有哪位高手,可以帮忙找出这个原因。在下不胜感激!
原创,转载请注明出处。
附件:FaceDistinguish.rar
分享一个人脸识别的实例,已将其封装成一个FaceDistinguishClass类,附件中为该类的应用实例。
[code]
package com.example.facedistinguish;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.media.FaceDetector;
import android.media.FaceDetector.Face;
import android.view.View;
public class FaceDistinguishClass extends View {
private Bitmap bitmap;
private float imageWidth;
private float imageHeight;
private FaceDetector faceDetector;
private FaceDetector.Face[] faces;
private int faceDetectedNumber = 0;
private static final int FACENUMBER = 100;
public FaceDistinguishClass(Context context, Bitmap bitmap) {
super(context);
this.bitmap = bitmap;
imageWidth = bitmap.getWidth();
imageHeight = bitmap.getHeight();
faces = new FaceDetector.Face[FACENUMBER];
faceDetector = new FaceDetector((int) imageWidth, (int) imageHeight,
FACENUMBER);
faceDetectedNumber = faceDetector.findFaces(bitmap, faces);
}
public void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
canvas.drawBitmap(bitmap, 0, 0, null);
Paint paint = new Paint();
paint.setColor(Color.GREEN);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(3);
for (int i = 0; i < faceDetectedNumber; i++) {
Face face = faces;
PointF pointF = new PointF();
face.getMidPoint(pointF);
float myEyesDistance = face.eyesDistance();
canvas.drawRect((int) (pointF.x - myEyesDistance * 2),
(int) (pointF.y - myEyesDistance * 2),
(int) (pointF.x + myEyesDistance * 2),
(int) (pointF.y + myEyesDistance * 2), paint);
}
}
public int getFaceNumber() {
return faceDetectedNumber;
}
}
[/code]
该类通过构造函数FaceDistinguishClass(Context context, Bitmap bitmap)接收传入的Bitmap对象,然后实例化一个FaceDetector对象用于人脸识别。通过调用FaceDetector.findFaces(Bitmap bitmap, FaceDetector.Face[] faces)方法获取人脸识别数量,赋值给faceDetectedNumber变量。
在onDraw(Canvas canvas)方法中,先通过Canvas.drawBitmap(Bitmap bitmap, float left, float top, Paint paint)方法,绘制出该图片视图,后通过Canvas.drawRect(float left, float top, float right, float bottom, Paint paint)方法,在每个识别出的人脸四周,绘制出一个矩形方框。最后,如果需要,可通过调用getFaceNumber()方法获取返回的人脸识别数量。
使用时,用户只需在相应位置实例化一个FaceDistinguishClass对象,仍后传入需要识别的Bitmap对象,即可完成对图像的人脸识别及绘制。
效果如下:
不知细心的读者有没有发现,在图片的右下角,有一位搂着孩子的母亲,并没有被人脸识别出来。通过调试,发现执行faceDetector.findFaces(bitmap, faces)方法后,获取的人脸数量有误,即少识别的了一个。
"Ctrl" + MouseLeft 进入该方法,发现人脸识别数量,实际上是通过fft_detect(Bitmap bitmap)方法获取的。至于fft_detect(bitmap)方法,该方法为jni层方法,在FaceDistinguishClass 中,有如下声明:native private int fft_detect(Bitmap bitmap)。
由于jni层不可见,最终没有弄清未识别出的原因。不过通过函数名分析,极有可能是傅立叶变换出的问题。不知有哪位高手,可以帮忙找出这个原因。在下不胜感激!
原创,转载请注明出处。
附件:FaceDistinguish.rar
文件: FaceDistinguish.rar
下载
我来回答
回答2个
时间排序
认可量排序
认可0
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2018-12-14 10:49:11
-
2018-07-16 10:46:30
-
2018-07-16 17:17:15
-
2018-12-12 09:24:00
-
22018-12-12 11:19:54
-
2019-01-20 13:21:53
-
2020-10-27 14:27:38
-
2018-12-26 14:53:13
-
2018-12-14 10:37:21
-
2019-01-04 15:15:38
-
2019-02-25 15:20:19
-
2016-02-04 18:01:23
-
2019-07-30 15:29:53
-
2020-10-22 10:37:31
-
2019-05-20 17:28:13
-
2014-12-24 19:24:42
-
2018-12-06 09:53:23
-
2020-11-12 15:19:53
-
2019-01-11 14:26:31
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认