Используя OpenCV, как рисовать контуры ВНУТРИ краев обнаруженной формы/капли?

Ниже приведено изображение синего пятна, обнаруженного в приложении Android с помощью OpenCV4Android. Я использовал Core.inRange() и Imgproc.findContours() для поиска контуров и Imgproc.drawContours(), чтобы нарисовать их:

Mat mask = new Mat();
Core.inRange(rgbaMat, lowerThreshold, upperThreshold, mask);
...
contours = new ArrayList<>();
Imgproc.findContours(dilatedMat, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
...
for ( int contourIdx=0; contourIdx < contours.size(); contourIdx++ ) { 
    Imgproc.drawContours ( rgbaMat, contours, contourIdx, new Scalar(0, 255, 0), 1);
}

Контур (светло-зеленая граница) находится за пределами обнаруженной формы.

Итак, как вы можете видеть, он также включает в себя некоторую белую область вокруг обнаруженного синего пятна. Я хочу, чтобы граница контура находилась внутри краев синего пятна/формы.

Как я могу это сделать?

введите здесь описание изображения


person Solace    schedule 25.06.2016    source источник


Ответы (2)


Я вижу в вашем коде, что вы применили «findContours» к переменной «dilatedMat» (строка № 5). Я предполагаю, что вы применили фильтр «расширить» к «rgbaMat» (где-то в строке № 3). Но если вы хотите, чтобы контуры были внутри, вы должны применить "размытие" вместо "расширения".

person xMaa    schedule 26.06.2016

Вы можете использовать некоторое отрицательное значение в параметре толщины drawContour, которое будет рисовать контур внутри обнаруженного объекта.

Imgproc.drawContours ( rgbaMat, contours, contourIdx, new Scalar(0, 255, 0), -1);
person Mohsin Falak    schedule 29.11.2017