How to convert MatOfPoint to MatOfPoint2f in opencv java api

前端 未结 3 1190
误落风尘
误落风尘 2020-12-07 23:01

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_

相关标签:
3条回答
  • 2020-12-07 23:31

    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.

    0 讨论(0)
  • 2020-12-07 23:35

    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);
    }
    
    0 讨论(0)
  • 2020-12-07 23:42

    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() );
    
    0 讨论(0)
提交回复
热议问题