Ошибка типа: UMat () принимает не более 2 аргументов (3 дано) - PullRequest
2 голосов
/ 26 апреля 2019

Я пытаюсь создать новый cv UMat на python.Документация говорит, что есть следующие возможности для параметров конструктора:

§ UMat() [4/19]
cv::UMat::UMat  (   int     rows,
int     cols,
int     type,
const Scalar &  s,
UMatUsageFlags  usageFlags = USAGE_DEFAULT 
)       
Python:
<UMat object>   =   cv.UMat(    [, usageFlags]  )
<UMat object>   =   cv.UMat(    rows, cols, type[, usageFlags]  )
<UMat object>   =   cv.UMat(    size, type[, usageFlags]    )
<UMat object>   =   cv.UMat(    rows, cols, type, s[, usageFlags]   )
<UMat object>   =   cv.UMat(    size, type, s[, usageFlags] )
<UMat object>   =   cv.UMat(    m   )
<UMat object>   =   cv.UMat(    m, rowRange[, colRange] )
<UMat object>   =   cv.UMat(    m, roi  )
<UMat object>   =   cv.UMat(    m, ranges   )

Я использовал rows, cols и type в качестве параметров.Это бросает TypeError: UMat() takes at most 2 arguments (3 given)

Вот код:

width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
...
array255 = cv2.UMat(height, width, cv2.CV_8UC1)

1 Ответ

1 голос
/ 26 апреля 2019

Проблема в том, что VideoCapture::get возвращает значение с плавающей запятой. Вы передаете это непосредственно конструктору , который принимает целые числа .

К сожалению, тип данных аргументов используется оболочками Python, чтобы выбрать, какую из многочисленных перегрузок конструктора вызвать. (Сообщения об ошибках, когда это терпит неудачу, имеют тенденцию быть довольно запутанными)

Для демонстрации (OpenCV 4.0):

>>> cv2.UMat(10.0, 12.0,  cv2.CV_8UC1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: UMat() takes at most 2 arguments (3 given)

>>> cv2.UMat(10, 12,  cv2.CV_8UC1)
<UMat 000000000573DC50>

В OpenCV 3.4.x сообщение об ошибке немного отличается, но результат тот же:

>>> cv2.UMat(10.0, 12.0,  cv2.CV_8UC1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: no matching UMat constructor found/supported

>>> cv2.UMat(10, 12,  cv2.CV_8UC1)
[ INFO:0] Initialize OpenCL runtime...
<cv2.UMat object at 0x0506FA90>

Исправление простое, просто приведите width и height к целым числам.

width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)

array255 = cv2.UMat(int(height), int(width), cv2.CV_8UC1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...