2013-10-06 3 views
3

나는 이미지 인식 안드로이드 응용 프로그램을 개발하려고 ... 표면을 사용하여 사용자 정의 카메라를 사용하고 있습니다 .... As Here 안드로이드에서 이미지를 캡처 ... 내가 캡처 한 이미지를 처리하고 싶습니다 opencv를 사용하여 어떻게 캡쳐 된 이미지를 얻고 매트로 변환 할 수 있습니까? 또한 캡처 한 이미지를 임시로 저장하는 방법이 있습니까? 미리 감사드립니다.안드로이드 카메라 Surfaceview와 OpenCv

답변

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 레이아웃 파일은 다음과 같습니다

카메라의 프레임 버퍼에서 모든 프레임에 액세스 할 수 있습니다 onCameraFrame 방법에서
<?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> 

. 이미지를 캡처하려면 버튼을 추가하고 버퍼에서 특정 프레임을 가져 와서 처리 할 수 ​​있습니다. 프레임은 기본적으로 Mat 객체로 주어집니다. 따라서 변환 할 필요가 없습니다. 처리 후 비트 맵으로 변환해야하는 경우 을 호출하면 Utils.matToBitmap (mat, bmp)을 호출 할 수 있습니다. 방법.