7

Open-CV 2.4 Android-Java:

我搜索了这样的轮廓(MatofPoint 列表):

Imgproc.findContours(roi_mat, contours, hierarchy, cfg.retMode, cfg.apxMode);

然后是凸包(必须是 MatofInt 的列表)

for (int k=0; k < contours.size(); k++){

     Imgproc.convexHull(contours.get(k), hull.get(k));
}

凸包想要一个 MatofInt,但 drawcontours 想要一个 MatofPoint.. 那么该怎么办呢?

提前谢谢..


编辑:@OpenCV4Android

for (int k=0; k < contours.size(); k++){
    Imgproc.convexHull(contours.get(k), hullInt);

    for(int j=0; j < hullInt.toList().size(); j++){
        hullPointList.add(contours.get(k).toList().get(hullInt.toList().get(j)));
    }

    hullPointMat.fromList(hullPointList);
    hullPoints.add(hullPointMat);   
}

Imgproc.drawContours( mROI, hullPoints, -1,  new Scalar(255,0,0, 255), 1);
4

2 回答 2

4

看起来 OpenCV Java API 缺少另一个 convehull() 签名:

convexHull(MatOfPoint points, MatOfPoint hull);

就像可以在 C++ 中调用一样。

虽然我们没有添加它,但您需要手动创建MatOfPoint格式的船体:

  • 使用MatOfPoint::toArray()orMatOfPoint::toList()获取轮廓点
  • 使用MatOfInt::toArray()MatOfInt::toList()获取他们的船体索引
  • 创建一个新的Point[]List<Point>仅具有船体点
  • 将其转换为MatOfPointviaMatOfPoint::fromArray()MatOfPoint::fromList()
  • 称呼Core.drawContours()
于 2012-06-09T15:35:52.097 回答
0

在为轮廓添加列表点之前,我们需要清除 hullPointList

hullPointList .clear();
for(int j=0; j < hullInt.toList().size(); j++){
        hullPointList.add(contours.get(k).toList().get(hullInt.toList().get(j)));
    }
于 2013-06-28T07:29:44.897 回答