2016-06-25 5 views
0

Es folgt ein Bild eines blauen Blobs, der in einer Android-App mit OpenCV4Android erkannt wurde. Ich verwenden Core.inRange()Imgproc.findContours() und Methoden, um die Konturen zu finden, und Imgproc.drawContours() sie zeichnen:Mit OpenCV, wie man Konturen innerhalb der Kanten der erkannten Form/Blob zeichnen?

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

die Kontur (hellgrün Grenze) außerhalb der erfaßten Form.

So, wie Sie sehen können, enthält es auch einige weiße Fläche um den erkannten blauen Fleck. Ich möchte die Konturgrenze innerhalb der Ränder des blauen Blobs/der Form haben.

Wie kann ich das tun?

enter image description here

Antwort

1

kann ich in Ihrem Code sehen, dass Sie "findContours" auf Variable "dilatedMat" (Linie 5) aufgebracht ist. Ich nehme an, dass Sie "Dilate" Filter auf "rgbaMat" angewendet haben (irgendwo in Zeile # 3). Aber wenn Sie möchten, dass die Konturen innen sind, sollten Sie "erodieren" anstelle von "erweitern" anwenden.

0

Sie können einen negativen Wert im Parameter drawContour thickness verwenden, der die Kontur innerhalb des erkannten Objekts zeichnet.

Imgproc.drawContours (rgbaMat, contours, contourIdx, new Scalar(0, 255, 0), -1);