Использование функции drawContours OpenCV в Python - PullRequest
9 голосов
/ 06 апреля 2011

Я установил 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 ]

6 голосов
/ 10 мая 2011

Вы должны знать, что drawContours и DrawContours - это две разные функции. Они фактически делают то же самое, но они принимают разные параметры. Я считаю, что первый принимает только пустые массивы вместо CvMat или других массивов от openCV.

2 голосов
/ 06 апреля 2011

Вы должны проверить параметры функции в ссылке на 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, контур, external_color, hole_color, max_level)
  • 3 опционально (толщина, lineType, смещение)

и нет аргументов с именем contourIdx или color

например:

cv.DrawContours(img=frame, contour=contours, external_color=cv.RGB(255, 0, 0), hole_color=cv.RGB(0, 255, 0), max_level=1 ) 
1 голос
/ 31 мая 2012

Используйте функции cv2array и array2cv, приведенные в Cheatheet OpenCV, чтобы преобразовать изображение в определенный формат.

Примерно так:

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))
0 голосов
/ 06 апреля 2011

Я обнаружил некоторые ошибки в оболочке Python OpenCV 2.2.Примеры типа " camshift.py " работают с OpenCV 2.1, но не с OpenCV 2.2.Я полагаю, что мои проблемы происходят от этой ошибки (теперь я буду использовать версию 2.1)

Я сообщил об этой ошибке, а также об ошибке документации

@ P2bM спасибо за вашу помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...