脸识别

人脸识别

最近在做一款商户入网的应用,为防止不法商户对公司渠道的接入,公司加大了对商户的审核,人脸识别就是其中的一项。人脸识别的第一步是检测商户的张嘴动作,通过之后采集照片,上传到服务器。第二步是检测商户的摇头动作,通过之后采集照片,上传到服务器。至此完成人脸识别。下面我对主干代码进行分析:

首先导入jar包Msc(讯飞)。检测人脸关键部位的坐标

private void setFaceDetection() {
        mThread = new Thread(new Runnable() {
            @Override
            public void run() {
                List<Object> previewDate = CameraInterface.getInstance()
                        .getPreviewDate();
                buffer = (byte[]) previewDate.get(0);
                nv21 = (byte[]) previewDate.get(1);
                while (!mStopTrack) {
                    if (null == nv21) {
                        continue;
                    }
                    synchronized (nv21) {
                        System.arraycopy(nv21, 0, buffer, 0, nv21.length);
                    }
                    // 获取手机朝向,返回值0,1,2,3分别表示0,90,180和270度
                    int direction = Accelerometer.getDirection();
                    boolean frontCamera = (Camera.CameraInfo.CAMERA_FACING_FRONT == mCameraId);
                    // 前置摄像头预览显示的是镜像,需要将手机朝向换算成摄相头视角下的朝向。
                    // 转换公式:a‘ = (360 - a)%360,a为人眼视角下的朝向(单位:角度)
                    if (frontCamera) {
                        // SDK中使用0,1,2,3,4分别表示0,90,180,270和360度
                        direction = (4 - direction) % 4;
                    }
                    if (mFaceDetector == null) {
                        /**
                         * 离线视频流检测功能需要单独下载支持离线人脸的SDK 请开发者前往语音云官网下载对应SDK
                         */
                        ShowToast.showToast(getActivity(), "本SDK不支持离线视频流检测");
                        break;
                    }

                    String result = mFaceDetector.trackNV21(buffer,
                            PREVIEW_WIDTH, PREVIEW_HEIGHT, isAlign, direction);

                    FaceRect[] faces = ParseResult.parseResult(result);

                    drawRect(frontCamera, faces);

                }
            }

对人脸动作的检测

if (isFace) {
                        // 进行活体检测
                        if (rectLength >= 160 && rectLength < 180) {
                            // 判断张嘴后进行拍照
                            if (mouth_bt >= 40 && !isOpenMouth) {
                                isOpenMouth = true;
                                isShakeHead = true;
                                mHandler.sendEmptyMessageDelayed(
                                        StaticArguments.FACE_OPEN_MOUTH, 1000);
                            }
                            // 进行摇头判断
                            if (eyebrow_mlr_y < 79 && eyebrow_mlr_y >= 0
                                    && isShakeHead) {
                                isOpenMouth = true;

                                countHead++;
                                if (countHead % 2 == 0) {
                                    mHandler.sendEmptyMessageDelayed(
                                            StaticArguments.FACE_SHAKE_HEAD,
                                            3000);
                                }
                            }

                        } else if (rectLength >= 180 && rectLength < 200) {
                            // 判断张嘴后进行拍照
                            if (mouth_bt >= 45 && !isOpenMouth) {
                                isShakeHead = true;
                                isOpenMouth = true;
                                mHandler.sendEmptyMessageDelayed(
                                        StaticArguments.FACE_OPEN_MOUTH, 1000);
                            }
                            // 进行摇头判断
                            if (eyebrow_mlr_y < 89 && eyebrow_mlr_y >= 0
                                    && isShakeHead) {
                                isOpenMouth = true;

                                countHead++;
                                if (countHead % 2 == 0) {
                                    mHandler.sendEmptyMessageDelayed(
                                            StaticArguments.FACE_SHAKE_HEAD,
                                            1000);
                                }
                            }
                        } else if (rectLength >= 200 && rectLength < 340) {
                            // 判断张嘴后进行拍照
                            if (mouth_bt >= 50 && !isOpenMouth) {
                                isShakeHead = true;
                                isOpenMouth = true;
                                mHandler.sendEmptyMessageDelayed(
                                        StaticArguments.FACE_OPEN_MOUTH, 500);
                            }
                            // 进行摇头判断
                            if (eyebrow_mlr_y < 95 && eyebrow_mlr_y >= 0
                                    && isShakeHead) {
                                isOpenMouth = true;

                                countHead++;
                                if (countHead % 2 == 0) {
                                    mHandler.sendEmptyMessageDelayed(
                                            StaticArguments.FACE_SHAKE_HEAD,
                                            1000);
                                }
                            }
                        } else if (rectLength < 160) {// 检测脸部离手机太远
                            mHandler.sendEmptyMessage(StaticArguments.FACE_LENGTH_LONG);
                        } else if (rectLength >= 340 && rectLength >= 0) {// 检测脸部离手机太近
                            mHandler.sendEmptyMessage(StaticArguments.FACE_LENGTH_NEAR);
                        }
}

人脸张嘴或者摇头的动作后捕获视频的帧数据

public void doStartPreview(SurfaceHolder holder, float previewRate) {

        if (isPreview) {
            mCamera.stopPreview();
            return;
        }

        if (mCamera != null) {
            mParams = mCamera.getParameters();
            mParams.setPictureFormat(PixelFormat.JPEG);// 设置拍照后存储的图片格式
            // 设置PreviewSize和PictureSize
            mParams.setPreviewFormat(ImageFormat.NV21);
            mParams.setPreviewSize(PREVIEW_WIDTH, PREVIEW_HEIGHT);
            mCamera.setParameters(mParams);
            mCamera.setDisplayOrientation(90);
            List<String> focusModes = mParams.getSupportedFocusModes();
            if (focusModes.contains("continuous-video")) {
                mParams.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
            }
            mCamera.setPreviewCallback(new PreviewCallback() {
                @Override
                public void onPreviewFrame(byte[] data, Camera camera) {
                    System.arraycopy(data, 0, nv21, 0, data.length);
                    if (takePictureFlag == 1) {
                        Bitmap mBitmap = null;
                        Camera.Parameters parameters = camera.getParameters();
                        int format = parameters.getPreviewFormat();
                        if (format == PixelFormat.YCbCr_420_SP
                                || format == PixelFormat.YCbCr_422_I) {
                            int w = parameters.getPreviewSize().width;
                            int h = parameters.getPreviewSize().height;
                            int[] i = new int[data.length];
                            decodeYUV420SP(i, data, w, h);
                            mBitmap = Bitmap.createBitmap(i, w, h,
                                    Bitmap.Config.RGB_565);
                        } else if (format == PixelFormat.JPEG
                                || format == PixelFormat.RGB_565) {
                            mBitmap = BitmapFactory.decodeByteArray(data, 0,
                                    data.length);
                        }
                        if (null != mBitmap) {
                            if (takePictureFlag == 1) {
                                takePictureFlag++;
                            } else {
                                return;
                            }
                            // 设置FOCUS_MODE_CONTINUOUS_VIDEO)之后,myParam.set("rotation",
                            // 90)失效。
                            // 图片竟然不能旋转了,故这里要旋转下
                            Bitmap rotateImage = FaceUtil.rotateImage(270,
                                    mBitmap);

                            if (mListener != null) {
                                mListener.onTakePictuerResult(rotateImage);
                            }
                        }
                    }
                }
            });

            try {
                mCamera.setPreviewDisplay(holder);
                mCamera.startPreview();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            isPreview = true;
        }

    }

源码下载地址:

https://github.com/reachchen/FaceRecognition

时间: 2024-11-05 11:00:58

脸识别的相关文章

京东金融大数据竞赛猪脸识别(1)-从视频提取图像

2017年11月的京东金融大数据竞赛参与人数最多的是猪脸识别的算法比赛,参加整个大数据比赛的有四千多人,而猪脸识别算法组就有一千多人.可见,搞图像识别的的人很多啊.想要提升自己价值的小伙伴们,向语音.文本.机器人等领域进发吧,有了机器学习的基础,入门这些领域应该都不是太难.比赛给的数据是30头猪的视频,做识别的第一步还是从视频中去图像吧.本想用以前写过的视频取帧程序.看Matlab示例的时候发现用Matlab取帧更简便易行,那就用它吧.这样又省了很多时间.代码如下: %exam1.m extra

京东金融大数据竞赛猪脸识别(7)- 识别方法之四

除了softmax层构建的深度网络,Matlab还有一个简单的构建数据分类的函数,那就是patternnet,其用法类似.可以直接对图像特征数据处理,也可以对图像集处理.代码如下: %exam1.m 用训练图像特征构建深度网络并计算测试图像得分 clear; load('JDPig_mlhmslbp_spyr.mat'); m = numel(classe_name); n = length(y); label = [] for i=1:n label(:,i) = zeros(m,1); la

Python 实现的猫脸识别、人脸识别器。

代码地址如下:http://www.demodashi.com/demo/13071.html 前言: OpenCV是开源的跨平台计算机视觉库,提供了Python等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法. opencv中内置了基于Viola-Jones目标检测框架的Harr分类器,只需要载入一个配置文件(haarcascade_frontalface_alt.xml)就能直接调用detectObject去完成检测过程,同时也支持其他特征的检测(如鼻子.嘴巴等). 本程序用wxP

脸识别API微软牛津项目

微软牛津项目人脸识别API初探 按照董子的这篇博客中的介绍,到微软牛津项目的网站申请到测试用的人脸识别Key,按照官方文档的介绍,把wpf项目建好之后,按照一步步的流程下来就可以完成example中的功能了.但是这仅仅是个example,图片不能太大,不然会出现溢出错误.之前关注过牛津项目,后来不知道竟然中文版的官网也出来了,只是中文的文档翻译的是在是太不堪入目了,不过这也保持了微软的一贯的风格. 我的环境是:win7 64bit+VS2015+.Net4.5+C#PS:最好把 drawingC

京东金融大数据竞赛猪脸识别(2)- 图像特征提取之一

图像识别进入深度学习时代后,特征提取这个词的使用频率明显下降了.因为深度网络已经完成了从图像输入到分类结果输出的全过程,似乎不需要再关心特征的好坏和特征提取对于识别结果的影响.不过,不管从算法研究还是工程实现角度看,将特征提取独立出来应该更有利.这样我们可以对各种特征提取方法和各种识别算法进行组合,找出效果最好的方案.我们先考虑非神经网络提取的特征,在深度神经网络大热以前,局部特征.空间金字塔.稀疏编码的结合合应该是达到最高识别准确率的方案.它在一些应用场合能够以更低的代价带来不次于深度网络的识

京东金融大数据竞赛猪脸识别(3)-方法选取

由于可用的特征提取和分类器构造方法较多,为了确定选取方法.现在在视频提取的图像上进行算法验证,取这些图像的一部分进行训练,剩余部分进行测试,并进行交叉验证.找到准确率最高的方法后再将其用于测试集.以reco_toolbox为例,下面给出方法选取的代码: clc,close all, clear ,drawnow database_name = {'JDPig' }; database_ext = {'jpg' , 'jpg' , 'png'}; descriptors_name = {'dens

京东金融大数据竞赛猪脸识别(9)- 识别方法之五

这里给出使用深度网络中间层输出结果作为图像特征,并构建分类模型和对训练数据进行识别的代码.相关内容可参看Matlab图像识别/检索系列(7)-10行代码完成深度学习网络之取中间层数据作为特征.代码如下: clear trainPath = fullfile(pwd,'image'); trainData = imageDatastore(trainPath,... 'IncludeSubfolders',true,'LabelSource','foldernames'); %对训练数据集进行划分

07-人脸识别-人脸矫正

人脸矫正有几个问题. 1.歪头: 2.侧脸: 3.半边脸:缺失另外半边脸,要寻找其他的解决方案. 大多数情况下,截取到的人脸是包含歪头和侧脸的现象的.这两个问题,可以同时通过仿射变换来矫正. 但是要注意,侧脸,是缺少一部分脸部信息的. 人脸矫正,对歪头的正确度提高有帮助,对侧脸就一般了. 思路: 1.之前步骤已经在每张人脸上找到5个特征: 2.测量 正面脸 的五点对应坐标 pts_dst(这是测量出来的,重要的是5点的位置相对关系): 3.每张脸的5个点坐标 pts_src,其中的鼻子坐标要设置

人工智能APP-人脸识别Face Detection

近来,人工智能十分火热,各类应用也越来越多.人工智能APP 人工智能需要大量数据作为燃料,还需要大量运算,会给人一种高深莫测的感觉. 实际上,AI也不是可望不可即的,因为很多企业都提供了API,多层的处理他们都解决了,我们需要只是调用结果,对人工智能的运用也是可以实现普及化的. 我们也可以利用APP Inventor结合各类API或插件(aix)的运用,使APP更聪明,是值得我们探究的! 人脸识别Face Detection        aia源码与素材     aix扩展组件 主要是利用插件