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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值