Android API教程:人脸检测(Face Detect)


通过两个主要的API,Android提供了一个直接在位图上进行脸部检测的方法,这两个API分别是    android.media.FaceDetector和android.media.FaceDetector.Face,已经包含在Android官方API中。本教程来自Developer网站,向大家介绍了这些API,同时提供教程中实例代码下载(见  )。

图片来源:Wikipedia

所谓人脸检测就是指从一副图片或者一帧视频中标定出所有人脸的位置和尺寸。人脸检测是人脸识别系统中的一个重要环节,也可以独立应用于视频监控。在数字媒体日益普及的今天,利用人脸检测技术还可以帮助我们从海量图片数据中快速筛选出包含人脸的图片。 在目前的数码相机中,人脸检测可以用来完成自动对焦,即“脸部对焦”。“脸部对焦”是在自动曝光和自动对焦发明后,二十年来最重要的一次摄影技术革新。家用数码相机,占绝大多数的照片是以人为拍摄主体的,这就要求相机的自动曝光和对焦以人物为基准。

构建一个人脸检测的Android Activity

你可以构建一个通用的Android Activity,我们扩展了基类ImageView,成为MyImageView,而我们需要进行检测的包含人脸的位图文件必须是565格式,API才能正常工作。被检测出来的人脸需要一个置信测度(confidence measure),这个措施定义在android.media.FaceDetector.Face.CONFIDENCE_THRESHOLD。

最重要的方法实现在setFace(),它将FaceDetector对象实例化,同时调用findFaces,结果存放在faces里,人脸的中点转移到MyImageView。代码如下:

  1. public class TutorialOnFaceDetect1 extends Activity { 
  2.  private MyImageView mIV; 
  3.  private Bitmap mFaceBitmap; 
  4.  private int mFaceWidth = 200
  5.  private int mFaceHeight = 200
  6.  private static final int MAX_FACES = 1
  7.  private static String TAG = "TutorialOnFaceDetect"
  8.  
  9. @Override 
  10. public void onCreate(Bundle savedInstanceState) { 
  11. super.onCreate(savedInstanceState); 
  12.  
  13. mIV = new MyImageView(this); 
  14. setContentView(mIV, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
  15.  
  16. // load the photo 
  17. Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.face3); 
  18. mFaceBitmap = b.copy(Bitmap.Config.RGB_565, true); 
  19. b.recycle(); 
  20.  
  21. mFaceWidth = mFaceBitmap.getWidth(); 
  22. mFaceHeight = mFaceBitmap.getHeight(); 
  23. mIV.setImageBitmap(mFaceBitmap); 
  24.  
  25. // perform face detection and set the feature points setFace(); 
  26.  
  27. mIV.invalidate(); 
  28.  
  29. public void setFace() { 
  30. FaceDetector fd; 
  31. FaceDetector.Face [] faces = new FaceDetector.Face[MAX_FACES]; 
  32. PointF midpoint = new PointF(); 
  33. int [] fpx = null
  34. int [] fpy = null
  35. int count = 0
  36.  
  37. try { 
  38. fd = new FaceDetector(mFaceWidth, mFaceHeight, MAX_FACES); 
  39. count = fd.findFaces(mFaceBitmap, faces); 
  40. catch (Exception e) { 
  41. Log.e(TAG, "setFace(): " + e.toString()); 
  42. return
  43.  
  44. // check if we detect any faces 
  45. if (count > 0) { 
  46. fpx = new int[count]; 
  47. fpy = new int[count]; 
  48.  
  49. for (int i = 0; i < count; i++) { 
  50. try { 
  51. faces[i].getMidPoint(midpoint); 
  52.  
  53. fpx[i] = (int)midpoint.x; 
  54. fpy[i] = (int)midpoint.y; 
  55. catch (Exception e) { 
  56. Log.e(TAG, "setFace(): face " + i + ": " + e.toString()); 
  57.  
  58. mIV.setDisplayPoints(fpx, fpy, count, 0); 
  • 1
  • 2
  • 3
  • 下一页

相关内容