Проблема в том, что 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)