Ich begann mit dem Lesen Mat
.Warum erzeugt DrawContour() in OpenCV diese seltsame Maske?
Dann konvertiert ich es Graustufen- und angewendet Imgproc.canny()
es, die folgende Maske bekommen.
Dann habe ich Imgproc.findContours()
die Konturen zu finden, Imgproc.drawContours()
und Core.putText()
die Konturen mit Zahlen zu beschriften:
Dann habe ich Rect boundingRect = Imgproc.boundingRect(contours.get(0)); Mat submatrix = new Mat(); submatrix = originalMat.submat(boundingRect);
zu erhalten folgende submatrix
:
So weit so gut. Das Problem beginnt hiernach:
JETZT BRAUCHT ICH EINE MASKE DER submatrix
. Also beschloss ich, Imgproc.drawContours()
zu verwenden, um die Maske zu bekommen:
Mat mask = new Mat(submatrix.rows(), submatrix.cols(), CvType.CV_8UC1);
List<MatOfPoint> contourList = new ArrayList<>();
contourList.add(contours.get(0));
Imgproc.drawContours(mask, contourList, 0, new Scalar(255), -1);
Ich habe die folgende Maske:
, was ich auf einen gefüllten erwartete (in weißer Farbe) Rautenform schwarzer Hintergrund.
WARUM bekomme ich dieses unerwartete Ergebnis?
EDIT:
Als ich
Mat mask = new Mat(submatrix.rows(), submatrix.cols(), CvType.CV_8UC1);
vonMat mask = Mat.zeros(submatrix.rows(), submatrix.cols(), CvType.CV_8UC1);
, die letzten Maske mit weißen Farbe Müll wurde von einer leeren schwarzen Maske ohne jede weiße Farbe ersetzt ersetzt darauf. Ich habe die folgende submat und Maske:Ich wurde in der Liste der Konturen (benannt
contours
) durchcontours.get(0)
, und mit dieser ersten Kontur berechnenImgproc.boundingRect()
auch die erste Kontur bekommen wie incontourList.add(contours.get(0));
später (wocontourList
ist die Liste von nur einer Kontur, die in der letztendrawContours()
verwendet wird).Dann ging ich weiter
contours.get(0)
zucontours.get(1)
inImgproc.boundingRect()
sowie incontourList.add();
(kurz vorImgproc.drawContours()
) zu ändern. Die führte in diesem submat und Maske:Dann wechselte ich in
Imgproc.boundingRect()
zucontours.get(0)
zurück; und lassen SiecontourList.add(contours.get(1));
da sein. Haben Sie den folgenden submat und Maske:
jetzt bin ich völlig unfähig, zu verstehen, was hier geschieht.
Ich hatte versucht, 'neue Mat (submatrix.rows(), submatrix.cols(), CvType.CV_8UC1, neue Skalar (0));', aber das hatte nicht funktioniert. Aber 'Mat.zeros()' funktioniert. Ich habe ein paar andere Sachen ausprobiert, die mich mehr verwirrt haben. Können Sie die Änderung am Ende meiner Frage sehen? – Solace
@Solace Ich aktualisierte die Antwort – api55
Vielen Dank für die Lösung meines Problems. Ich konnte die anfängliche Antwort nicht vollständig verstehen, aber danke für die Klärung in der Bearbeitung. In Java musste ich die Kontur (deren Typ ist "MatOfPoint") in ein Array von "Points" umwandeln und dann manipulierte ich die 'x' und' y' Koordinaten von jedem 'Point':' Point [] pointsArray = contours. get (0) .toArray(); \t \t \t für (int pointIndex = 0; pointIndex
Solace