2013-10-06 3 views
3

Я пытаюсь разработать приложение для Android-распознавания образов ... Я использую настраиваемую камеру с использованием поверхностного вида .... As Here в андроиде для захвата изображений ... Я хочу обработать захваченные изображения используя opencv, как я могу получить захваченное изображение и преобразовать его в мат? также есть способ сохранить захваченное изображение Temporary? заранее спасибоOpenCv с Android Camera 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 (мат, bmp); метод для этого.

Смежные вопросы