How to convert MatOfPoint to MatOfPoint2f in opencv java api

I’m trying to implement the example code of the following
question
by using opencv java api. To implement findContours(gray, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE); in java i used this syntax Imgproc.findContours(gray, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);.

So now contours should be List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); rather than vector<vector<cv::Point> > contours;.

  • Android onPreviewFrame is not called
  • Android Studio Unable to run AVD
  • managedQuery() vs context.getContentResolver.query() vs android.provider.something.query()
  • Android Material Design profile page
  • how to fix a bottom relative layout when soft keyboard comes?
  • how to change font color in selected/focused ListView items?
  • Then i need implement this approxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true)*0.02, true);. In java api, Imgproc.approxPolyDP accept argument as approxPolyDP(MatOfPoint2f curve, MatOfPoint2f approxCurve, double epsilon, boolean closed). How i can i convert MatOfPoint to MatOfPoint2f?

    Or is there a way to use vectors as same as c++ interface to implement this. Any suggestion or sample code is greatly appreciated.

    Related posts:

    Can&#039;t delete virtual device from Eclipse, android
    No need to register base Activity class in the Manifest?
    Why Android service crashes with NullPointerException?
    What is the Recommended Event for Updating WebView Navigation UI?
    Live Video Stream between two Android Phones
    Passing -P parameters to gradle from android studio
  • Binding service by BroadcastReceiver
  • Android RelativeLayout programmatically set centerInParent
  • Ascertain Google Streetview function existence
  • Cannot create or edit Android Virtual Devices (AVD) from Eclipse, ADT 22.6
  • Size of ShareAction icon issue on ActionBar with ShareActionProvider-v7
  • Android Studio is not loading on the device, local path doesn't exist
  • 3 Solutions collect form web for “How to convert MatOfPoint to MatOfPoint2f in opencv java api”

    MatOfPoint2f differs from MatOfPoint only in the type of the elements (32-bit float and 32-bit int respectively). The viable option (though with a performance penalty) is to create MatOfPoint2f instance and set its elements (in a loop) to be equal to the elements of of the source MatOfPoint.

    There are

     public void fromArray(Point... lp);
     public Point[] toArray();
    

    methods in both of the classes.

    So you can do just

     /// Source variable
     MatOfPoint SrcMtx;
    
     /// New variable
     MatOfPoint2f  NewMtx = new MatOfPoint2f( SrcMtx.toArray() );
    

    I realise this question has already been well answered, but to add an alternative for anyone who finds it in the future –

    Imgproc.findContours(gray, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);
    
    for(int i=0;i<contours.size();i++){
        //Convert contours(i) from MatOfPoint to MatOfPoint2f
        contours.get(i).convertTo(mMOP2f1, CvType.CV_32FC2);
        //Processing on mMOP2f1 which is in type MatOfPoint2f
        Imgproc.approxPolyDP(mMOP2f1, mMOP2f2, approxDistance, true); 
        //Convert back to MatOfPoint and put the new values back into the contours list
        mMOP2f2.convertTo(contours.get(i), CvType.CV_32S);
    }
    

    Although this question has already been answered, I believe that the accepted answer is not the best. Converting a matrix to an array and then back comes with quite the performance penalty, both time-wise and memory-wise.

    Instead, OpenCV already has a function that does exactly this: convertTo.

    MatOfPoint src;
    // initialize src
    MatOfPoint2f dst = new MatOfPoint2f();
    src.convertTo(dst, CvType.CV_32F);
    

    I have found this to be significantly faster and more memory-friendly.

    To convert a MatOfPoint2f to a MatOfPoint, use CvType.CV_32S instead.

    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.