我是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)
任何人都可以澄清这个错误的原因是什么以及如何纠正它?
答案 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)