一波操作猛如虎:
img_gbr = cv2.imread(img_path)
img = cv2.cvtColor(img_gbr, cv2.COLOR_BGR2RGB)
输出直接红一片:
[ WARN:0@3.382] global loadsave.cpp:248 cv::findDecoder imread_('input\阿洛娜\arona.jpg'): can't open/read file: check file path/integrity
img = cv2.cvtColor(img_gbr, cv2.COLOR_BGR2RGB)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cv2.error: OpenCV(4.9.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\color.cpp:196: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
这是因为OpenCV遇到了中文路径,为什么不支持的原因我暂时不知道。
解决方法:
改为:
img_gbr = cv2.imdecode(np.fromfile(img_path, dtype=np.uint8), -1)
img = cv2.cvtColor(img_gbr, cv2.COLOR_BGR2RGB)
解释:
np.fromfile 函数用于从文件中读取数据并将其转换为 NumPy 数组。
img_path 是指要读取的图像文件的路径。
dtype=np.uint8 指定了数据类型为 uint8,即无符号8位整数,这是图像数据的常见数据类型。这意味着每个像素值都会被解释为0到255之间的整数。
-1 表示读取图像时保持图像原始的通道数和位深度。换句话说,它会自动检测图像的颜色通道数和位深度。
完整代码(读取某文件夹下的所有图片):
def read_image(img_path, gray_pic=False, show_details=False):
"""
读取图片(支持中文路径)
[使用示例]:
path = 'input'
img = read_image(path, gray_pic=True, show_details=True) # 读取为灰度图
:param img_path: 图像路径
:param gray_pic: 是否读取灰度图像
:param show_details: 是否输出图片的shape以及显示图片
:return: 图像数组,类型为np.ndarray。大小是(H, W, 3)或(H, W)
"""
if gray_pic:
# img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
img = cv2.imdecode(np.fromfile(img_path, dtype=np.uint8), -1) # -1表示读取原图
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
else:
# img_gbr = cv2.imread(img_path)
img_gbr = cv2.imdecode(np.fromfile(img_path, dtype=np.uint8), -1)
img = cv2.cvtColor(img_gbr, cv2.COLOR_BGR2RGB)
if show_details:
print(img.shape)
if gray_pic:
plt.imshow(img, cmap='gray')
else:
plt.imshow(img)
plt.show()
plt.close()
return img
def read_imgs(path):
"""
读取文件夹下的所有图片
[使用示例]:
path = 'input'
imgs = read_imgs(path)
print(len(imgs))
:param path: 文件夹路径
:return: 图像数组列表,类型为np.ndarray
"""
import os
imgs = []
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith('.jpg') or file.endswith('.png') or file.endswith('.jpeg'):
print("相对路径", os.path.join(root, file))
print("绝对路径", os.path.abspath(os.path.join(root, file)))
img_path = os.path.join(root, file)
img = read_image(img_path, show_details=True, gray_pic=False)
imgs.append(img)
return imgs
path = 'input'
imgs = read_imgs(path)
print(len(imgs))