android java opencv 2.4 convexhull выпуклый дефект

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);

person ddd    schedule 09.06.2012    source источник


Ответы (2)


Похоже, что в OpenCV Java API отсутствует другая подпись convexHull():

convexHull(MatOfPoint points, MatOfPoint hull);

как можно позвонить в С++.

Пока мы его не добавили, вам нужно создать корпус в формате MatOfPoint вручную:

  • используйте MatOfPoint::toArray() или MatOfPoint::toList(), чтобы получить точки контура
  • используйте MatOfInt::toArray() или MatOfInt::toList(), чтобы получить их индексы для корпуса
  • создать новый Point[] или List<Point> только с точками корпуса
  • преобразовать его в MatOfPoint через MatOfPoint::fromArray() или MatOfPoint::fromList()
  • позвони Core.drawContours()
person OpenCV4Android    schedule 09.06.2012
comment
ну, я пробовал это так (изменение в вопросе): я не уверен, что это абсолютно правильно, потому что я не получаю хороших результатов ... большую часть времени есть просто много красных выпуклых линий корпуса, пересекающих изображение .. - person ddd; 12.06.2012
comment
или это из-за findcontour (я пробовал canny и/или порог и фильтр Гаусса перед findcontour) - person ddd; 12.06.2012

нам нужно очистить hullPointList перед добавлением точки списка для контура

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