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.
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);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With