Python使用OpenCV讀取圖片返回None排查及解決技巧
使用 OpenCV 做圖像處理時(shí),最讓人頭疼的問題之一就是:cv2.imread() 讀出來的圖片是空(None),程序直接報(bào)錯(cuò) AttributeError: 'NoneType' object has no attribute 'shape'。
一、先確認(rèn):你的圖片真的是空嗎?
首先用兩行代碼快速判斷,讀出來的對(duì)象是不是 None:
import cv2
img = cv2.imread("test.jpg")
print(img) # 輸出 None 就是讀取失敗
print(type(img)) # <class 'NoneType'> 代表讀取失敗
只要輸出 None,就說明 圖片路徑錯(cuò)誤 / 權(quán)限不足 / 格式不支持 / 圖片損壞,下面逐個(gè)排查!
二、最常見原因:路徑問題(80% 的人栽在這里)
1. 相對(duì)路徑錯(cuò)誤(新手重災(zāi)區(qū))
cv2.imread() 的相對(duì)路徑是相對(duì)于「當(dāng)前運(yùn)行 Python 的工作目錄」,不是你寫代碼的 .py 文件所在目錄!
錯(cuò)誤示例:
- 代碼文件在
D:/project/test.py - 圖片放在
D:/project/img/test.jpg - 你運(yùn)行命令的目錄是
D:/ - 寫
img = cv2.imread("img/test.jpg")就會(huì)失敗
解決方法:
- 使用絕對(duì)路徑(最穩(wěn)妥,推薦新手用)
# Windows 絕對(duì)路徑
img = cv2.imread("D:/project/img/test.jpg")
# 或者用反斜杠,但必須加 r 轉(zhuǎn)義
img = cv2.imread(r"D:\project\img\test.jpg")
- 獲取代碼文件所在目錄,拼接路徑(兼容性最強(qiáng))
import cv2 import os # 獲取當(dāng)前 .py 文件的絕對(duì)路徑 base_path = os.path.dirname(os.path.abspath(__file__)) # 拼接圖片路徑 img_path = os.path.join(base_path, "img", "test.jpg") img = cv2.imread(img_path)
2. 路徑包含中文 / 特殊字符
OpenCV 默認(rèn)不支持中文路徑!這是超級(jí)大坑!
錯(cuò)誤:
img = cv2.imread("D:/測(cè)試文件夾/圖片.jpg") # 直接返回 None
解決方法(萬能方案):
import cv2
import numpy as np
# 先用 imdecode 讀取,支持中文路徑
def cv_imread(file_path):
# 讀取圖片字節(jié)數(shù)據(jù)
cv_img = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), cv2.IMREAD_COLOR)
return cv_img
# 使用這個(gè)函數(shù)代替 cv2.imread
img = cv_imread("D:/測(cè)試文件夾/圖片.jpg")
3. 路徑中空格、拼寫錯(cuò)誤
- 檢查文件名:
test .jpg(多了空格)、tes.jpg(拼寫錯(cuò)誤) - 檢查后綴:
.png寫成.pnj、.jpg寫成.jpeg
三、第二大原因:圖片本身問題
1. 圖片損壞 / 未下載完成
- 圖片下載一半中斷、傳輸失敗、文件損壞
- 用系統(tǒng)圖片查看器打開,如果打不開 / 顯示空白,OpenCV 肯定讀不出來
解決:重新下載 / 替換正常圖片
2. 圖片格式不支持
OpenCV 支持:jpg、jpeg、png、bmp、tiff 等常見格式
不支持:
- WebP 格式(直接讀會(huì)失?。?/li>
- HEIC(蘋果手機(jī)格式)
- 動(dòng)圖 GIF
解決:
- WebP 用
PIL先轉(zhuǎn)成 PNG/JPG 再讀 - HEIC 用
pyheif庫(kù)轉(zhuǎn)換
四、權(quán)限 / 文件被占用
- 圖片被其他軟件占用(如圖片查看器、PS 打開著)
- 文件權(quán)限不足(Linux/macOS 下沒有讀權(quán)限)
Linux/macOS 賦權(quán)命令:
chmod 644 你的圖片路徑
五、OpenCV 安裝問題
如果所有路徑、圖片都正常,還是讀不出來,大概率是 OpenCV 裝錯(cuò)了:
常見錯(cuò)誤安裝:
# 不推薦,缺少依賴庫(kù) pip install opencv-python
推薦安裝:
# 完整版本,包含所有依賴(解決大部分底層讀取失?。? pip install opencv-contrib-python
安裝后重啟 Python 環(huán)境!
六、終極排查代碼(直接復(fù)制用)
把這段代碼放到你的項(xiàng)目里,自動(dòng)檢測(cè)所有錯(cuò)誤原因:
import cv2
import os
def check_image_read(img_path):
# 1. 判斷文件是否存在
if not os.path.exists(img_path):
print("錯(cuò)誤:文件不存在!")
return None
# 2. 判斷是否是文件
if not os.path.isfile(img_path):
print("錯(cuò)誤:這不是一個(gè)文件!")
return None
# 3. 讀取圖片
img = cv2.imread(img_path)
# 4. 判斷是否讀取成功
if img is None:
print("錯(cuò)誤:cv2.imread 讀取失?。?)
print("可能原因:中文路徑/圖片損壞/格式不支持/權(quán)限不足")
# 嘗試用中文路徑兼容方案讀取
try:
import numpy as np
img = cv2.imdecode(np.fromfile(img_path, dtype=np.uint8), cv2.IMREAD_COLOR)
if img is not None:
print("已自動(dòng)用中文路徑方案修復(fù)!")
except:
pass
else:
print("圖片讀取成功!圖片形狀:", img.shape)
return img
# 測(cè)試
if __name__ == "__main__":
# 替換成你的圖片路徑
image_path = "test.jpg"
check_image_read(image_path)
七、總結(jié):快速排查口訣
- 先打印看是否 None,確定是讀取失敗
- 路徑優(yōu)先查:絕對(duì)路徑 / 中文 / 拼寫 / 空格
- 圖片本身查:損壞 / 格式 / 后綴
- 權(quán)限占用查:關(guān)閉占用軟件、賦權(quán)
- 庫(kù)重裝:用
opencv-contrib-python - 中文路徑必用 imdecode
總結(jié)
cv2.imread()返回None90% 是路徑問題,優(yōu)先用絕對(duì)路徑- 中文路徑必須用
cv2.imdecode()方案 - 圖片損壞、格式不支持、權(quán)限不足也會(huì)導(dǎo)致讀取失敗
- 終極方案:復(fù)制我寫的排查代碼,一鍵定位問題
以上就是Python使用OpenCV讀取圖片返回None排查及解決技巧的詳細(xì)內(nèi)容,更多關(guān)于Python OpenCV讀取圖片返回None的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
torch 中各種圖像格式轉(zhuǎn)換的實(shí)現(xiàn)方法
這篇文章主要介紹了torch 中各種圖像格式轉(zhuǎn)換的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
python 實(shí)現(xiàn)求解字符串集的最長(zhǎng)公共前綴方法
今天小編就為大家分享一篇python 實(shí)現(xiàn)求解字符串集的最長(zhǎng)公共前綴方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07
python管理包路徑之pycharm自動(dòng)解決包路徑注冊(cè)
這篇文章主要介紹了python本管理包路徑之pycharm自動(dòng)解決包路徑注冊(cè),文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
虛擬機(jī)下載python是否需要聯(lián)網(wǎng)
在本篇文章里小編給大家分享的是一篇關(guān)于虛擬機(jī)下載python是否需要聯(lián)網(wǎng)的相關(guān)文章,有需要的朋友們可以參考下。2020-07-07
Keras搭建M2Det目標(biāo)檢測(cè)平臺(tái)示例
這篇文章主要為大家介紹了Keras搭建M2Det目標(biāo)檢測(cè)平臺(tái)實(shí)現(xiàn)的源碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05

