您的位置:首页 > 理论基础 > 计算机网络

网络图片人脸识别并根据人脸焦点显示图片

2016-03-25 11:38 676 查看

Fresco下载图片并根据人脸识别来聚焦图片展示

相信现在越来越多的开发者在使用facebook的Fresco 框架来处理图片了,在文档中有如下介绍



那么人脸识别,android怎样进行人脸识别呢?其实android从API 1的时候就有人脸识别了,FaceDetector类。具体使用如下:

FaceDetector fd = new FaceDetector(faceBitmap.getWidth(), faceBitmap.getHeight(), FACE_COUNT);
count = fd.findFaces(faceBitmap, faces);


而且我们还可以通过getMidPoint()方法获取到脸中间点的pointf对象

下面说一下在Fresco使用人脸识别获取焦点显示的具体实现

Fresco的配置

1.首先在 XML 中指定缩放模式

fresco:actualImageScaleType="focusCrop"


2.在Java代码中,给你的图片指定居中点:

PointF focusPoint;
// your app populates the focus point
mSimpleDraweeView
.getHierarchy()
.setActualImageFocusPoint(focusPoint);


监听Fresco下载完后事件

new ControllerListener<ImageInfo>() {
@Override
public void onSubmit(String id, Object callerContext) {

}

@Override
public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) {
/**在调用getDrawingCache的时候要注意下面2点:
在调用getDrawingCache()方法从ImageView对象获取图像之前,一定要调用setDrawingCacheEnabled(true)方法:
imageview.setDrawingCacheEnabled(true);
否则,无法从ImageView对象iv_photo中获取图像; **/
sdv_picture.setDrawingCacheEnabled(true);
Bitmap bitmap = sdv_picture.getDrawingCache();
PointF pointF = setFace(bitmap);
//按百分比算,防止偏差
PointF pointF1 = new PointF(pointF.x / (float) sdv_picture.getWidth(), pointF.y / (float) sdv_picture.getHeight());
//设置聚焦点
sdv_picture.getHierarchy()
.setActualImageFocusPoint(pointF1);
/**在调用getDrawingCache()方法从ImageView对象获取图像之后,一定要调用setDrawingCacheEnabled(false)方法:
imageview.setDrawingCacheEnabled(false);
以清空画图缓冲区,否则,下一次从ImageView对象iv_photo中获取的图像,还是原来的图像。**/
sdv_picture.setDrawingCacheEnabled(false);
}

@Override
public void onIntermediateImageSet(String id, ImageInfo imageInfo) {

}

@Override
public void onIntermediateImageFailed(String id, Throwable throwable) {

}

@Override
public void onFailure(String id, Throwable throwable) {

}

@Override
public void onRelease(String id) {

}
}));


Android人脸识别得到脸部焦点

/**
* 人脸识别
*
* @param bitmap
* @return 人脸中间位置
*/
public PointF setFace(Bitmap bitmap) {
FaceDetector fd;
FaceDetector.Face[] faces = new FaceDetector.Face[FACE_COUNT];
PointF midpoint = new PointF();
int count = 0;
try {
//     这是关键点,官方要求必须是RGB_565否则识别不出来
Bitmap faceBitmap = bitmap.copy(Bitmap.Config.RGB_565, true);
bitmap.recycle();
// 宽高不等的话会报异常(IllegalArgumentException if the Bitmap dimensions don't match the dimensions defined at initialization),这个可以从源码中看出
fd = new FaceDetector(faceBitmap.getWidth(), faceBitmap.getHeight(), FACE_COUNT);
count = fd.findFaces(faceBitmap, faces);
faceBitmap.recycle();
Toast.makeText(MainActivity.this, "有" + count + "张脸", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Log.e("检测脸部", "setFace(): " + e.toString());
return midpoint;
}

// 检测出来的脸部获取位置,用于设置SimpleDraweeView
if (count > 0) {
for (int i = 0; i < count; i++) {
try {
faces[i].getMidPoint(midpoint);
} catch (Exception e) {
Log.e("检测脸部", "setFace(): face " + i + ": " + e.toString());
}
}
}

return midpoint;
}


详细代码下载:http://download.csdn.net/detail/u011930471/9472238
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: