天天看點

Android開發(53) 攝像頭自動對焦。在OpenCV圖像識别中連續拍照時自動對焦和拍照。概述概念基礎知識具體實作

概述

對焦,這裡所說的“焦”是指“焦距”。在拍照時,一定是需要調焦的。一般會在目标位置最清晰的時候會停止對焦。最近在處理OpenCV進行圖像識别時,需要連續的調焦(對焦),并在對焦完成後進行拍照,擷取圖檔後進行圖像識别。識别完成後攝像頭不關閉繼續進行掃描識别。整理成本文。

概念

焦距,也稱為焦長,是光學系統中衡量光的聚集或發散的度量方式,指從透鏡中心到光聚集之焦點的距離。亦是照相機中,從鏡片光學中心到底片、CCD或CMOS等成像平面的距離。具有短焦距的光學系統比長焦距的光學系統有更佳聚集光的能力。相機的鏡頭是一組透鏡,當平行于主光軸的光線穿過透鏡時,光會聚到一點上,這個點叫做焦點,焦點到透鏡中心(即光心)的距離,就稱為焦距。焦距固定的鏡頭,即定焦鏡頭;焦距可以調節變化的鏡頭,就是變焦鏡頭。(當一束與凸透鏡的主軸平行的光穿過凸透鏡時,在凸透鏡的另一側會被凸透鏡彙聚成一點,這一點叫做焦點,焦點到凸透鏡光心的距離就叫這個凸透鏡的焦距。一個凸透鏡的兩側各有一個焦點。)

基礎知識

想實作對焦,先了解下Android系統的拍照API為我們提供了什麼。 Camera 類位于 android.hardware 命名空間下,它提供了操作相機的一些方法。

  Camera類提供了自動對焦的方法,它接收一個 AotoFocusCallback的回調。這個方法執行後就相機就會自動對焦,當它對焦完成後(成功或失敗)觸發回調。

public final void autoFocus(AutoFocusCallback cb);           

複制

下面是Callback接口,它的 onAutoFocus方法回調 有個boolean的參數 success,該參數訓示了自動對焦的成功或者失敗。

public interface AutoFocusCallback{    
  void onAutoFocus(boolean success, Camera camera); 
}           

複制

具體實作

聲明權限

如果你使用了相機和自動對焦特性,你的Manifest需要包含下面這些:

< uses-permission   android:name="android.permission.CAMERA" />  
< uses-feature android:name="android.hardware.camera" />  
< uses-feature android:name="android.hardware.camera.autofocus" />*           

複制

打開你的manifest.xml,寫入上面的内容,以聲明你的app要使用的權限。

定義變量

我們需要一個定時器 Timer,它會每個一段時間執行一個 TimerTask,我們在TimerTask裡執行 對焦方法

private final Timer timer; private TimerTask outstandingTask;     
  private static final long AUTO_FOCUS_INTERVAL_MS = 3500L; 
      
  timer = new Timer(true); 
        outstandingTask = new TimerTask() { 
                  @Override public void run() { start(); } 
      };
 timer.schedule(outstandingTask, AUTO_FOCUS_INTERVAL_MS);           

複制

執行對焦

注意下面代碼裡我們自己實作的回調,this 是指自己實作了回調,我們需要自己實作回調方法并再次啟動 Timer,以實作連續(間隔)自動對焦

synchronized void start() {
 try { 
      camera.autoFocus(this); 
    } 
      catch (RuntimeException re) { 
    // Have heard     RuntimeException reported in Android 4.0.x+; continue? 
    Log.w(TAG, "Unexpected exception while focusing", re); 
  }
}           

複制

停止對焦

camera.cancelAutoFocus();           

複制

連續對焦

下面代碼是對焦的回調實作,在對焦完成後(成功或者失敗)我們都再次啟動TimerTask 來檢查和啟動自動對焦

@Override public synchronized void onAutoFocus(boolean success, Camera theCamera) {  
  outstandingTask = new TimerTask() {
         @Override public void run() { 
              checkAndStart();
         } 
      }; 
    timer.schedule(outstandingTask, AUTO_FOCUS_INTERVAL_MS); 
    if (success) {
         Log.i(TAG, "### onAutoFocus success ***************** ");
         raiseEvent_OnAutoFocusSuccess();
     } manual = false; 
}           

複制

對焦成功後拍照

在上面的代碼中, 觸發了 寫了一個raiseEvent_OnAutoFocusSuccess 方法,它判斷對焦成功後執行,我們可以在這個方法裡最自己的實作。比如 在這裡執行拍照。一般情況下,我們會在這裡發出一個消息或者在聲明一個回調來間接執行拍照。