问题与drawContours OpenCV c ++

时间:2016-05-16 22:28:11

标签: opencv opencv-drawcontour

我在python中有一个代码,我将它移植到c ++。我在OpenCV c ++中遇到了drawContours函数的奇怪问题。

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点,这不容易看到)。我只得到点而不是填充多边形。我也尝试使用fillPoly之类的,

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

但没有帮助。 请帮我解决问题。我确信我错过了一些非常微不足道但却无法发现它的东西。

1 个答案:

答案 0 :(得分: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);