2014-02-23 52 views
0

我使用OpenCV的JavaCameraView來捕捉圖像。所以它有onCameraFrame方法。如何同步Android中的兩種方法?

@Override 
    public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
     rgb = inputFrame.rgba(); 
     if(viewMode == VIEW_MODE_EDGE){ 
      Mat mIntermediateMat = new Mat(rgb.size(), rgb.type()); 
      Imgproc.Canny(rgb, mIntermediateMat, 80, 90); 
      Imgproc.cvtColor(mIntermediateMat, rgb, Imgproc.COLOR_GRAY2BGRA, 4); 
      mIntermediateMat.release(); 
     } 

     return rgb; 
    } 

該方法總是運行,我將傳入圖像轉換爲Canny邊緣並顯示。

我實現了一個按鈕,複製坎尼圖像,並傳遞到另一個活動。對於我做了一個全球public static Mat Canny_image;當按鈕被按下時rgb圖像從onCameraFrame被複制到Canny_image。然後下一個活動被調用。 我的代碼是

ImageCapture.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       if (mOpenCvCameraView != null) 
       { 
        Canny_image= rgb.clone(); 

       } 

       final Intent intent = new Intent(ctxt, TextExtraction.class); 
       intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
       startActivity(intent); 
      }        
     }); 

問題:當我按下按鈕,如果精明轉化是在onCameraFrame方法完成時,收到精明的圖像(只有邊緣的圖像)。但是,如果它尚未轉換或中途轉換,我會收到原始RGB圖像(原始RGB圖像)或半路轉換圖像。我怎樣才能確保我只接收精明的圖像,並確保在轉換過程完成,不要在ImageCapture.setOnClickListener(new OnClickListener(){}; 感謝

+0

我實現CountDownTimer並將討論後 – batuman

回答

1

要在Android中Java的同步兩種方法可以使用synchronized(this)語法:

Public void OnFrameAvailable() { 
    synchronized(this) { 
     // Wair for condition false... 
     // Flag condition true. 
    } 
} 

而且

Public void ProcessFrame() { 
    synchronized(this) { 
     // Wair for condition true... 
     // Do something with incoming data... 
     // Flag condition false 
    } 
} 

這將確保兩種方法在相互排斥的情況下執行,但通常不會一個好主意,做一個回調等待...如果你想完全脫鉤兩者,你應該有處理一個線程,用活套,和post()一個Runnable將其從OnFrameAvailable()

+0

由於這是一個好主意 – batuman

0

克隆爲Canny_image= rgb.clone();我沒有Android的任何知識,但只是一個suggestion..isn't可能爲你設置一個標誌(例如設置標誌= 1)後得到Canny圖像onCameraFrame方法和在另一種方法,你做了檢查,無論是標誌== 1?

first() 
{ 
    flag = 0; 
    convert to canny; 
    flag=1; 
} 

second() 
{ 
    if(flag ==1) 
     try to get the Canny image 
} 

而原諒我,如果它不可能:)

0

假設RGB是指出一個靜態然後一個眼前的事情是,這將在電話會議4通道墊(使用inputFrame.gray()如果​​你想有一個單通道)。 Canny正在期待一個單通道,就像調用CvColor即COLOR_GRAY2BGRA轉換類型一樣。我不認爲這是造成你的特定問題,但值得檢查。

由於onCameraFrame是你能很好地處理RGB回調,當另一個電話打進來,所以RGB可以覆蓋掉你的方法返回之前。同步添加到onCameraFrame方法應該有所幫助,但這可能會影響性能。或者,使rCb onCameraFrame本地也應避免該特定的併發問題。

最後一個想法是,當你點擊按鈕時,你可以做拷貝到Canny_image,當你在onCameraFrame中完成處理時,它總是可用的,onClick將採用當前版本。