【轉】Android Camera(五)使用Camera功能 AREA的理解

來源:互聯網
上載者:User

標籤:

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)架構提供了用於識別人臉和使用Face Service技術來計算圖片設定的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對象的更多資訊,請看前文的“採集視頻”。

【轉】Android Camera(五)使用Camera功能 AREA的理解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.