前言
本文讲述如何在Android上调用双目摄像头(不管是usb双目摄像头还是内置双目摄像头(一般是平板)),进行实时预览,预览操作是分别打开摄像头并使用两个SurfaceView同时预览,并使用自带的人脸检测api进行人脸检测。其实,双目摄像头调用跟常规相机调用方式差不多,双目无非就是Camera .open(0)和Camera.open(1),Camera.open(0)可能是RGB或IR,同理Camera.open(1)也可能是RGB或IR,出现这种情况一般是工控机和usb双目摄像头没有固定输出。此外双目摄像头是定焦,是不能聚焦的。
国际规则,先上图
双目摄像头理解
双目摄像头组成,目前大多是一个RGB 摄像头加一个近红外摄像头。RGB一个做人脸识别,IR做活体检测。
对于单目RGB摄像头,一般只能通过配合式活体检测(根据指示做相应动作)来进行活体检测,这在用户体验上差了很多,而且对于算法要求很高,其精确度也难以比上双目方案。所以具有近红外摄像头的双目模组,在活体检测方面的作用是远大于普通单目彩色摄像头。
简单来说,使用双摄像头做活体检测的,都是非配合式活体检测,不需要根据提示做一些诸如眨眼、点头之类的动作,对算法要求更高,但是速度更快, 对用户体验也更友好。
目前市面上第三方人脸识别做的比较的好的有百度,虹软,阅面,商汤等厂家,一般支持双目活体检测。
双目摄像头调用流程
- 创建SurfaceView
- 在SurfaceView onCreate处,打开Camera
- 对Camera设置参数,预览大小、照片大小、预览格式,预览监听等等
- 开始预览
- 停止预览,释放相机资源,移除SurfaceView的回调
注意:
- 每个摄像头走一遍流程,Camera要设置支持的参数,特别是预览大小和照片大小
- 由于不同厂家的摄像头存在差异,通过下面代码获取相机旋转角度不一定对的,导致预览方向和人眼看到的方向不一定对,建议加个配置页面设置相机旋转角度。
- 角度不对会影响人脸的跟踪框的计算,定位不准
//mCamera.setDisplayOrientation(getRotateAngle());
private int getRotateAngle() {
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(mCameraId, info);
// 获取当前手机的选装角度
int rotation = ((WindowManager) getContext()
.getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay()
.getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360;
} else {
result = (info.orientation - degrees + 360) % 360;
}
return result;
}
关于相机角度及上面代码的理解可参考下图(图片来源于网络):

项目地址: