【问题标题】:OpenCV 4.1 Java - contourArea() fails assertion depth == CV_32F || depth == CV_32S for hull matrixOpenCV 4.1 Java - contourArea() 断言深度失败 == CV_32F ||深度 == CV_32S 用于外壳矩阵
【发布时间】:2019-11-20 21:11:26
【问题描述】:

我试图从生成的船体点计算船体面积 convexHull().

我跟着OpenCV Python tutorial(因为没有Java教程)和代码完成摆弄。

这是代码:

Imgproc.findContours(patternEdges, patternContours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
MatOfInt patternHull = new MatOfInt();
Imgproc.convexHull(patternContours.get(0), patternHull);
Imgproc.contourArea(pickPoints(patternContours.get(0), patternHull)); // fails here

但这会引发以下异常:

Exception in thread "main" CvException [org.opencv.core.CvException: cv::Exception: OpenCV(4.1.2) /home/build/git/opencv/modules/imgproc/src/shapedescr.cpp:274: error: (-215:Assertion failed) npoints >= 0 && (depth == CV_32F || depth == CV_32S) in function 'contourArea']
  at org.opencv.imgproc.Imgproc.contourArea_1(Native Method)
  at org.opencv.imgproc.Imgproc.contourArea(Imgproc.java:1607)
  at com.acme.opencv.Test.main(Test.java:94)

显然矩阵内部数据类型是错误的。但是为什么,以及如何转换它?

我正在使用 OpenCV 4.1.2。

【问题讨论】:

    标签: java opencv opencv-contour


    【解决方案1】:

    问题是,在 Java 中,API 仅实现填充 MatOfInt 原始点矩阵的索引

    Javadoc(直接从 C++ 文档生成)是这样说的:

    hull 输出凸包。 它是索引的整数向量或 点向量。 在第一种情况下,船体元素是从 0 开始的索引 原始数组中的凸包点的数量(因为凸包的集合 points 是原始点集的子集)。 在第二种情况下,hull 元素本身就是凸包点。

    (强调我的)

    没有“或”。只有MatOfInt,这是 原Point矩阵。

    您可以通过这样的辅助函数创建一个包含选取点的新矩阵:

    private static MatOfPoint2f pickPoints(MatOfPoint points, MatOfInt indices) {
        Point[] pickedPoints = new Point[indices.rows()];
        int newRow = 0;
        for (int index : indices.toArray()) {
            pickedPoints[newRow++] = new Point(points.get(index, 0));
        }
        return new MatOfPoint2f(pickedPoints);
    }
    

    然后使用它:

    Imgproc.findContours(patternEdges, patternContours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
    MatOfInt patternHullIndices = new MatOfInt();
    Imgproc.convexHull(patternContours.get(0), patternHullIndices);
    Imgproc.contourArea(pickPoints(patternContours.get(0), patternHull));
    

    【讨论】:

      猜你喜欢
      • 2019-07-11
      • 1970-01-01
      • 2020-06-16
      • 2017-10-08
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      相关资源
      最近更新 更多