很简单的人脸识别功能,识别人脸后用矩形圈出来
实现人脸识别需要模型文件,opencv再带的模型文件在OpenCV-android-sdk\sdk\etc内
我使用haarcascade_frontalface_alt.xml来做人脸识别
把haarcascade_frontalface_alt.xml文件拉到项目raw文件夹,没有创建一个
初始化
InputStream is = getResources().openRawResource(R.raw.haarcascade_frontalface_alt);
File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
File mCascadeFile = new File(cascadeDir, "haarcascade_frontalface_alt.xml");
try {
FileOutputStream os = new FileOutputStream(mCascadeFile);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
is.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
cascadeDir.delete();
cascadeClassifier = new CascadeClassifier(mCascadeFile.getAbsolutePath());
在onCameraFrame函数内实现
MatOfRect faces = new MatOfRect();
if (cascadeClassifier != null) {
cascadeClassifier.detectMultiScale(g, faces, 1.1, 1, 1,
new Size(absoluteFaceSize, absoluteFaceSize), new Size());
}
// 检测出多少个人脸
Rect[] facesArray = faces.toArray();
for (int i = 0; i < facesArray.length; i++) {
Imgproc.rectangle(r, facesArray[i].tl(), facesArray[i].br(), new Scalar(0, 255, 0, 255), 3);
}
return r;
onCameraFrame函数在前面文章有用到,但这样写会很卡,可以用多线程,一个线程渲染,一个线程后台人脸识别,返回结果画出来,可能会有一定的延迟,但总比卡顿好