自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android API教程:人臉檢測(cè)(上)

移動(dòng)開發(fā) Android
通過兩個(gè)主要的API,Android提供了一個(gè)直接在位圖上進(jìn)行臉部檢測(cè)的方法,這兩個(gè)API分別是 android.media.FaceDetector和android.media.FaceDetector.Face,已經(jīng)包含在Android官方API中。本教程來自Developer網(wǎng)站,向大家介紹了這些API,同時(shí)提供教程中實(shí)例代碼下載。

 

[[68937]]

 

圖片來源:Wikipedia

所謂人臉檢測(cè)就是指從一副圖片或者一幀視頻中標(biāo)定出所有人臉的位置和尺寸。人臉檢測(cè)是人臉識(shí)別系統(tǒng)中的一個(gè)重要環(huán)節(jié),也可以獨(dú)立應(yīng)用于視頻監(jiān)控。在數(shù)字媒體日益普及的今天,利用人臉檢測(cè)技術(shù)還可以幫助我們從海量圖片數(shù)據(jù)中快速篩選出包含人臉的圖片。 在目前的數(shù)碼相機(jī)中,人臉檢測(cè)可以用來完成自動(dòng)對(duì)焦,即“臉部對(duì)焦”。“臉部對(duì)焦”是在自動(dòng)曝光和自動(dòng)對(duì)焦發(fā)明后,二十年來最重要的一次攝影技術(shù)革新。家用數(shù)碼相機(jī),占絕大多數(shù)的照片是以人為拍攝主體的,這就要求相機(jī)的自動(dòng)曝光和對(duì)焦以人物為基準(zhǔn)。

via cdstm.cn

構(gòu)建一個(gè)人臉檢測(cè)的Android Activity

你可以構(gòu)建一個(gè)通用的Android Activity,我們擴(kuò)展了基類ImageView,成為MyImageView,而我們需要進(jìn)行檢測(cè)的包含人臉的位圖文件必須是565格式,API才能正常工作。被檢測(cè)出來的人臉需要一個(gè)置信測(cè)度(confidence measure),這個(gè)措施定義在android.media.FaceDetector.Face.CONFIDENCE_THRESHOLD。

最重要的方法實(shí)現(xiàn)在setFace(),它將FaceDetector對(duì)象實(shí)例化,同時(shí)調(diào)用findFaces,結(jié)果存放在faces里,人臉的中點(diǎn)轉(zhuǎn)移到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.    
  30. public void setFace() {   
  31. FaceDetector fd;   
  32. FaceDetector.Face [] faces = new FaceDetector.Face[MAX_FACES];   
  33. PointF midpoint = new PointF();   
  34. int [] fpx = null;   
  35. int [] fpy = null;   
  36. int count = 0;   
  37.    
  38. try {   
  39. fd = new FaceDetector(mFaceWidth, mFaceHeight, MAX_FACES);   
  40. count = fd.findFaces(mFaceBitmap, faces);   
  41. } catch (Exception e) {   
  42. Log.e(TAG, "setFace(): " + e.toString());   
  43. return;   
  44. }   
  45.    
  46. // check if we detect any faces   
  47. if (count > 0) {   
  48. fpx = new int[count];   
  49. fpy = new int[count];   
  50.    
  51. for (int i = 0; i < count; i++) {   
  52. try {   
  53. faces[i].getMidPoint(midpoint);   
  54.    
  55. fpx[i] = (int)midpoint.x;   
  56. fpy[i] = (int)midpoint.y;   
  57. } catch (Exception e) {   
  58. Log.e(TAG, "setFace(): face " + i + ": " + e.toString());   
  59. }   
  60. }   
  61. }   
  62.    
  63. mIV.setDisplayPoints(fpx, fpy, count, 0);   
  64. }   
  65. }  

接下來的代碼中,我們?cè)贛yImageView中添加setDisplayPoints() ,用來在被檢測(cè)出的人臉上標(biāo)記渲染。圖1展示了一個(gè)標(biāo)記在被檢測(cè)處的人臉上處于中心位置。

  1. // set up detected face features for display   
  2. public void setDisplayPoints(int [] xx, int [] yy, int total, int style) {   
  3.  mDisplayStyle = style;   
  4.  mPX = null;   
  5.  mPY = null;   
  6.    
  7. if (xx != null && yy != null && total > 0) {   
  8. mPX = new int[total];   
  9. mPY = new int[total];   
  10.    
  11. for (int i = 0; i < total; i++) {   
  12. mPX[i] = xx[i];   
  13. mPY[i] = yy[i];   
  14. }   
  15. }   
  16. }  

 

 

圖1:?jiǎn)我蝗四槞z測(cè)

多人臉檢測(cè)

通過FaceDetector可以設(shè)定檢測(cè)到人臉數(shù)目的上限。比如設(shè)置最多只檢測(cè)10張臉:

  1. private static final int MAX_FACES = 10;  

圖2展示檢測(cè)到多張人臉的情況。

 

 

圖2:多人人臉檢測(cè)

定位眼睛中心位置

Android人臉檢測(cè)返回其他有用的信息,例同時(shí)會(huì)返回如eyesDistance,pose,以及confidence。我們可以通過eyesDistance來定位眼睛的中心位置。

下面的代碼中,我們將setFace()放在doLengthyCalc()中。同時(shí)圖3展示了定位眼睛中心位置的效果。

  1. public class TutorialOnFaceDetect 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 = 10;   
  7.  private static String TAG = "TutorialOnFaceDetect";   
  8. private static boolean DEBUG = false;   
  9.    
  10. protected static final int GUIUPDATE_SETFACE = 999;   
  11. protected Handler mHandler = new Handler(){   
  12. // @Override   
  13. public void handleMessage(Message msg) {   
  14. mIV.invalidate();   
  15.    
  16. super.handleMessage(msg);   
  17. }   
  18. };   
  19.    
  20. @Override   
  21. public void onCreate(Bundle savedInstanceState) {   
  22. super.onCreate(savedInstanceState);   
  23.    
  24. mIV = new MyImageView(this);   
  25. setContentView(mIV, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));   
  26.    
  27. // load the photo   
  28. Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.face3);   
  29. mFaceBitmap = b.copy(Bitmap.Config.RGB_565, true);   
  30. b.recycle();   
  31.    
  32. mFaceWidth = mFaceBitmap.getWidth();   
  33. mFaceHeight = mFaceBitmap.getHeight();   
  34. mIV.setImageBitmap(mFaceBitmap);   
  35. mIV.invalidate();   
  36.    
  37. // perform face detection in setFace() in a background thread   
  38. doLengthyCalc();   
  39. }   
  40.    
  41. public void setFace() {   
  42. FaceDetector fd;   
  43. FaceDetector.Face [] faces = new FaceDetector.Face[MAX_FACES];   
  44. PointF eyescenter = new PointF();   
  45. float eyesdist = 0.0f;   
  46. int [] fpx = null;   
  47. int [] fpy = null;   
  48. int count = 0;   
  49.    
  50. try {   
  51. fd = new FaceDetector(mFaceWidth, mFaceHeight, MAX_FACES);   
  52. count = fd.findFaces(mFaceBitmap, faces);   
  53. } catch (Exception e) {   
  54. Log.e(TAG, "setFace(): " + e.toString());   
  55. return;   
  56. }   
  57.    
  58. // check if we detect any faces   
  59. if (count > 0) {   
  60. fpx = new int[count * 2];   
  61. fpy = new int[count * 2];   
  62.    
  63. for (int i = 0; i < count; i++) {   
  64. try {   
  65. faces[i].getMidPoint(eyescenter);   
  66. eyesdist = faces[i].eyesDistance();   
  67.    
  68. // set up left eye location   
  69. fpx[2 * i] = (int)(eyescenter.x - eyesdist / 2);   
  70. fpy[2 * i] = (int)eyescenter.y;   
  71.    
  72. // set up right eye location   
  73. fpx[2 * i + 1] = (int)(eyescenter.x + eyesdist / 2);   
  74. fpy[2 * i + 1] = (int)eyescenter.y;   
  75.    
  76. if (DEBUG) {   
  77. Log.e(TAG, "setFace(): face " + i + ": confidence = " + faces[i].confidence()   
  78. + ", eyes distance = " + faces[i].eyesDistance()   
  79. + ", pose = ("+ faces[i].pose(FaceDetector.Face.EULER_X) + ","   
  80. + faces[i].pose(FaceDetector.Face.EULER_Y) + ","   
  81. + faces[i].pose(FaceDetector.Face.EULER_Z) + ")"   
  82. + ", eyes midpoint = (" + eyescenter.x + "," + eyescenter.y +")");   
  83. }   
  84. } catch (Exception e) {   
  85. Log.e(TAG, "setFace(): face " + i + ": " + e.toString());   
  86. }   
  87. }   
  88. }   
  89.    
  90. mIV.setDisplayPoints(fpx, fpy, count * 2, 1);   
  91. }   
  92.    
  93. private void doLengthyCalc() {   
  94. Thread t = new Thread() {   
  95. Message m = new Message();   
  96.    
  97. public void run() {   
  98. try {   
  99. setFace();   
  100. m.what = TutorialOnFaceDetect.GUIUPDATE_SETFACE;   
  101. TutorialOnFaceDetect.this.mHandler.sendMessage(m);   
  102. } catch (Exception e) {   
  103. Log.e(TAG, "doLengthyCalc(): " + e.toString());   
  104. }   
  105. }   
  106. };   
  107.    
  108. t.start();   
  109. }   
  110. }   

 

 

圖3:定位眼睛中心位置

【編輯推薦】

  1. Android API中文文檔Button
  2. Android API中文文檔GridView
  3. Android API中文文檔ImageView
責(zé)任編輯:冰凝兒 來源: developer
相關(guān)推薦

2017-01-23 21:35:58

Android人臉檢測(cè)介紹

2013-08-26 10:53:26

人臉檢測(cè)API

2020-12-30 08:20:04

人臉檢測(cè)Retina FacemobileNet

2024-06-12 12:57:12

2019-07-02 08:00:00

JavaScriptWeb對(duì)象

2024-04-15 00:00:01

GoogleAndroid機(jī)器學(xué)習(xí)

2023-11-23 12:43:53

人臉識(shí)別程序

2024-07-18 00:00:25

PyTorch神經(jīng)網(wǎng)絡(luò)

2019-03-27 15:10:02

開源人臉檢測(cè)庫(kù)

2018-01-23 09:17:22

Python人臉識(shí)別

2018-05-08 14:25:22

Pythondlib人臉檢測(cè)

2009-06-16 09:41:00

2015-02-10 10:08:59

JavaScript

2018-05-02 15:41:27

JavaScript人臉檢測(cè)圖像識(shí)別

2024-04-03 09:48:28

人臉檢測(cè)識(shí)別JS開源

2022-04-05 20:54:21

OpenCVPython人臉檢測(cè)

2018-07-10 15:50:29

2016-09-26 08:09:53

人臉識(shí)別seetaface開源

2020-11-02 11:24:52

算法人臉識(shí)別技術(shù)

2018-03-12 16:42:11

華為云
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)