Android開發(51) 攝像頭自動對焦。在OpenCV圖像識別中連續拍照時自動對焦和拍照。

概述

  對焦,這裏所說的「焦」是指「焦距」。在拍照時,必定是須要調焦的。通常會在目標位置最清晰的時候會中止對焦。最近在處理OpenCV進行圖像識別時,須要連續的調焦(對焦),並在對焦完成後進行拍照,獲取圖片後進行圖像識別。識別完成後攝像頭不關閉繼續進行掃描識別。整理成本文。android

概念

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

 

基礎知識

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

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

  public final void autoFocus(AutoFocusCallback cb);this

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

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

 

具體實現

聲明權限

在文檔裏咱們能夠看到這麼句話,if you use the camera and auto-focus feature, your Manifest should include the following:xml

若是你使用了相機和自動對焦特性,你的Manifest須要包含下面這些:
  < uses-permission android:name="android.permission.CAMERA" />
  < uses-feature android:name="android.hardware.camera" />
  < uses-feature android:name="android.hardware.camera.autofocus" />
blog

打開你的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 方法,它判斷對焦成功後執行,咱們能夠在這個方法裏最本身的實現。好比 在這裏執行拍照。通常狀況下,咱們會在這裏發出一個消息或者在聲明一個回調來間接執行拍照。

相關文章
相關標籤/搜索