How to convert MatOfPoint to MatOfPoint2f in opencv java api

android, image-processing, java, opencv

Solution

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

Problem

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;`. 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.

Original source

Related problems