我在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);
但没有帮助 . 请帮我解决问题 . 我确信我错过了一些非常微不足道但却无法发现的东西 .
1 回答
函数drawContours()期望接收一系列轮廓,每个轮廓为"vector of points" .
您用作参数的表达式
cv::Mat(hull)
以不正确的格式返回矩阵,每个点都被视为一个单独的轮廓 - 这就是您只看到几个像素的原因 .根据cv::Mat::Mat(const std::vector<_Tp>& vec)的文档,传递给构造函数的向量按以下方式使用:
考虑到这一点,您有两种选择:
转置您创建的矩阵(使用cv::Mat::t()
只需直接使用Points矢量矢量
以下示例显示如何直接使用向量: