2013-04-19 19 views
7

OpenFrameworks、OpenCV、Box2Dを使って、私は良いフレームレートでそれを達成することができました。 Androidを使用するのははるかに複雑な作業(私がJavaの初心者であることもあります)のようです。Androidカメラからフレームの輪郭を見つけてbox2dボディに変換する方法は?

  1. 使用「OpenCVのサンプル - 画像操作」と見つけるのが最適です素敵な黒&白画像を生成し、「気の利いた」効果、以外のすべてを削除します。

    これは私が始めた方法です輪郭。 - から

    public Mat onCameraFrame(CvCameraViewFrame inputFrame) 
    { 
        mRgba = inputFrame.rgba(); 
        Imgproc.Canny(mRgbaInnerWindow, mIntermediateMat, 50, 100); 
        Imgproc.cvtColor(mIntermediateMat, mRgbaInnerWindow, Imgproc.COLOR_GRAY2BGRA, 4); 
    
        return mRgba; 
    } 
    
  2. 「OpenCVのサンプルカラーブロブ検出」私はマットで輪郭を見つけるために、ロジックをつかん:

    // These two lines are actually in the function onCameraViewStarted 
    mHierarchy = new Mat(); 
    CONTOUR_COLOR = new Scalar(255,0,0,255); 
    
    // These lines are in function onCameraFrame 
    List<MatOfPoint> contours = new ArrayList<MatOfPoint>();   
    Imgproc.findContours(mRgbaInnerWindow, contours, mHierarchy, Imgproc.RETR_EXTERNAL,  
    Imgproc.CHAIN_APPROX_SIMPLE); 
    Imgproc.drawContours(mIntermediateMat, contours, -1, CONTOUR_COLOR); 
    

    だから、私の現在の機能は次のようになり、それはdoesnの仕事:

    public Mat onCameraFrame(CvCameraViewFrame inputFrame) 
    { 
        mRgba = inputFrame.rgba(); 
    
        if ((mRgbaInnerWindow == null) || (mGrayInnerWindow == null) || (mRgba.cols() != mSizeRgba.width) || (mRgba.height() != mSizeRgba.height)) 
         CreateAuxiliaryMats(); 
    
        Imgproc.Canny(mRgbaInnerWindow, mIntermediateMat, 50, 100); 
        //Imgproc.cvtColor(mIntermediateMat, mRgbaInnerWindow, Imgproc.COLOR_GRAY2BGRA, 4); 
    
        List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); 
    
        Imgproc.findContours(mRgbaInnerWindow, contours, mHierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); 
        //Imgproc.drawContours(mIntermediateMat, contours, -1, CONTOUR_COLOR); 
    
        return mRgba; 
    } 
    
  3. ここで私はこっそりしています。私は例外を取得し続け、私は正しい次元を使用していないと思うか、またはMatを正しい色空間に変換していると思います。この投稿は、いくつかの洞察力を持っていますが、それが正しいかどうかはわからない:私はこれがないかもしれません知っているOpenCV on Android findContours throws Exception

+0

どのbox2d実装を使用していますか?それはちょうど裸のjbox2dですか?あるいは、あなたはANDEngineのようなものを使っていますか? –

+0

私はAndEngineを見てきましたが、AndEngineのSimpleGameActivityでCVCameraクラスを実装する方法はまだわかりません。 –

答えて

12

こんにちは私はまた、OpenCVのでは初心者ですが、このコードは役立つかもしれない、

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.SurfaceView; 
import org.opencv.android.*; 
import org.opencv.core.*; 
import org.opencv.imgproc.Imgproc; 


import java.util.ArrayList; 
import java.util.List; 

public class MainActivity extends Activity implements CvCameraViewListener2{ 

private static final String TAG = MainActivity.class.getCanonicalName(); 

private CameraBridgeViewBase mOpenCvCameraView; 

private Mat     mRgba; 
private Mat     mIntermediateMat; 
private Mat     mGray; 
Mat hierarchy; 


List<MatOfPoint> contours; 

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

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.java_surface_view); 
    mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE); 

    mOpenCvCameraView.setCvCameraViewListener(this); 

} 

@Override 
public void onResume() { 
    super.onResume(); 
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, 
      mLoaderCallback); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    if (mOpenCvCameraView != null) 
     mOpenCvCameraView.disableView(); 
} 



@Override 
public void onCameraViewStarted(int width, int height) { 
    mRgba = new Mat(height, width, CvType.CV_8UC4); 
    mIntermediateMat = new Mat(height, width, CvType.CV_8UC4); 
    mGray = new Mat(height, width, CvType.CV_8UC1); 
    hierarchy = new Mat(); 
} 

@Override 
public void onCameraViewStopped() { 
    mRgba.release(); 
    mGray.release(); 
    mIntermediateMat.release(); 
    hierarchy.release(); 
} 

@Override 
public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
    mRgba = inputFrame.gray(); 
     contours = new ArrayList<MatOfPoint>(); 
     hierarchy = new Mat(); 

    Imgproc.Canny(mRgba, mIntermediateMat, 80, 100); 
    Imgproc.findContours(mIntermediateMat, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0, 0)); 
    /* Mat drawing = Mat.zeros(mIntermediateMat.size(), CvType.CV_8UC3); 
    for(int i = 0; i< contours.size(); i++) 
    { 
    Scalar color =new Scalar(Math.random()*255, Math.random()*255, Math.random()*255); 
    Imgproc.drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, new Point()); 
    }*/ 
    hierarchy.release(); 
    Imgproc.drawContours(mRgba, contours, -1, new Scalar(Math.random()*255, Math.random()*255, Math.random()*255));//, 2, 8, hierarchy, 0, new Point()); 
    // Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2RGBA, 4); 
    return mRgba; 
} 

} 

最高これを達成するための方法が、我々は新しい方法を学ぶために、すべてここにある:)

0

短い答え:あなたは

すなわち、 findContoursの入力として(第一引数) Cannyの結果を使用する必要があります
Imgproc.findContours(mIntermediateMat, ...); 
関連する問題