天天看點

Android Camera 相機開發第一篇

相機顯示知識:

  1.      Camera
  2.      SurfaceView  (SurfaceView 也是TextureView,最常用的當然是SurfaceView 是以主講SurfaceView)

                                                                                            倆者關系腦圖

Android Camera 相機開發第一篇

一、SurfaceView 、Surface 、 SurfaceHolder

關系圖

Android Camera 相機開發第一篇

Surface 

      Surface用來處理螢幕内容合成器所管理的原始緩存區的工具,由圖像緩沖區的消費者(如:Surfacetexture)建立然後移交給生産者(如MeddiaPlayer) 或者是顯示到(如:CameraDevice)

 SurfaceHoler

抽象接口,給持有surface的對象使用,可以控制surface的大小和格式,編輯Surface種的像素,以及監聽surface的變化,這個接口通過SurfaceView獲得

 SurfaceHoler中有一個Callback的接口通過腦圖大家可以看到,它的回調方法有3個

  • surfaceCreated(SurfaceHolder holder)                                                                                                                                         suface第一次調用的時候回調
  • surfaceChanged(SurfaceHolder holder,int format ,int width ,int height)                                                                                        surface變化的時候回調   變化為大小和格式
  • surfaceDestroyed(SurfaceHolder holder)                                                                                                                                      suface銷毀的時候回調

SurfaceView

 SurfaceView提供了嵌入視圖層級種的專用Surface,我們可以控制Surface的格式和大小。

SurfaceView則負責把Surface現實在螢幕的正确位置

SurfaceView 其實也是繼承自View,其中倆個成員變量,一個是Surface對象一個是SurfaceHolder對象。

  •  SurfaceView把Surface現實在螢幕
  • SurfaceView通過SurfaceHoder告訴我們Surface的3個狀态  (建立   變化    銷毀)
  • SurfaceView可以通過getHolder()方法獲得目前SurfaceView的SurfaceHolder對象讓就可以對SurfaceHolder對象添加回調的Surface進行監聽狀态
  1. SurfaceView是View的對象
  2. SurfaceView中有倆個對象,Surface和SurfaceHolder
  3. 通過getHolder()方法獲得目前SurfaceView的SurfaceHolder對象

二 、 Camera

Android Camera 相機開發第一篇

Camera類中的内部類

CameraInfo 用來描述相機資訊,通過Camera中getCameInfo(int camerald,CameraInfo cameraInfo)方法獲得,主要包括一下成員變量。

  • facing                                                                                                                                                                                            facing代表相機的方向,它的值隻能是CAMERA_FACING_BACK(後置攝像頭)和CAMERA_FACING_FRONT(前置攝像頭)。
 CAMERA_FACING_BACK(後置攝像頭)和CAMERA_FACING_FRONT(前置攝像頭)Camera中的靜态變量
  •  orientation                                                                                                                                                                                    orientaion是相機采集的角度,他的值是采集到的圖檔順時針旋轉自然的角度值,它必須的0,90,180,270中的一個。        是以可以就可以知道在拿到相機拍照的時候角度為60的話那麼它在怎麼旋轉也不是可以為正的原因。                                    
  • setDisplayOrientation                                                                                                                                                                  設定預覽圖檔的順時針角度。注:這個方法會影響預覽圖像個拍照後現實的圖檔,這個方法對豎屏應用和圖檔非常有效。然後是前攝像頭在進行角度旋轉之前,圖像會進行一個水準的鏡像反轉,是以你打開相機預覽圖像的時候如同照鏡子,但是拍下照來才發現是水準方向的鏡像。                                                                                                                                              注:setDisplayOrientation(int degrees)是Camea類中的一個方法,之是以穿插在這裡來講,是為了和上面提到的orientation做一個統一講解,因為這兩個都涉及到了方向問題
  • 螢幕坐标  在Android系統中,螢幕的左上角是坐标系統的圓點(0,0)坐标。原點向右是X軸的正方向,原點向下是Y軸的正方向。
  • 自然方向 每個裝置都有一個自然方向,手機和平闆的自然方向不同。手機的自然方向是 portait(豎屏),平闆的就是(landscape) 橫屏
  • 圖像傳感器 (imager Sensor) 方向  手機相冊的圖像資料都是來自攝像頭硬體的圖像傳感器,這個傳感器被固定到手機後的一個預設的取景方向
Android Camera 相機開發第一篇
  • 相機的預覽方向   将圖像傳感器捕獲的圖像,現實在螢幕上的方向。在預設 情況下,與預想傳感器方向一緻。在相機API中通過setDisplayOrientation()設定相機預覽方向在預設情況下,這個值為0與圖像傳感器方向一緻。
  • 絕大部分安卓手機中圖像傳感器方向是橫向的,且不能改變,是以orientation是90或是270,也就是說,當點選拍照後儲存圖檔的時候,需要對圖檔做旋轉處理,使其為"自然方向"。 (可能存在一些特殊的定制或是能外接攝像頭的安卓機,他們的orientation會是0或者180)
  • 通過setDisplayOrientation方法設定預覽方向,使預覽畫面為"自然方向"。前置攝像頭在進行角度旋轉之前,圖像會進行一個水準的鏡像翻轉,是以使用者在看預覽圖像的時候就像照鏡子一樣。

                                                         Camera内部類

SiZi                                                                                                                                                                                                         圖檔大小包含倆個變量:width和height (圖檔的寬和高)

Parameters 

         Parameters是相機服務設定,不同的相機可能是不相同的。比如相機所支援的圖檔大小,對焦模式等等。下面介紹一下這個類中常用的方法

  • getSupportedPreviewSizes()                                                                                                                                                       獲得相機支援的預覽圖檔大小,傳回值是 List(Sizi)
  • setPreviewSize(int width, int height)                                                                                                                                             設定相機預覽的圖檔大小
  • getSupportedPreviewFormats()                                                                                                                                                   擷取相機支援的圖檔格式
  • setPreviewFormat(int pixel_format)                                                                                                                                              設定圖檔的預覽格式
  • getSupportedPictureSizes()                                                                                                                                                          擷取相機支援的采集圖檔大小(就是拍照後儲存的圖檔大小)
  • setPictureSize(int width, int height)                                                                                                                                                 設定儲存的圖檔的大小
  • getSupportedPictureFormats()                                                                                                                                                      擷取相機支援的圖檔格式
  • setPictureFormat()                                                                                                                                                                   設定相機儲存的圖檔格式                                                             
  • getSupportedFocusModes()                                                                                                                                                         擷取相機支援的對焦模式
  • setFocusMode(String value)                                                                                                                                                          設定相機的對焦模式
  • getMaxNumDetectedFaces()                                                                                                                                                        傳回相機最大的人臉檢測數量  

                                                        PreviewCallback 

      PreviewCallback 是一個抽象接口

  • void onPreviewFrame(byte[] data, Camera camera)

    通過onPreviewFrame方法來擷取到相機預覽的資料,第一個參數data,就是相機預覽到的原始資料。data可以轉換圖檔做人臉檢測

                                                         Face

Face類用來描述通過Camera的人臉檢測功能檢測到的人臉資訊

  • rect                                                                                                                                                                                               rect 是一個Rect對象,它所表示的就是檢測到的人臉的區域
  • score                                                                                                                                                                                             人臉的可信度(0-100)
  • leftEye                                                                                                                                                                                          左眼位置坐标系
  • rightEye                                                                                                                                                                                         右眼位置坐标系     
  • mouth                                                                                                                                                                                             眼睛位置坐标系     
  •   leftEye       rightEye         mouth    都是 Point 對象  部分手機可能傳回來為 null

                                           FaceDetectionListener

抽象接口開始人臉檢測的時候回調

  • onFaceDetection(Face[] faces, Camera camera)

    第一參數代表檢測到的人臉,是一個Face數組(畫面内可能存在多張人臉)

                                                Camera類中的方法

  • getNumberOfCameras()

    傳回目前裝置上可用的攝像頭個數

  • open()

    使用目前裝置上第一個後置攝像頭建立一個Camera對象。如果目前裝置沒有後置攝像頭,則傳回值為null

  • open(int cameraId)

    使用傳入id所表示的攝像頭建立一個Camera對象,如果id所表示的攝像頭已經被打開,則會抛出異常

裝置上每一個實體攝像都是有一個id的,id從0開始,到getNumberOfCameras() - 1 結束 
  • getCameraInfo(int cameraId, CameraInfo cameraInfo)

    傳回指定id所表示的攝像頭的資訊

  • setDisplayOrientation(int degrees)

    設定相機預覽畫面旋轉的角度

  • setPreviewDisplay(SurfaceHolder holder)

    設定一個Surface對象用來實時預覽

  • setPreviewCallback(PreviewCallback cb)

    設定相機預覽資料的回調,參數是一個PreviewCallback對象

  • getParameters()

    傳回目前相機的參數資訊,傳回值是一個Parameters對象

  • setParameters(Parameters params)

    設定目前相機的參數資訊

  • startPreview()

    開始預覽

    調用此方法之前,如果沒有setPreviewDisplay(SurfaceHolder) 或 setPreviewTexture(SurfaceTexture)的話,是沒有效果

  • stopPreview()

    停止預覽

  • startFaceDetection()

    開始人臉檢測

    這個方法必須在開始預覽之後調用

  • stopFaceDetection()

    停止人臉檢測

  • setFaceDetectionListener(FaceDetectionListener listener)

    設定人臉檢測監聽回調

  • release()

    釋放相機

                                                                              第一章末尾