基于openCV+Android的人脸签到

这是大二做的课程设计,以免以后用到再遇到坑就把关键的东西记录一下。

关于环境搭配就不多提了,自行Google。

首先,是摄像头的调用,这里使用opencv封装JavaCameraView

至于摄像头旋转90°问题,这里并没有影响,所以没有改写函数,有兴趣的朋友可以Google,这里不展开细说。

 openCvCameraView = new JavaCameraView(this, -1);
        setContentView(openCvCameraView);
        openCvCameraView.setCvCameraViewListener(this);
        openCvCameraView.setCameraIndex(CameraBridgeViewBase.CAMERA_ID_FRONT);//为前置摄像头

接来下是是人脸识别:其过程是采用opencv提供的lbpcascade_frontalface分类器

要是识别出人脸就标记矩形框并保存图片到手机,以备下面人脸匹配时用。

  public Mat onCameraFrame(Mat aInputFrame) {

        Imgproc.cvtColor(aInputFrame, grayscaleImage, Imgproc.COLOR_RGBA2RGB);
        MatOfRect faces = new MatOfRect();
        //使用分类器
        if (cascadeClassifier != null) {
            cascadeClassifier.detectMultiScale(grayscaleImage, faces, 1.1, 2, 2,
                    new Size(absoluteFaceSize, absoluteFaceSize), new Size());
        }
        Rect[] facesArray = faces.toArray();
        int faceCount = facesArray.length;
        if (faceCount > 0) {
            faceSerialCount++;
        } else {
            faceSerialCount = 0;
        }
        for (int i = 0; i <facesArray.length; i++)
            Imgproc.rectangle(aInputFrame, facesArray[i].tl(), facesArray[i].br(), new Scalar(0, 255, 0, 255), 3);
//这里是因为opencv易受光线像素影响,所以要判断连续6贞有人脸,就保存图片。
        if (faceSerialCount == 6) {
            dt = new Date();
            str_time = dt.toLocaleString();
            Imgcodecs.imwrite("/sdcard/storage/emulated/0/Face/"+str_time+".jpg",aInputFrame);
            faceSerialCount = -9999;
            
        }
        return aInputFrame;
    }

有了人脸,接下来就是人脸匹配识别了。这里由于当时时间以及知识不够,没法写自己人脸训练库(大概这个暑假实现),所以用了face++的Search API。环境配置自行Google

该API文档看这里

对了,使用Search API之前先要创建自己的faceset

这个创建只要执行一次即可。

                        String faceTokens = creatFaceTokens(faces);
                        Response faceset = FaceSet.createFaceSet("employeeface",employee1,employee1,faceTokens,null, 1);
                        String faceSetResult = new String(faceset.getContent());      

有了faceset自然要添加face这里使用addface.

这里也是执行一次就行。

                        Response faceadd = FaceSet.addFaceByOuterId(faceTokenbs,employee1);
                        String faceSetResult5 = new String(faceadd.getContent());

接下来便是Search API人脸匹配啦

  Response bossres = commonOperate.searchByOuterId(null,null,facepath0 , boss, 1);
                        String bsresult = new String(bossres.getContent());

该返回值是一些json数据自己处理一下便可得到想要的东西。其中最重要的是"confidence"表示人脸相似度

千万不能忘记要在manifest加权限!!!

 <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />

最后上一些截图:


写在最后:由于这个人脸匹配使用的是第三方接口(而且我用的时试用key),所以很多东西要根据它的返回值来写,其中有一个userID我并没有找到在哪可以加入,所以返回一直为空,这也导致了我要为每个人建立一个faceset,从而这东西变得实用性不强。再有,调用接口的时候并不能每次都能成功(晚上成功几率很大)因为是试用key所以它会限制你的QPS从而报这个错

CONCURRENCY_LIMIT_EXCEEDED

你多试几遍就ok。

所以这更加激发了我暑假自己弄人脸训练库的决心!

--------------------------------------------------------------------------------------------------------------

   第一次写blog,水平有限,多多包涵。源代码我会找时间整理好打包上传


 

猜你喜欢

转载自blog.csdn.net/Luoyonghuan/article/details/80719616
今日推荐