我正在尝试使用以下代码将图像从BGR转换为灰度格式:
img = cv2.imread('path//to//image//file')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
这似乎工作正常:我检查了img
变量的数据类型,结果发现它是numpy ndarray,形状是(100,80,3)
的。但是,如果我给出具有与cvtColor
函数输入相同维度的本机numpy ndarray数据类型的图像,则会给我以下错误:
Error: Assertion failed (depth == 0 || depth == 2 || depth == 5) in cv::cvtColor, file D:BuildOpenCVopencv-3.4.1modulesimgprocsrccolor.cpp, line 11109
cv2.error: OpenCV(3.4.1) D:BuildOpenCVopencv-3.4.1modulesimgprocsrccolor.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(img, cv2.COLOR_BGR2GRAY)
谁能澄清此错误的原因是什么以及如何纠正它?
这是因为您的 numpy 数组不是由正确的数据类型组成的。默认情况下,创建一个类型为np.int64
(64 位(的数组,但是,cv2.cvtColor()
需要 8 位 (np.uint8
( 或 16 位 (np.uint16
(。要更正此问题,请将np.full()
函数更改为包含数据类型:
img = np.full((100,80,3), 12, np.uint8)
以初始图像作为源和dtype=np.uint8
初始化新的 numpy 数组可能更容易:
import numpy as np
img = cv2.imread('path//to//image//file')
img = np.array(img, dtype=np.uint8)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
发生该错误是因为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)
假设你有一个名为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)