这是大二做的课程设计,以免以后用到再遇到坑就把关键的东西记录一下。
关于环境搭配就不多提了,自行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
对了,使用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" />
最后上一些截图:
CONCURRENCY_LIMIT_EXCEEDED 你多试几遍就ok。 所以这更加激发了我暑假自己弄人脸训练库的决心! -------------------------------------------------------------------------------------------------------------- 第一次写blog,水平有限,多多包涵。源代码我会找时间整理好打包上传 |