android 多媒体和相机详解十
检测可用的特性
图1.红线表示在相机预览中指定一个Camera.Area所在的坐标系.蓝框表示一个相机区域的位置和形状,其坐标值为:333,333,667,667.
此坐标系的边界总是与相机预览图像的外边界一至,并且不会随着变焦变大或变小.同样的,使用Camera.setDisplayOrientation()旋转预览图像也不会改变做标系.
人脸检测对于包含人的图像,脸往往是图像中最重要的部分,并且在拍照时,脸部被用于对焦和白平衡.Android 4.0 (API Level 14)框架提供了识别面部的和跟据其计算图像设置的API们.
注:当启用面部检测特性时,setWhiteBalance(String), setFocusAreas(List) 和setMeteringAreas(List)不再起作用.
使用面部检测特性通常需要以下几步:
l 检查设备是否支持面部检测
l 创建一个面部检测监听器
l 添加面部检测监听器到你的相机对象.
l 预览开始后开始面部检测(并且每次重启预览后同样)
面部检测特性不是在所有的设备上都支持.你可以调用getMaxNumDetectedFaces()来检测是否支持.
为了接收到面部检测的通知并作出响应,你的相机应用中必须为面部检测事件设置一个监听器.所以你必须创建一个监听类,它实现Camera.FaceDetectionListener接口,如下代码所示:
public void surfaceCreated(SurfaceHolder holder) { try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); startFaceDetection(); // start face detection feature } catch (IOException e) { Log.d(TAG, "Error setting camera preview: " + e.getMessage()); }}public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { if (mHolder.getSurface() == null){ // preview surface does not exist Log.d(TAG, "mHolder.getSurface() == null"); return; } try { mCamera.stopPreview(); } catch (Exception e){ // ignore: tried to stop a non-existent preview Log.d(TAG, "Error stopping camera preview: " + e.getMessage()); } try { mCamera.setPreviewDisplay(mHolder); mCamera.startPreview(); startFaceDetection(); // re-start face detection feature } catch (Exception e){ // ignore: tried to stop a non-existent preview Log.d(TAG, "Error starting camera preview: " + e.getMessage()); }}注:记住在调用startPreview()后要调用此函数.不要试图在你的应用的actvitiy的onCreate()中启动脸部检测,因为此时预览还没有启动呢.