OpenCV错误 - cv2.cvtcolor

时间:2018-05-13 18:56:57

标签: python opencv image-processing

我是openCV的新手,我没有解决这个错误。我正在尝试使用此代码将图像从BGR转换为灰度格式 -

img = cv2.imread('path//to//image//file')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

这似乎工作正常。我检查了img变量的数据类型,该变量结果是numpy ndarray,形状为(100,80,3)。但是,如果我给numpy ndarray数据类型的代码中已经存在的图像以及与cvtColor函数的输入相同的尺寸,它会给我以下错误 -

Error: Assertion failed (depth == 0 || depth == 2 || depth == 5) in cv::cvtColor, file D:\Build\OpenCV\opencv-3.4.1\modules\imgproc\src\color.cpp, line 11109
cv2.error: OpenCV(3.4.1) D:\Build\OpenCV\opencv-3.4.1\modules\imgproc\src\color.cpp:11109: error: (-215) depth == 0 || depth == 2 || depth == 5 in function cv::cvtColor

第二种情况的代码是(在这里制作自定义的np.ndarray) -

img = np.full((100,80,3), 12)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 

任何人都可以澄清这个错误的原因是什么以及如何纠正它?

4 个答案:

答案 0 :(得分:11)

这是因为你的numpy数组不是由正确的数据类型组成的。默认情况下会生成类型np.int64(64位)的数组,但cv2.cvtColor()需要8位(np.uint8)或16位(np.uint16)。要更正此更改,请更改np.full()函数以包含数据类型:

img = np.full((100,80,3), 12, np.uint8)

答案 1 :(得分:2)

我是OP,我再次回答我自己的问题 -

发生错误的原因是cv2.imread返回的numpy数组的数据类型为uint8,这与np.full()返回的numpy数组的数据类型不同。要将数据类型设置为uint8,请添加dtype参数 -

img = np.full((100,80,3), 12, dtype = np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

答案 2 :(得分:1)

使用初始图像作为源并使用dtype=np.uint8初始化新的numpy数组可能会更容易:

img = cv2.imread('path//to//image//file')
import numpy as np
img = np.array(img, dtype=np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

答案 3 :(得分:0)

想象您有一个名为preprocessing()的函数,该函数可以使用cv2预处理图像, 如果您尝试将其应用为:

data = np.array(list(map(preprocessing,data)))

它将不起作用,并且因为np.array创建了int64并且您正在尝试为其分配np.uint8,所以您应该做的是添加dtype参数,如下所示:

data = np.array(list(map(preprocessing,data)), dtype = np.uint8)