2013-10-06 71 views
3

我想開發一個圖像識別android應用程序...我使用的是定製相機使用表面視圖.... As Here在Android中捕捉圖像...我想處理捕獲的圖像使用opencv,我如何獲取捕獲的圖像並將其轉換爲mat?還有一種方法可以將捕獲的圖像保存爲臨時?在此先感謝OpenCV與Android相機Surfaceview

回答

2

我假設您已經成功地將opencv庫添加到您的項目。

這是使用OpenCV4android的示例代碼。

public class SampleCameraFrameAccessActivity extends Activity implements  CvCameraViewListener2, OnTouchListener{ 
private static final String TAG = "SampleCameraFrameAccessActivity"; 

protected CameraBridgeViewBase cameraPreview; 
protected Mat mRgba; 

protected BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 
    @Override 
    public void onManagerConnected(int status) { 
     switch (status) { 
      case LoaderCallbackInterface.SUCCESS: 
      { 
       Log.i(TAG, "OpenCV loaded successfully"); 
//     mOpenCvCameraView.enableView(); 
//     mOpenCvCameraView.setOnTouchListener(ColorRegionDetectionActivity.this); 
       cameraPreview.enableView(); 
      } break; 
      default: 
      { 
       super.onManagerConnected(status); 
      } break; 
     } 
    } 
}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.camera_sample_layout); 

    cameraPreview = (CameraBridgeViewBase) findViewById(R.id.sample_test_camera_view); 

    cameraPreview.setCvCameraViewListener(this); 

} 

@Override 
protected void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
} 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    if(cameraPreview != null){ 
     cameraPreview.disableView(); 
    } 
} 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback); 
} 

@Override 
public void onCameraViewStarted(int width, int height) { 
    // TODO Auto-generated method stub 
    mRgba = new Mat(height, width, CvType.CV_8UC4); 
} 

@Override 
public void onCameraViewStopped() { 
    // TODO Auto-generated method stub 
    mRgba.release(); 

} 

@Override 
public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
    // TODO Auto-generated method stub 
    mRgba = inputFrame.rgba(); 

    return mRgba; 
} 

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    // TODO Auto-generated method stub 
    return false; 
} 

}

和XML佈局文件是:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/sample_test_layout" > 

    <org.opencv.android.JavaCameraView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/sample_test_camera_view" /> 

</RelativeLayout> 

在onCameraFrame方法,你可以從相機的幀緩衝訪問的每一幀。如果你想捕捉圖像,你可以添加一個按鈕,並從緩衝區中取出一個特定的幀並對其進行處理。該框架默認爲Mat對象。因此,您不必將其轉換。處理完後,如果你需要它轉換成位圖,你可以調用Utils.matToBitmap(mat,bmp);方法來做到這一點。