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_
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.
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);
}
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() );