OpenCV 4.1 Java-ContourArea()断言深度== CV_32F ||深度== CV_32S用于船体矩阵

时间:2019-11-20 21:11:26

标签: java opencv opencv-contour

我尝试根据由 if (isset($_POST["Answer"])) { **$questionbyimage = $db_handle->runQuery("select * from ask where description='" . $_GET['description'] . "'");** //the line of error $queArray = array($questionbyimage[0]['description']=>array('questionphoto'=>$questionbyimage[0]["questionphoto"])); $answer=$queArray ; ?> <div class="form"> <h1> Question </h1> <form action="NewAnswer.php" method="post" enctype ="multipart/form-data"> <img src="<?php echo $answer["questionphoto"];?>" style="height=250px;width=250px;"> <p> <? php echo $answer["description"];?></p> </form> </div> </div>`

我遵循了OpenCV Python tutorial(因为没有Java教程),并且在代码完成方面摆弄。

这是代码:

convexHull()

但这会引发以下异常:

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

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

我正在使用OpenCV 4.1.2。

1 个答案:

答案 0 :(得分:0)

问题是,在Java中,API仅实现填充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) 原始点矩阵的索引

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

  

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

     

(强调我的)

没有“或”。只有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);
}