2016-05-16 8 views
1

Ich habe einen Code in Python und ich portiere es nach C++. Ich bekomme ein seltsames Problem mit drawContours Funktion in OpenCV C++.Problem mit DrawContours OpenCV C++

self.contours[i] = cv2.convexHull(self.contours[i]) 
cv2.drawContours(self.segments[object], [self.contours[i]], 0, 255, -1) 

dies ist der Funktionsaufruf in Python und der Wert -1 für die Dickenparameter zum Füllen der Kontur verwendet werden, und das Ergebnis sieht aus wie

looks like

ich genau das gleiche täte in C++,

cv::convexHull(cv::Mat(contour), hull); 
cv::drawContours(this->objectSegments[currentObject], cv::Mat(hull), -1, 255, -1); 

aber dies ist das resultierende Bild:

image

(bitte achten Sie darauf, die convexhull Punkte zu sehen, das ist nicht leicht sichtbar). Ich bekomme nur die Punkte und nicht das gefüllte Polygon. Ich habe auch versucht wie

cv::fillPoly(this->objectSegments[currentObject],cv::Mat(hull),255); 

verwenden, aber nicht helfen. Bitte helfen Sie mir bei der Behebung des Problems. Ich bin mir sicher, dass mir etwas sehr Triviales fehlt, aber ich konnte es nicht erkennen.

+0

Bitte zeigen Sie den vollständigen Code. Was ist die Art der Variablen "Rumpf". Das Problem wird mit der Art sein, wie der Parameter strukturiert ist - es sollte ein Vektor von Konturen sein. Es scheint, dass in diesem Fall jeder Punkt als individuelle Kontur interpretiert wird. –

+0

@ DanMašek Perfekt !, hat Ihr Vorschlag funktioniert. Ich verwende Vektor von Vektorpunkten direkt. – Arul

Antwort

1

Die Funktion drawContours() erwartet eine Folge von Konturen, wobei jede Kontur ein "Vektor von Punkten" ist.

Der Ausdruck cv::Mat(hull), den Sie als Parameter verwenden, gibt die Matrix in einem falschen Format zurück, wobei jeder Punkt als separate Kontur behandelt wird - deshalb sehen Sie nur ein paar Pixel.

Nach der Dokumentation von cv::Mat::Mat(const std::vector<_Tp>& vec) der Vektor in den Konstruktor geleitet, in der folgenden Weise verwendet wird:

STL-Vektor, dessen Elemente die Matrix bilden. Die Matrix hat eine einzelne Spalte und die Anzahl der Zeilen entspricht der Anzahl der Vektorelemente.

dies betrachtet, haben Sie zwei Möglichkeiten:

  • Transponieren der Matrix Sie erstellt haben (mit cv::Mat::t()
  • nur einen Vektor von Vektoren von Punkten verwenden, um direkt

Die folgende Beispiel zeigt, wie der Vektor direkt verwendet wird:

cv::Mat output_image; // Work image 

typedef std::vector<cv::Point> point_vector; 
typedef std::vector<point_vector> contour_vector; 

// Create with 1 "contour" for our convex hull 
contour_vector hulls(1); 

// Initialize the contour with the convex hull points 
cv::convexHull(cv::Mat(contour), hulls[0]); 

// And draw that single contour, filled 
cv::drawContours(output_image, hulls, 0, 255, -1);