【问题标题】:Issue with drawContours OpenCV c++drawContours OpenCV c ++的问题
【发布时间】:2016-09-12 20:28:18
【问题描述】:

我在 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用于填充轮廓,结果如下所示

我在 c++ 中做的完全一样,

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

但这是生成的图像:

(请仔细查看convexhull 点,这不容易看到)。我只得到点而不是填充的多边形。我也尝试过使用fillPoly 之类的,

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

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

【问题讨论】:

  • 请显示完整的代码。变量hull 的类型是什么。问题在于参数的结构方式——它应该是一个轮廓向量。在您的情况下,似乎每个点都被解释为一个单独的轮廓。
  • @DanMašek Perfect!,您的建议奏效了。我直接使用向量点的向量。

标签: opencv opencv-drawcontour


【解决方案1】:

函数drawContours() 期望接收一系列轮廓,每个轮廓都是一个“点向量”。

您用作参数的表达式cv::Mat(hull) 返回格式不正确的矩阵,每个点都被视为一个单独的轮廓——这就是您只看到几个像素的原因。

根据cv::Mat::Mat(const std::vector<_Tp>& vec)的文档,传入构造函数的向量的使用方式如下:

STL 向量,其元素构成矩阵。矩阵只有一列,行数等于向量元素的数量。

考虑到这一点,您有两种选择:

  • 转置您创建的矩阵(使用cv::Mat::t()
  • 直接使用 Points 的向量向量即可

以下示例展示了如何直接使用向量:

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

【讨论】:

    猜你喜欢
    • 2019-02-01
    • 2015-08-05
    • 2019-09-15
    • 1970-01-01
    • 2015-10-15
    • 2015-10-07
    • 2016-06-24
    • 2018-10-28
    • 2021-12-25
    相关资源
    最近更新 更多