Comment trouver les contours d'une image à partir d'un appareil photo Android et de les convertir en box2d corps?

À l'aide de OpenFrameworks, OpenCV et Box2D j'ai été en mesure de le réaliser avec un bon framerate. En utilisant Android semble beaucoup plus compliqué que la tâche (en partie parce que je suis un JAVA débutant).

C'est de cette façon que j'ai commencé:

  1. Utiliser le "OpenCV Échantillon - manipulations d'image" et de supprimer tout sauf le "savant", qui produit un beau noir & blanc de l'image qui est parfait pour trouver les contours.

    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. De la "OpenCV Échantillon - couleur-blob-détection" j'ai saisi la logique pour trouver les contours d'une Natte:

    //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);

    Donc, ma fonction actuelle ressemble à ça et ça ne fonctionne pas:

    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. Maintenant, c'est là où je suis coincé. Je continue à faire des exceptions et je pense que je ne suis pas en utilisant les bonnes dimensions ou en transformant le Tapis pour le droit de l'espace couleur. Ce post a un aperçu, mais je ne sais pas si c'est correct: OpenCV sur Android findContours throws Exception

Ce box2d mise en œuvre utilisez-vous? Est-il juste nu jbox2d? Ou êtes-vous en utilisant quelque chose comme ANDEngine?
J'ai été à la recherche à AndEngine, mais je ne sais pas encore comment mettre en œuvre la CVCamera de classe avec le SimpleGameActivity de AndEngine.

OriginalL'auteur Joan Mira | 2013-04-19