天天看點

opencv_python使用cv2.imread()讀取中文路徑報錯問題

1 說明

本篇中使用的opencv版本為3.3,python使用的版本為3.6。

2.問題描述

本人小白一枚,由于畢業論文做圖像識别方面的内容,是以最近才開始學習python,老師指導我用opencv做圖檔去噪處理,是以最近才知道opencv是幹嘛用的,opencv才安裝好,想嘗試一下簡單的使用opencv讀取、顯示和存儲一個圖檔。然而一開始就給了我一個下馬威。

開始代碼如下,隻涉及到圖檔的讀取和顯示:

# -*- coding: utf-8 -*-
import cv2
if __name__=='__main__':
    path='E:/畢業設計/images/百合1.jpg'
    img=cv2.imread(path,1)
    cv2.namedWindow(image,cv2.WINDOW_AUTOSIZE)
    cv2.imshow(image,img)
    k=cv2.waitKey(0)
           

運作後報了這個錯誤:

cv2.imshow('image',img)
cv2.error: C:\projects\opencv-python\opencv\modules\highgui\src\window.cpp:325: error: (-215) size.width>0 && size.height>0 in function cv::imshow
           

百度了一下:原因是因為檔案路徑錯誤,未讀取到圖檔。但是我反複确認我的圖檔路徑沒有錯誤,是以想到會不會是中文的字元編碼問題導緻讀取不到圖檔,于是我在D盤下放了一張英文命名的圖檔,就修改了代碼的path改為‘D:/ Hydrangeas.jpg’,再次運作上述代碼,結果如下:

opencv_python使用cv2.imread()讀取中文路徑報錯問題

成功讀取并顯示,則表明我的猜想是正确的,是因為路徑的中文編碼導緻圖檔讀取不成功。

3.解決辦法

但是可惜的是,小白我并沒有解決辦法,于是又問度娘,尋找python3中opencv讀取中文名稱的解決辦法。

最後在一個知乎的問答中找到了答案:

opencv_python使用cv2.imread()讀取中文路徑報錯問題

連結如下:https://www.zhihu.com/question/67157462/answer/251754530

我嘗試了,果然能成功讀取中文路徑與中文名稱的圖檔,事實證明該方法是正确的。然而這位答主的回答居然沒有贊,我果斷的給她點了個贊,不知為何題主竟然都沒贊。

然後又在另一個知乎問答下發現了另一個,包括opencv讀取和存儲中文名稱和路徑的方法:

opencv_python使用cv2.imread()讀取中文路徑報錯問題

附上連結:https://www.zhihu.com/question/47184512

嘗試後,果然都是對的,感謝知乎,感謝兩位大佬!

附上我修改後的代碼:

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

## 讀取圖像,解決imread不能讀取中文路徑的問題
def cv_imread(filePath):
    cv_img=cv2.imdecode(np.fromfile(filePath,dtype=np.uint8),-1)
    ## imdecode讀取的是rgb,如果後續需要opencv處理的話,需要轉換成bgr,轉換後圖檔顔色會變化
    ##cv_img=cv2.cvtColor(cv_img,cv2.COLOR_RGB2BGR)
    return cv_img
if __name__=='__main__':
    path='E:/images/百合/百合1.jpg'
    img=cv_imread(path)
    cv2.namedWindow('lena',cv2.WINDOW_AUTOSIZE)
    cv2.imshow('lena',img)
    k=cv2.waitKey(0)
    ##這樣是儲存到了和目前運作目錄下
    cv2.imencode('.jpg', img)[1].tofile('百合.jpg')