OpenCV 4.1 Java-outlineArea()失败,断言深度== CV_32F ||深度== CV_32S(对于赫尔矩阵)

问题描述 投票:0回答:1

我已经尝试根据由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个回答
0
投票

问题是,在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));
© www.soinside.com 2019 - 2024. All rights reserved.