2013-10-06 6 views
3

Je suis en train de développer une application Android de reconnaissance d'image ... J'utilise la caméra personnalisée en utilisant la vue de surface .... As Here dans Android pour capturer des images ... Je veux traiter les images capturées en utilisant opencv, comment puis-je obtenir l'image capturée et la convertir en mat? est-il aussi un moyen de sauver l'image capturée temporaire? merci d'avanceOpenCv avec Android caméra Surfaceview

Répondre

2

Je suppose que vous avez ajouté la bibliothèque opencv à votre projet avec succès.

Voici un exemple de code utilisant 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; 
} 

}

Et le fichier de mise en page XML est:

<?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> 

Dans la méthode onCameraFrame vous pouvez accéder à toutes les images de la mémoire tampon d'image de la caméra. Si vous voulez capturer une image, vous pouvez ajouter un bouton et prendre une image particulière du tampon et la traiter. Le cadre est donné en tant qu'objet Mat par défaut. Il n'est donc pas nécessaire de le convertir. après le traitement, si vous en avez besoin pour convertir en bitmap, vous pouvez appeler Utils.matToBitmap (mat, bmp); méthode pour le faire.