Я пытаюсь нарисовать самый большой контур, я работаю в реальном времени, обрабатывая каждый кадр камеры. Мое входное изображение будет ручным, у меня есть несколько ограничений — черный фон, отсутствие бликов.
Я ожидаю, что самый большой контур будет как можно ближе к нижнему изображению
Мой код приведен ниже, я ссылался на множество примеров, доступных в Интернете, и я почти подумал, что в моем коде нет ничего плохого.
mRgba = inputFrame.gray();
contours = new ArrayList<MatOfPoint>();
mcontours = new ArrayList<MatOfPoint>();
List<Mat> hull = new ArrayList<Mat>(contours.size());
hierarchy = new Mat();
Imgproc.Canny(inputFrame.gray(), mIntermediateMat, 50, 50);
Imgproc.findContours(mIntermediateMat, contours, hierarchy,
Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
for (int idx = 0; idx != contours.size(); ++idx)
{
Mat contour = contours.get(idx);
double contourarea = Imgproc.contourArea(contour);
Log.i(TAG, "maxAreaIdx =" + idx + "contourarea = " + contourarea);
if (contourarea > maxArea)
{
maxArea = contourarea;
maxAreaIdx = idx;
Log.i(TAG, "maxAreaIdx =" + maxAreaIdx + "MaxArea = " + maxArea);
}
}
if(maxAreaIdx > 0 && maxAreaIdx < contours.size())
mcontours.add(contours.get(maxAreaIdx));
else
break;
Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2RGBA,
4);
hierarchy.release();
Imgproc.drawContours(mRgba, mcontours, -1, CONTOUR_COLOR, -1);
Теперь все, что я получаю, это очень малая часть этого. Насколько я понимаю, сам OpenCV не может обнаружить большой непрерывный контур. Пожалуйста, обратитесь к изображениям ниже.
Мало того, я тестировал его и для других изображений, но я почему-то не могу получить большой непрерывный контур.
Я ошибаюсь, применяя Canny первым? Есть ли лучшая техника? Я хочу получить контур контура руки. В дальнейшем хочу сравнить с сохраненной аналогичной базой контуров. Я на правильном пути?