2016-05-16 386 views
1

我有一個Python代碼,我將它移植到C++。 OpenCV C++中的drawContours函數出現了一個奇怪的問題。問題使用drawContours OpenCV C++

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

這是在Python函數調用和值-1的厚度參數用於填充輪廓,結果看起來像

looks like

我做的完全一樣C++,

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

但是這是所得到的圖像:

image

(請注意看convexhull點,這是不容易看到的)。我只獲取點而不是填充的多邊形。我也試過用 like,

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

但是沒有幫助。 請幫我解決這個問題。我相信我錯過了一些非常微不足道的東西,但無法發現它。

+0

請顯示完整的代碼。變量'hull'的類型是什麼。問題將以參數結構的方式出現 - 它應該是等值線的向量。在你的情況下,似乎每個點都被解釋爲一個單獨的輪廓。 –

+0

@DanMašek完美!,你的建議工作。我正在使用矢量點的矢量。 – Arul

回答

1

函數drawContours()預計會接收一系列輪廓,每個輪廓都是「點向量」。

您用作參數的表達式cv::Mat(hull)以不正確的格式返回矩陣,並將每個點視爲單獨的輪廓 - 這就是爲什麼您只能看到幾個像素的原因。

根據傳遞到構造所述載體以下面的方式使用的cv::Mat::Mat(const std::vector<_Tp>& vec)文檔:

STL向量,其元素形成基質。該矩陣有一列,行數等於矢量元素的數量。

考慮到這一點,你有兩個選擇:

  • 移調您所創建的矩陣(使用cv::Mat::t()
  • 只要用點的向量的向量直接

以下示例顯示如何直接使用該載體:

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