网络图片人脸识别并根据人脸焦点显示图片
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
相关文章推荐
- 网络并发服务器设计
- Android 网络通信(Asynctask类的使用)
- 微博 https 请求协议
- javaweb学习总结(四)——Http协议
- 17.Studio中导入HttpClient的jar包
- redhat7 网络安装 Kickstart
- java模拟HTTP post,get请求
- 网络防火墙系统的实现(三)
- 神经网络翻译系统dl4mt源码之Numpy库相关函数的使用(一)
- get与post的区别
- 网络扫描(二)
- HTTP in iOS你看我就够
- android 中HttpClient和URLConnection的区别
- 扒一扒HTTPS网站的内幕
- 原生代码加载网络图片和Volley和Picasso的简单介绍和优缺点对比
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java
- Twsited异步网络框架
- Android中的HTTPS
- 图解SSL/TLS协议(HTTPS的安全层)
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java