OpenCV不支持中文路径的解决方法

一波操作猛如虎:

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))

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值