在Python中使用OpenCV的drawContours函数

10 投票
4 回答
17138 浏览
提问于 2025-04-16 15:12

我安装了OpenCV 2.2,当我尝试使用drawContours这个功能时,出现了以下错误:

cv.drawContours(frame, contours, 0, cv.RGB(255, 0, 0))
TypeError: <unknown> is not a numpy array

与这个错误相关的代码如下:

storage = cv.CreateMemStorage(0)
contours = cv.FindContours (color_mask, storage, method = cv.CV_CHAIN_APPROX_SIMPLE)
cv.drawContours(frame, contours, 0, cv.RGB(255, 0, 0))

Python的文档里参数的顺序和实际的不太一致(我知道正确的顺序是因为使用了IDLE),而C++的文档对这个功能的帮助也不大

以下是完整的代码(相关代码):

    cv.NamedWindow("MyWindow", 1)
    capture = cv.CaptureFromCAM(0)

    while 1:
        frame = cv.QueryFrame(capture)

        color_mask = cv.CreateImage(cv.GetSize(frame), 8, 1)

        cv.InRangeS(frame, cv.Scalar(*min_color), cv.Scalar(*max_color), color_mask)

        cv.CvtColor(frame, frame, cv.CV_BGR2HSV)

        storage = cv.CreateMemStorage(0)
        contours = cv.FindContours (color_mask, storage, method = cv.CV_CHAIN_APPROX_SIMPLE)
        cv.drawContours(image = frame, contours = contours, contourIdx = 0, color = cv.RGB(255, 0, 0))

        cv.ShowImage("MyWindow", frame)

谢谢大家的帮助

4 个回答

1

使用OpenCV备忘单上提供的cv2array和array2cv函数,可以把图像转换成特定的格式。

大概是这样的:

imgray = array2cv(cv2.cvtColor(cv2array(image), cv.CV_RGB2GRAY))
storage = cv.CreateMemStorage(0)
contours = cv.FindContours(imgray, storage,cv.CV_RETR_LIST, cv.CV_CHAIN_APPROX_SIMPLE,(0,0))
2

你应该查看一下Python参考文档中关于DrawContours函数的参数,尽量不要依赖参数的顺序来调用需要多个参数的函数,最好使用参数名称。

换句话说:

cv.DrawContours(img=frame, contour=contours, ...)

如果你查看DrawContours的文档:

DrawContours(img, contour, external_color, hole_color, max_level, thickness=1, lineType=8, offset=(0, 0))

你会发现这个函数接受8个参数:

  • 5个是必需的(img, contour, external_color, hole_color, max_level)
  • 3个是可选的(thickness, lineType, offset)

而且没有名为contourIdxcolor的参数。

例如:

cv.DrawContours(img=frame, contour=contours, external_color=cv.RGB(255, 0, 0), hole_color=cv.RGB(0, 255, 0), max_level=1 ) 
6

你需要知道,drawContours和DrawContours是两个不同的函数。它们实际上做的是同样的事情,但接受的参数不同。我认为第一个函数只接受numpy数组,而不是CvMat或其他来自openCV的数组。

撰写回答