如何在opencv java api中将MatOfPoint转换为MatOfPoint2f

2022-09-01 01:47:08

我正在尝试通过使用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;

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

或者有没有办法使用与c ++接口相同的向量来实现这一点。任何建议或示例代码都非常感谢。


答案 1

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

答案 2

我意识到这个问题已经得到了很好的回答,但是要为将来找到它的任何人添加一个替代方案 -

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

推荐