我正在尝试实现以下示例代码
question
通过使用opencv java api。为了在Java中实现findContours(gray, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);,我使用了这种语法Imgproc.findContours(gray, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);

因此,现在轮廓应该是List<MatOfPoint> contours = new ArrayList<MatOfPoint>();而不是vector<vector<cv::Point> > contours;

然后我需要实现这个approxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true)*0.02, true);。在Java api中,Imgproc.approxPolyDP将参数接受为approxPolyDP(MatOfPoint2f curve, MatOfPoint2f approxCurve, double epsilon, boolean closed)。我如何将MatOfPoint转换为MatOfPoint2f?

或者有没有办法使用与c++接口(interface)相同的 vector 来实现这一点。任何建议或示例代码将不胜感激。

最佳答案

MatOfPoint2f与MatOfPoint的不同之处仅在于元素的类型(分别为32位浮点型和32位int)。可行的选项(尽管会降低性能)是创建MatOfPoint2f实例并将其元素(循环)设置为等于源MatOfPoint的元素。


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

这两个类中的方法。

所以你可以做
 /// Source variable
 MatOfPoint SrcMtx;

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

关于java - 如何在OpenCV Java API中将MatOfPoint转换为MatOfPoint2f,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11273588/

10-16 03:21