Android相機之人臉識別

Android相機  人臉識別 
第⼀章
Camera基礎⼊入⻔門
第⼆章
基於Google自帶算法實時檢測人臉

摘要
這裏寫圖片描述

有人玩過三星Galaxy Camera嗎?一款採用Android的智能相機,不過似乎沒人知 道Android最早是爲相機而生的,並不是手機。Android早期開發者安迪·魯賓在 一次會議上表示,他們最初的目標是利用Android創建一個能夠與PC聯網的“智能 相機”世界,誰知道用在手機上火了。

• 人臉識別技術的應用: 1、爲Camera添加人臉識別的功能,使得Camera的取景器上能標識出人臉範圍;如果硬件 支持,可以對人臉進行對焦。 2、爲相冊程序添加按人臉索引相冊的功能,按人臉索引相冊,按人臉分組,搜索相冊。

這裏寫圖片描述


這裏寫圖片描述

Camera如何完成拍照?
• 拍照權限
uses-permission android:name=“android.permission.CAMERA”
Camera如何完成拍照?
1. 開始取景
startPreview()
2. 拍照 takePicture()
3. 停止取景 stopPreview()
4. 釋放相機 release()
• 打開相機(獲取Camera對象) Camera open(int cameraId)
• 獲取系統默認設置參數 Parameters getParameters()
• 根據需要修改參數 setParameters(Parameters params)
• 設置屏幕方向 setDisplayOrientation(int)
• 設置取景區載體 setPreviewDisplay(SurfaceHolder)

• 開啓相機
Camera open(int cameraId) 創建一個對象來訪問相機硬件。2.3版本之後支持前後攝像頭(0代表後置,1代 表前置) 注意:同一時間只能有一個對象,使用完成後,必須調用release(),否則會 繼續佔用相機硬件,其他應用也就無法正常使用相機 事例:NS上開啓如果使用CameraService開啓的手電筒,無法啓動相機 提示:此方法是個耗時的操作,google建議使用worker thread,來避免UI線 程被阻塞

• 相機參數設置 獲取參數:mCameraDevice.getParameters() 對焦方式
setFocusMode(String value)
像素大小
setPictureSize(int width, int height) 其他設置請參考Camera.Parameters類 設置參數:mCameraDevice.setParameters()

• 設置屏幕顯示角度 setDisplayOrientation(int degrees)

這裏寫圖片描述

• 設置Surface
setPreviewDisplay(SurfaceHolder holder)
setPreviewTexture(SurfaceTexture surfaceTexture) Surface是拍照的必要元素。這兩個方法存在這互斥的關係。如果使用SurfaceView,必 須爲SurfaceHolder註冊
SurfaceHolder.Callback回調。
這兩種方式都需要在startPreview()之前調用。
• Surfaceà原始圖像緩存區的句柄
• SurfaceViewà提供了一個用於專門繪製的Surface,可以通過SurfaceHolder對象去訪問 Surface

• 開始取景
startPreview() 開始捕捉預覽幀並繪製到屏幕上。在surface提供之前,preview並沒有真正的開始工作。

• 拍照
takePicture(ShutterCallback shutter,
PictureCallback raw,
PictureCallback postview,
PictureCallback jpeg)
觸發一次非同步的拍照。Camera Services會初始化一系列的回調事件來完成拍照過程。
• ShutterCallback:
拍照後會觸發shutter callback。這個通常用來觸發拍照聲音,讓用戶知道已經拍照了。 應用實例:靜音拍攝。

• RawPictureCallback
當raw image data數據可用時會調用這個raw callback,數據是沒有經過壓縮的(注意: 如果raw image data的buffer不可用或者buffer的大小不夠大,那麼raw image data爲 null)
可以通過addRawImageCallbackBuffer(byte[] callbackBuffer)來設置buffer,不過這 個方法是hide的
• PostPictureCallback
當進過縮放和完全處理過的postview image可用的時候,回調用post callback。(注意: 這個方法不是所有的機型都支持)

• JPEGPictureCallback 當image數據壓縮完成之後,纔會調用jpeg callback。 一般應用程序會在此回調方法中完成:
1、照片的存儲
2、縮略圖的生成 3、以及爲下次拍照做準備(startPreview()) 如果應用程序中不需要某個回調,可以將其參數設置爲null。

• 注意事項: android.hardware.Camera是非線程安全的。大多數的耗時操作(如preview, focus, photo capture)都是異步的,所以我們會在回調函數中進行相應的操作。這個類中的方 法不能在不同的線程中同時調用。
事例:native_setParameter() failed
capture() failed
autofocus() failed

第⼆章

Google於2006年8月收購Neven Vision公司(該公司擁有10多項應用於移動設備領域的圖像 識別的專利),以此獲得了圖像識別的技術,並加入到Android中。Android中的人臉識別 技術,用到的底層庫:android/external/neven/,framework層:frameworks/base/ media/Java/android/media/FaceDetector.java)。
所謂人臉檢測就是指從一副圖片或者一幀視頻中標定出所有人臉的位置和尺寸。

• 關於FaceDetection:
FaceDetection是Android ICE_CREAM_SANDWICH(android Version 4.0,ADT 14)版開 始增加的功能,實際是否支持還得依賴於設備自身的限制 (Camera.Parameters.getMaxNumDetectedFaces() > 0)

• 檢測人臉主要分成兩個部分:
1、在預覽界面實時檢測人臉(動態實時)
2、給某張圖片做人臉檢測(靜態)

• 預覽界面如何檢測人臉?
1、FaceDetectionListeneràvoid onFaceDetection(Face[] faces, Camera camera)
2、啓動FaceDetectionàCamera.startFaceDetection()
3、停止FaceDetectionàCamera.stopFaceDetection()
4、Camera.FaceàRect rect臉部界限,Point leftEye左眼的中心座標,Point rightEye右眼的中心座標,Pont mouth嘴的中心座標

• 注意事項: 檢測到的人臉rect默認是以預覽界面爲座標系,這個座標系是經過變換的,中心點爲 (0,0),左上頂點座標是(-1000,-1000),右下頂點是(1000,1000),也就是說不管預覽 Surfaceview多大,檢測出來的頂點爲(0,0),橫爲x軸,豎爲y軸,這就需要把rect座標 變換下。

圖片如何檢測人臉?
Android提供了一個直接在位圖上進行臉部檢測的方法,這兩個API分別是 android.media.FaceDetector和android.media.FaceDetector.Face,已經包含在Android 官方API中。

• 圖片如和檢測人臉?
1、FaceDetectoràint findFaces(Bitmap bitmap, Face[] faces)
2、FaceDetector.Faceàfloat eyesDistance()返回兩眼距離,void getMidPoint(PointF point)設置兩眼的中心點

• Java層接口的限制:
1、只能接受Bitmap格式的數據。 2、只能識別雙眼距離大於20像素的人臉像(當然,這個可在framework層中修改)。
3、只能檢測出人臉的位置(雙眼的中心點及距離),不能對人臉進行匹配(查找指定的 臉譜)。
4、包含人臉的位圖文件必須是565格式。

在線視頻地址:鏈接: https://pan.baidu.com/s/1qYCnsRU 密碼: fajh

github上的代碼鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章