# OpenCV报错Overload resolution failed

# 报错描述

在使用cv2.rectangle/cv2.circle/cv2.line/cv2.drawContours时有时候会遇到报错如下:

---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
Input In [19], in <cell line: 3>()
      1 mask = np.zeros((100, 100), dtype=np.uint)
      2 ct = np.array([[10,10], [20,10], [20,20],[10,20]], dtype=np.int32)
----> 3 cv2.drawContours(mask, [ct], -1, 255, 2)

error: OpenCV(4.8.1) :-1: error: (-5:Bad argument) in function 'drawContours'
> Overload resolution failed:
>  - Layout of the output array image is incompatible with cv::Mat
>  - Expected Ptr<cv::UMat> for argument 'image'

这个问题根据提示是output有问题,这就很奇怪,这个函数并没有返回image,图形是直接画在输入上的,因此可以看看输入有没有问题。

# 原因及解决方案

OpenCV处理的图像数据类型,需要是uint8,根据上面报错提示的信息可以看到,

mask = np.zeros((100, 100), dtype=np.uint)

mask的数据类型是uint型,np.uint等价于numpy.uint64,因此这里数据类型有误导致的,改成

mask = np.zeros((100, 100), dtype=np.uint8)

即可在其中画图形。