OpenCV 4.1 Java - contourArea () не соответствует глубине утверждения == CV_32F ||глубина == CV_32S для матрицы корпуса - PullRequest
0 голосов
/ 21 ноября 2019

Я пытался вычислить площадь корпуса по точкам корпуса, сгенерированным convexHull().

Я следовал OpenCV Python (потому что нет 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.

1 Ответ

0 голосов
/ 21 ноября 2019

Проблема в том, что в Java API реализует только заполнение MatOfInt индексами исходной точечной матрицы .

Это то, что Javadoc (непосредственно генерируется из документа C ++) говорит:

hull Выход выпуклой оболочки. Это либо целочисленный вектор индексов , либо вектор точек. В первом случае элементы корпуса являются индексами на основе 0 выпуклых точек корпуса в исходном массиве (поскольку набор выпуклых точек корпуса является подмножеством исходного набора точек). Во втором случаеэлементы корпуса сами по себе являются выпуклыми точками корпуса.

(Акцент на шахте)

Там нет "или". Есть только 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...