3
我想開發一個圖像識別android應用程序...我使用的是定製相機使用表面視圖.... As Here在Android中捕捉圖像...我想處理捕獲的圖像使用opencv,我如何獲取捕獲的圖像並將其轉換爲mat?還有一種方法可以將捕獲的圖像保存爲臨時?在此先感謝OpenCV與Android相機Surfaceview
我想開發一個圖像識別android應用程序...我使用的是定製相機使用表面視圖.... As Here在Android中捕捉圖像...我想處理捕獲的圖像使用opencv,我如何獲取捕獲的圖像並將其轉換爲mat?還有一種方法可以將捕獲的圖像保存爲臨時?在此先感謝OpenCV與Android相機Surfaceview
我假設您已經成功地將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);方法來做到這一點。