如何在OpenCV Java API中将MatOfPoint转换为MatOfPoint2f
image-processing
java
opencv
3
0

我正在尝试通过使用opencv java api实现以下问题的示例代码。实现findContours(gray, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);在Java中,我使用了以下语法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 ++接口相同的向量来实现这一点。任何建议或示例代码将不胜感激。

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

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() );
收藏
评论

尽管已经回答了这个问题,但我认为公认的答案不是最好的。将矩阵转换为数组然后又转换回数组会在性能上和时间上都造成很大的损失。

取而代之的是,OpenCV已经具有执行此操作的功能:convertTo。

MatOfPoint src;
// initialize src
MatOfPoint2f dst = new MatOfPoint2f();
src.convertTo(dst, CvType.CV_32F);

我发现这明显更快并且对内存更友好。

要将MatOfPoint2f转换为MatOfPoint,请改用CvType.CV_32S。

收藏
评论

我知道这个问题已经得到了很好的回答,但是为以后发现它的任何人添加了一个替代方案-

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);
}
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号