Проблема в том, что в 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));