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

网络图片人脸识别并根据人脸焦点显示图片Fresco下载图片并根据人脸识别来聚焦图片展示相信现在越来越多的开发者在使用facebook的Fresco框架来处理图片了,在文档中有如下介绍那么人脸识别,android怎样进行人脸识别呢?其实android从AP

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

今天的文章网络图片人脸识别并根据人脸焦点显示图片分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/64214.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注