成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

移動開發 Android
通過兩個主要的API,Android提供了一個直接在位圖上進行臉部檢測的方法,這兩個API分別是 android.media.FaceDetector和android.media.FaceDetector.Face,已經包含在Android官方API中。本教程來自Developer網站,向大家介紹了這些API,同時提供教程中實例代碼下載。

 

[[68937]]

 

圖片來源:Wikipedia

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

via cdstm.cn

構建一個人臉檢測的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.    
  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. }  

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

  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:單一人臉檢測

多人臉檢測

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

  1. private static final int MAX_FACES = 10;  

圖2展示檢測到多張人臉的情況。

 

 

圖2:多人人臉檢測

定位眼睛中心位置

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

下面的代碼中,我們將setFace()放在doLengthyCalc()中。同時圖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
責任編輯:冰凝兒 來源: developer
相關推薦

2017-01-23 21:35:58

Android人臉檢測介紹

2013-08-26 10:53:26

人臉檢測API

2020-12-30 08:20:04

人臉檢測Retina FacemobileNet

2024-06-12 12:57:12

2019-07-02 08:00:00

JavaScriptWeb對象

2024-04-15 00:00:01

GoogleAndroid機器學習

2023-11-23 12:43:53

人臉識別程序

2024-07-18 00:00:25

PyTorch神經網絡

2018-01-23 09:17:22

Python人臉識別

2019-03-27 15:10:02

開源人臉檢測庫

2018-05-08 14:25:22

Pythondlib人臉檢測

2009-06-16 09:41:00

2015-02-10 10:08:59

JavaScript

2018-05-02 15:41:27

JavaScript人臉檢測圖像識別

2024-04-03 09:48:28

人臉檢測識別JS開源

2018-07-10 15:50:29

2022-04-05 20:54:21

OpenCVPython人臉檢測

2016-09-26 08:09:53

人臉識別seetaface開源

2020-11-02 11:24:52

算法人臉識別技術

2018-03-12 16:42:11

華為云
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩有码一区二区三区 | 午夜影院在线观看 | 黄a网站| 国产精品久久久久久网站 | av永久免费 | 国产乱码精品一区二区三区忘忧草 | 欧美日韩一区二区三区四区五区 | 日本成人三级电影 | 欧美性一区二区三区 | 欧美日韩中文字幕在线 | 精品九九九 | 欧美日韩一区精品 | 国产精品一区二区无线 | 成人国产精品久久久 | 国产二区三区 | 中国一级特黄真人毛片 | 国产精品久久网 | 久久久www成人免费无遮挡大片 | 国内自拍视频在线观看 | 亚洲精品在线免费观看视频 | 国产高清视频 | 免费看91| 久久国产一区二区三区 | 亚洲精品久久久一区二区三区 | 欧美日韩久久 | 国产高清精品一区二区三区 | 天天干人人| 日韩在线观看一区 | 四虎影院一区二区 | 久久国产一区 | 国产亚洲精品美女久久久久久久久久 | 国产日韩一区 | 欧美成人免费在线 | 亚洲精品三级 | 黄色片在线观看网址 | 狠狠草视频 | av网站免费 | 日日夜夜免费精品视频 | 在线视频中文字幕 | av中文在线观看 | 成人免费视屏 |