Android 活体人脸实时采集,百度、虹软

 

 百度现在功能较少——使用虹软,方便

 虹软官网:https://ai.arcsoft.com.cn/ucenter/resource/build/index.html

申请应用,下载SDK即可

 

 

 虹软已修改好的,可注册人脸,人脸验证成功——登陆的demo:https://download.csdn.net/download/meixi_android/18434756

1、首先去百度人脸识别创建应用

https://console.bce.baidu.com/ai/?_=1553067234412&fromai=1#/ai/face/client/index

 

 2、下载SDK

https://download.csdn.net/download/meixi_android/11041930

 

3、导入module

 

 4、人脸实时采集实现类

 /**
     * 绘制人脸框。
     *
     * @param model 追踪到的人脸
     */
    private void showFrame(FaceFilter.TrackedModel model) {
        Canvas canvas = mTextureView.lockCanvas();
        if (canvas == null) {
            return;
        }
        // 清空canvas
        canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);

        if (model != null) {
            FaceInfo info = model.getInfo();
            model.getImageFrame().retain();
            RectF rectCenter = new RectF(info.mCenter_x - 2 - info.mWidth * 3 / 5,
                    info.mCenter_y - 2 - info.mWidth * 3 / 5,
                    info.mCenter_x + 2 + info.mWidth * 3 / 5,
                    info.mCenter_y + 2 + info.mWidth * 3 / 5);
            previewView.mapFromOriginalRect(rectCenter);
            // 绘制框
            paint.setStrokeWidth(mRound);
            paint.setAntiAlias(true);
            canvas.drawRect(rectCenter, paint);

            if (model.meetCriteria()) {
                // 符合检测要求,绘制绿框
                paint.setColor(Color.GREEN);
            }
            mFrameIndex++;
            Log.d("lgq", "add face index is:" + mFrameIndex);
            if (mFrameIndex >= 10) {
                final Bitmap face = model.cropFace();
                //  final Bitmap face =ImageUtil.bitmapFromArgb(model.getImageFrame());
                if (face != null) {
                    int size = mList.size();
                    // 释放一些,以防止太多
                    if (size >= 6) {
                        Bitmap bmp = mList.get(size - 6);
                        if (bmp != null) {
                            bmp.recycle();
                            Log.d("lgq", "recycle size is:" + size);
                            bmp = null;
                        }
                    }
                    mList.add(face);
                    Log.d("lgq", "add face ok");
                    mHandler.postDelayed(scrollRunnable, 100);
                    mFrameIndex = 0;
                    faceDetectManager.stop();
                }
            }
        }
        mTextureView.unlockCanvasAndPost(canvas);
    }


    Runnable scrollRunnable = new Runnable() {
        @Override
        public void run() {
            int count = mRecyAdapter.getItemCount();
            int curIndex = count - 1;
            mRecyclerview.scrollToPosition(curIndex);
            mRecyAdapter.setDatas(mList);
//            mRecyclerview.invalidate();
            mRecyAdapter.notifyDataSetChanged();
            //  Log.d("lgq", "in runnuable data size is:" + mList.size());
        }
    };

    /**
     * 初始化recycleView画截图得到的人脸图像
     */
    private void initRecy() {
        mRecyAdapter = new RecyAdapter(this);

        mLayoutManager = new LinearLayoutManager(DetectActivity.this,
                LinearLayoutManager.HORIZONTAL, true);
        mRecyclerview.setLayoutManager(mLayoutManager);
//        mRecyclerview.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.HORIZONTAL));
        mLayoutManager.setStackFromEnd(true);
        mRecyclerview.setAdapter(mRecyAdapter);
    }

    private void setCameraType(CameraImageSource cameraImageSource) {
        // TODO 选择使用前置摄像头
        cameraImageSource.getCameraControl().setCameraFacing(ICameraControl.CAMERA_FACING_FRONT);

        // TODO 选择使用usb摄像头
//          cameraImageSource.getCameraControl().setCameraFacing(ICameraControl.CAMERA_USB);
        // 如果不设置,人脸框会镜像,显示不准
        //  previewView.getTextureView().setScaleX(-1);

        // TODO 选择使用后置摄像头
//         cameraImageSource.getCameraControl().setCameraFacing(ICameraControl.CAMERA_FACING_BACK);
        // previewView.getTextureView().setScaleX(-1);
    }

 

demo链接:https://download.csdn.net/download/meixi_android/11041930

在线回复bug:qq1085220040

 

运行效果

 

优化采集速度代码:

// 设置回调,回调人脸检测结果。
faceDetectManager.setOnFaceDetectListener((retCode, infos, frame) -> {

    LogPlus.e("###人脸检测结果:" + retCode + ",infos:" + GsonUtil.getInstance().parseObjToJsonStr(infos));
    // TODO 显示检测的图片。用于调试,如果人脸sdk检测的人脸需要朝上,可以通过该图片判断
    //final Bitmap bitmap = Bitmap.createBitmap(frame.getArgb(), frame.getWidth(), frame.getHeight(), Bitmap.Config.ARGB_8888);

    if (infos == null) {
        // null表示,没有人脸。
        LogPlus.e("###没有检测到人脸");
        setTips("没有检测到人脸");
        Bitmap faceBitmap = Bitmap.createBitmap(frame.getArgb(), frame.getWidth(), frame.getHeight(), Bitmap.Config.ARGB_8888);
        upload(faceBitmap);
    } else {
        /*有人脸*/
        setTips("人脸上传...");
        Bitmap faceBitmap = FaceCropper.getFace(frame.getArgb(), infos[0], frame.getWidth());
        upload(faceBitmap);
    }
});

 在线交流人脸bug:QQ1085220040

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值