gpt4 book ai didi

opencv - drawContours OpenCV c++ 问题

转载 作者:太空宇宙 更新时间:2023-11-03 21:44:28 26 4
gpt4 key购买 nike

我有一个 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);

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

最佳答案

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

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

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

STL vector whose elements form the matrix. The matrix has a single column and the number of rows equal to the number of vector elements.

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

  • 转置您创建的矩阵(使用 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);

关于opencv - drawContours OpenCV c++ 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37264253/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com