opencv 如何从包含Unicode字符的路径中读取图像?

vxqlmq5t  于 2023-03-09  发布在  其他
关注(0)|答案(6)|浏览(188)

我有下面的代码,但它失败了,因为它无法从磁盘读取文件。映像总是None

# -*- coding: utf-8 -*-
import cv2
import numpy

bgrImage = cv2.imread(u'D:\\ö\\handschuh.jpg')

注意:我的文件已经保存为UTF-8与BOM。我用记事本++验证。
在Process Monitor中,我看到Python正在从错误的路径访问文件:

我读过:

mf98qq94

mf98qq941#

它可以通过以下方式实现

  • 使用open()打开所述文件,所述open()支持Unicode,如在所述链接答案中,
  • 读取内容作为字节数组,
  • 将字节数组转换为NumPy数组,
  • 解码图像
# -*- coding: utf-8 -*-
import cv2
import numpy

stream = open(u'D:\\ö\\handschuh.jpg', "rb")
bytes = bytearray(stream.read())
numpyarray = numpy.asarray(bytes, dtype=numpy.uint8)
bgrImage = cv2.imdecode(numpyarray, cv2.IMREAD_UNCHANGED)
z5btuh9x

z5btuh9x2#

受托马斯Weller答案的启发,还可以使用np.fromfile()读取图像并将其转换为ndarray,然后使用cv2.imdecode()将数组解码为三维numpy ndarray(假设这是一张没有alpha通道的彩色图像):

import numpy as np

# img is in BGR format if the underlying image is a color image
img = cv2.imdecode(np.fromfile('测试目录/test.jpg', dtype=np.uint8), cv2.IMREAD_UNCHANGED)

np.fromfile()将磁盘上的图像转换为numpy一维ndarray表示形式。cv2.imdecode可以解码此格式并转换为正常的三维图像表示形式。cv2.IMREAD_UNCHANGED是用于解码的标志。可以在此处找到完整的标志列表。
PS.关于如何用unicode字符将图像写入路径,请看这里。

tzcvj98z

tzcvj98z3#

我把它们复制到了一个临时目录下。我用得很好。

import os
import shutil
import tempfile

import cv2

def cv_read(path, *args):
    """
    Read from a path with Unicode characters.

    :param path: path of a single image or a directory which contains images
    :param args: other args passed to cv2.imread
    :return: a single image or a list of images
    """
    with tempfile.TemporaryDirectory() as tmp_dir:
        if os.path.isdir(path):
            shutil.copytree(path, tmp_dir, dirs_exist_ok=True)
        elif os.path.isfile(path):
            shutil.copy(path, tmp_dir)
        else:
            raise FileNotFoundError

        img_arr = [
            cv2.imread(os.path.join(tmp_dir, img), *args)
            for img in os.listdir(tmp_dir)
        ]

        return img_arr if os.path.isdir(path) else img_arr[0]
rryofs0p

rryofs0p4#

它可以通过以下方式实现
1.保存当前目录
1.更改当前目录到一个图像必须保存
1.保存图像
1.将当前目录更改为步骤1中保存的目录

import os
from pathlib import Path
import cv2

im_path = Path(u'D:\\ö\\handschuh.jpg')

# Save current directory
curr_dir = os.getcwd()
# change current directory to the one the image must be saved
os.chdir(im_path.parent)
# read the image
bgrImage = cv2.imread(im_path.name)
# change current directory to the one saved in step 1
os.chdir(curr_dir)
sg24os4d

sg24os4d5#

我的问题与您类似,但是,我的程序将终止于image = cv2.imread(filename)语句。
我解决这个问题的方法是,首先将文件名编码为utf-8,然后将其解码为

image = cv2.imread(filename.encode('utf-8', 'surrogateescape').decode('utf-8', 'surrogateescape'))
8cdiaqws

8cdiaqws6#

bgrImage = cv2.imread(filename.encode('utf-8'))

编码文件到utf-8的完整路径

相关问题