使用Camera功能 AREA的理解


轉至 http://blog.csdn.net/think_soft/article/details/7998478

使用Camera功能

大多數的Camera功能都是使用Camera.Parameters對象來激活和控制的。首先要通過Camera對象實例的getParameters()方法,來獲取這個對象,然后把修改后的參數對象再設置給Camera對象,以下示例代碼演示了這個操作:

// get Camera parameters

Camera.Parameters params = mCamera.getParameters();

// set the focus mode

params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);

// set Camera parameters

mCamera.setParameters(params);

這種技術幾乎使用所有的Camera功能,並且在獲得Camera對象示例之后的任何時候,大多數參數都是可以被改變的。通常,參數的改變要立即在應用程序的Camera預覽窗口中顯示給用戶。在軟件方面,會因為硬件處理新指令的影響,參數改變時實際上會有幾幀的延遲,然后才會發送更新后的圖像數據。

重要:某些Camera功能不能隨意改變。尤其是改變Camera預覽窗口的尺寸和方向,需要首先終止圖像預覽,改變預覽窗口尺寸后,再重啟圖像預覽窗口。從Android4.0(API Level14)開始,改變預覽窗口的方向時,不需要在重啟預覽窗口了。

需要更多的代碼才能實現的Camera功能包括:

1.測光和調焦;

2.面部識別;

3.延時攝影。

測光和調焦

在某些攝像情景中,自動調焦和測光可能不能達到設計結果。從Android4.0(API Level 14)開始,你的Camera應用程序能夠提供另外的控制允許應用程序或用戶指定圖像中特定區域用於進行調焦或光線級別的設置,並且把這些值傳遞給Camera硬件用於采集圖片或視頻。

測光和調焦區域的工作與其他Camera功能非常類似,你可以通過Camera.Parameters對象中的方法來控制它們。下列代碼演示如何給Camera示例設置兩個測光區域:

// Create an instance of Camera

mCamera = getCameraInstance();

// set Camera parameters

Camera.Parameters params = mCamera.getParameters();

if (params.getMaxNumMeteringAreas() > 0){ // check that metering areas are supported

   List<Camera.Area> meteringAreas = new ArrayList<Camera.Area>();

   Rect areaRect1 = new Rect(-100, -100, 100, 100);    // specify an area in center of image

   meteringAreas.add(new Camera.Area(areaRect1, 600)); // set weight to 60%

   Rect areaRect2 = new Rect(800, -1000, 1000, -800);  // specify an area in upper right of image

   meteringAreas.add(new Camera.Area(areaRect2, 400)); // set weight to 40%

   params.setMeteringAreas(meteringAreas);

}

mCamera.setParameters(params);

Camera.Area對象包含了兩個數據參數:Rect對象,它用於指定Camera預覽窗口一塊矩形區域;一個權重值:它告訴Camera這塊指定區域應該給予的測光或調焦計算的重要性等級。
在Camera.Area對象中的Rect字段,代表了一個被映射成2000x2000單元格的矩形。坐標(-1000,-1000)代表Camera圖像的左上角,(1000,1000)代表Camera圖像的右下角,如下圖所示:

圖1.圖中的紅線說明了在Camera預覽窗口中給Camera.Area指定的坐標系統。用Rect的值是(333,333,667,667)藍色框顯示了攝像區域的位置和形狀。

這個坐標系統的邊框總是對應着Camera預覽窗口中所顯示的圖像的外邊緣,並且不會使用縮放級別來縮小或放大。類似的,使用Camera.setDisplayOrientation()方法來選擇圖像的預覽,不會重新映射坐標系統。

面部識別

對於包含人的圖片,通常人臉是圖片的最重要的部分,並且在采集圖像時,應該使用調焦和白平衡來進行檢測。Android4.0(API Level 14)框架提供了用於識別人臉和使用人臉識別技術來計算圖片設置的API。

注意:在運行面部識別功能時,setWiteBalance(String),setFocusAreas(List)和setMeteringAreas(List)方法沒有影響。

在你的Camera應用程序中使用面部識別技術,一般需要以下幾步:

1.檢查設備是否支持面部識別;

2.創建一個面部識別的監聽器;

3.把面部識別監聽器添加給你的Camera對象;

4.在預覽開始之后(並且在每次重啟預覽窗口之后)都要啟動面部識別。

面部識別的功能不是所有的設備都支持的。通過調用getMaxNumDetectedFaces()方法能夠檢測到設備是否支持這個功能。在下面示例的startFaceDetection()方法用於該功能的檢查。

為了通知和響應面部的識別,你的Camera應用程序設置一個響應面部識別事件的監聽器。為了到達這個目的,你必須要創建一個實現Camera.FaceDetectionListener接口的監聽器類,如下所示:

class MyFaceDetectionListener implements Camera.FaceDetectionListener {

   @Override

   public void onFaceDetection(Face[] faces, Camera camera) {

       if (faces.length > 0){

           Log.d("FaceDetection", "face detected: "+ faces.length +

                   " Face 1 Location X: " + faces[0].rect.centerX() +

                   "Y: " + faces[0].rect.centerY() );

       }

   }

}

創建這個類之后,把它設置給你的應用程序的Camera對象:

mCamera.setFaceDetectionListener(newMyFaceDetectionListener());

你的應用在每次啟動Camera預覽窗口(含重啟)時,都要啟動面部識別。創建一個用於啟動面部識別的方法,以便在需要的時候來調用它,如下代碼所示:

public void startFaceDetection(){

   // Try starting Face Detection

   Camera.Parameters params = mCamera.getParameters();

   // start face detection only *after* preview has started

   if (params.getMaxNumDetectedFaces() > 0){

       // camera supports face detection, so can start it:

       mCamera.startFaceDetection();

   }

}

你必須在每次啟動(或重啟)Camera預覽窗口時都要啟動面部識別。如果你使用前文“創建預覽類”中的預覽類,就要把startFaceDetection()方法添加到預覽類的surfaceCreated()和surfaceChanged()方法中,如下代碼所示:

public void surfaceCreated(SurfaceHolder holder) {

   try {

       mCamera.setPreviewDisplay(holder);

       mCamera.startPreview();

       startFaceDetection(); // start face detection feature

    } catch (IOException e) {

       Log.d(TAG, "Error setting camera preview: " + e.getMessage());

   }

}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

   if (mHolder.getSurface() == null){

       // preview surface does not exist

       Log.d(TAG, "mHolder.getSurface() == null");

       return;

   }

   try {

       mCamera.stopPreview();

    } catch (Exception e){

       // ignore: tried to stop a non-existent preview

       Log.d(TAG, "Error stopping camera preview: " + e.getMessage());

   }

   try {

       mCamera.setPreviewDisplay(mHolder);

       mCamera.startPreview();

       startFaceDetection(); // re-start face detection feature

    } catch (Exception e){

       // ignore: tried to stop a non-existent preview

       Log.d(TAG, "Error starting camera preview: " + e.getMessage());

   }

}

注意:在調用startPreview()方法之后,要記住調用這個方法。不要試圖在你的Camera應用程序的主Activity的onCreate()方法中啟動面部識別方法。在你的應用程序的這個執行時點,預覽還不是有效的。

延時攝影

延時攝影允許用戶把幾張圖片合成一個幾秒或幾分鍾的視頻剪輯。這個功能要使用MediaRecorder對象來記錄圖像的延時序列。

要用MediaRecorder對象來記錄延時視頻,要想錄制普通視頻一樣,必須要配置的記錄器對象,如把每秒采集的幀數設置到較小的數字,並且要使用一個延時品質設置,如下代碼所示:

// Step 3: Set a CamcorderProfile (requires API Level 8 or higher)

mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_TIME_LAPSE_HIGH));

...

// Step 5.5: Set the video capture rate to a low number

mMediaRecorder.setCaptureRate(0.1); // capture a frame every 10 seconds

這些設置是要對MediaRecorder對象所要做的必要設置的一大部分。對於完全的配置代碼示例,請看前文的“配置MediaRecorder”。一旦配置完成,你就可以把它當做普通的視頻剪輯來錄制視頻了。關於配置和運行MediaRecorder對象的更多信息,請看前文的“采集視頻”


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM