簡體   English   中英

如何從具有 Unicode 字符的路徑中讀取圖像?

[英]How do I read an image from a path with Unicode characters?

我有以下代碼,但它失敗了,因為它無法從磁盤讀取文件。 圖像始終為None

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

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

注意:我的文件已經保存為 UTF-8 和 BOM。 我用記事本++進行了驗證。

在進程監視器中,我看到 Python 正在從錯誤的路徑訪問文件:

進程監視器

我讀過:

它可以通過

  • 使用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)

受 Thomas 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可以解碼這種格式並轉換為正常的 3 維圖像表示。 cv2.IMREAD_UNCHANGED是解碼的標志。 可以在此處找到完整的標志列表。

附注。 有關如何將圖像寫入帶有 unicode 字符的路徑,請參見此處

我將它們復制到一個臨時目錄。 這對我來說可以。

import os
import shutil
import tempfile

import cv2


def cv_read(path):
    """
    :param path: path of a single image or a directory which contains images
    :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))
            for img in os.listdir(tmp_dir)
        ]

        return img_arr if len(img_arr) > 1 else img_arr[0]

我的問題與您相似,但是,我的程序將在image = cv2.imread(filename)語句處終止。

我解決了這個問題,首先將文件名編碼為 utf-8,然后將其解碼為

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

將文件完整路徑編碼為 utf-8

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM