2015-05-07 73 views
2

我會盡量簡化我的問題。可以說,我只是想看看使用相機的灰度圖像,我做這種方式:Opencv android,捕獲圖像

public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 

return inputFrame.gray(); 

} 

這工作得很好,我現在可以dinamically看到我的屏幕灰度圖像。但問題是,當我試圖捕捉這個圖像(框架)。它不是以灰色捕捉它,而是以彩​​色捕捉它(它忽略了我在onCameraFrame中所做的所有效果)。爲了捕捉圖像我使用教程3做了同樣的方式 - 攝像頭控制(下面是相關的代碼):

public class MainActivity extends Activity implements CvCameraViewListener2, View.OnTouchListener { 

private CameraLab mOpenCvCameraView; 

protected void onCreate(Bundle savedInstanceState) { 

    mOpenCvCameraView = (CameraLab) findViewById(R.id.openCVCamera); 
     mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE); 
     mOpenCvCameraView.setCvCameraViewListener(this); 
} 

@Override 
    public boolean onTouch(View v, MotionEvent event) { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); 
     String currentDateandTime = sdf.format(new Date()); 
     String fileName = "Image_"+currentDateandTime + ".jpg"; 
     mOpenCvCameraView.takePicture(fileName); 
     return false; 
    } 
} 


public class CameraLab extends JavaCameraView implements PictureCallback { 

private String mPictureFileName; 

public void takePicture(final String fileName) { 
     Log.i(TAG, "Taking picture"); 

     this.mPictureFileName = fileName; 

     mCamera.setPreviewCallback(null); 

     // PictureCallback is implemented by the current class 
     mCamera.takePicture(null, null, this); 
    } 

    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 

     Log.i(TAG, "Saving a bitmap to file"); 
     mCamera.startPreview(); 
     mCamera.setPreviewCallback(this); 

     // Write the image in a file (in jpeg format) 
     try { 
      FileOutputStream fos = new FileOutputStream(mPictureFileName); 

      fos.write(data); 
      fos.close(); 

     } catch (java.io.IOException e) { 
      Log.e("PictureDemo", "Exception in photoCallback", e); 
     } 

    } 
} 

因此,回顧一下,問題是無論我在做onCameraFrame(使圖像灰度,檢測圈.. )當我捕捉圖像我沒有得到任何這些效果,我只是得到一個正常的形象。

我該如何解決這個問題?

回答

2

這是因爲您正在onCameraFrame()中修改Mat並將圖像數據寫入onPictureTaken()中的文件。

onCameraFrame中的Mat永遠不會寫入文件。

onPictureTaken()中的byte []包含無論觸發takePicture()時按下按鈕還是觸摸屏幕時攝像機拍攝的圖片。

如果你想寫一些效果的圖片,那麼你將不得不將字節[]轉換爲Mat,然後在這個Mat中生成效果,然後使用imwrite()將其寫入文件或將修改後的Mat轉換回字節[],然後使用FileOutputStream將其寫入文件,如代碼中所示。

imwrite()會比FileOutputStream中的方法

2

慢這是超級騙子老了,但我看到過很多次,而搜索。我在我的onTouch方法使用

Imgcodecs.imwrite(fileName,mRgba); 

代替

javaCameraView.takePicture(fileName); 

解決了我的問題。