攝影或3C

Python: openCV無法使用中文路徑的話,該如何處理?bgrImage = cv2.imdecode (numpyarray, cv2.IMREAD_GRAYSCALE)

使用前需要先安裝套件
pip install opencv-python
原始圖片:

code:

# -*- coding: utf-8 -*-
"""
Created on Sat Aug  5 16:16:17 2023

@author: SavingKing
"""

import cv2         # 匯入OpenCv函式庫                                                           
import numpy as np # 匯入numpy函式庫     
import os

folder = r"P:\Python class\powen\day2"
fname  = "1.jpg"
fpath = os.path.join(folder,fname)
#'P:\\Python class\\powen\\day2\\1.jpg'
print("fpath:\n",fpath)

img = cv2.imread(fpath) # 使用OpenCV讀取圖片                                      
img[0,0]=[0,0,255]      # 改變 (0,0)位置的顏色為 (0,0,255)                                               
img[10:40,10:20]=[0,255,0] # 改變 (10,10)  (20,20) 的顏色為 (0,255,0)                        
cv2.imshow('image',img)   # 顯示視窗內容為img的圖標題image                                   
"""
img.shape
Out[32]: (302, 403, 3)
"""

img[0:20,0:20]=[0,255,0]  #左上角G
img[0:20,403-20:403]=[255,0,0] #右上角B
img[-20:,0:20]=[0,0,255] #左下角R
img[img.shape[0]-20:,img.shape[1]-20:]=[255,255,255] #右下角白
cv2.imshow('image',img) #執行結果

cv2.waitKey(0)           # 程式停止直到按下任意按鍵
cv2.destroyAllWindows()  # 關閉所有視窗

執行結果:

openCV無法使用中文路徑:


參考論壇文章:
How do I read an image from a path with Unicode characters?
coding:

import cv2
import numpy

# 中文路徑示例
path = r'P:\Temp\中文目錄\1.jpg'
stream = open(path, "rb")
bytesData = stream.read()  # 讀取二進位數據
stream.close()  # 讀取完畢後關閉文件

# 使用讀取的二進位數據來創建 bytearray
bytesDataArray = bytearray(bytesData)

# 使用 bytearray 來創建 numpy 陣列
numpyarray = numpy.asarray(bytesDataArray, dtype=numpy.uint8)

# 使用 OpenCV 解碼 numpy 陣列得到圖片
bgrImage = cv2.imdecode(numpyarray, cv2.IMREAD_GRAYSCALE)
#cv2.IMREAD_COLOR #cv2.IMREAD_UNCHANGED

# 現在您可以在這裡進行影像處理或其他操作
img = bgrImage
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出結果:


bgrImage = cv2.imdecode(numpyarray, cv2.IMREAD_UNCHANGED)

bgrImage = cv2.imdecode(numpyarray, cv2.IMREAD_COLOR)

根據讀取模式的不同,您將看到不同的顯示結果:

  1. cv2.IMREAD_COLOR 模式:圖片會以BGR模式顯示,忽略透明度通道。
  2. cv2.IMREAD_GRAYSCALE 模式:圖片會以灰度模式顯示,只有一個通道,每個像素表示灰度值。
  3. cv2.IMREAD_UNCHANGED 模式:圖片會保留所有通道,包括顏色通道和透明度通道(如果有的話)。

cv2.imread()cv2.imdecode() 都是OpenCV中用於讀取圖片的函數,但它們之間有一些重要的區別。

  1. cv2.imread()
    • cv2.imread() 是用於從檔案系統中讀取圖片的函數。
    • 它可以直接從檔案路徑讀取圖片並返回一個代表圖片的NumPy陣列。
    • 默認情況下,cv2.imread() 使用 cv2.IMREAD_COLOR 讀取圖片,即以BGR(藍綠紅)模式讀取並忽略透明度通道。
    • 它不支持讀取網路上的圖片或二進位數據。
  2. cv2.imdecode()
    • cv2.imdecode() 是用於解碼二進位數據為圖片的函數。
    • 它需要接收以二進位形式讀取的圖片數據(例如,使用 open() 函數以二進位模式讀取)。
    • 您可以通過 numpy 將二進位數據轉換為 uint8 型別的NumPy陣列,然後使用 cv2.imdecode() 解碼這個NumPy陣列。
    • cv2.imdecode() 支持從網路上下載的圖片或其他來源讀取圖片。

總結來說,cv2.imread() 是直接從檔案系統中讀取圖片的函數,而 cv2.imdecode() 是用於解碼二進位數據為圖片的函數,您需要使用 numpy 將二進位數據轉換為NumPy陣列後再使用它。在實際使用中,您可以根據讀取的需求和來源來選擇適合的函數。

推薦hahow線上學習python: https://igrape.net/30afN

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡