2016-05-16 132 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);