![]()
cv2.imwrite('./data/cropimg2/' + img_names2, img)
明明沒有寫入成功
資料夾其實不存在
居然沒有報錯?
###########################################
###########################################
###########################################
![]()
這完全是 OpenCV 一個經典的「回馬槍」坑!你不是第一個被它騙的人。
簡單來說:cv2.imwrite 的設計邏輯是「只回傳 True/False」,而不是「拋出錯誤 (Exception)」。
因為它在底層(C++)內部把錯誤吞掉了,所以當它發現路徑不存在、無法寫入時,它只會默默地在程式碼裡返回一個 False,然後當作什麼事都沒發生一樣繼續往下執行。
為什麼會這樣?
OpenCV 的 imwrite 函數其實是有回傳值的。它的運作邏輯是:
- 寫入成功 → 回傳 True
- 寫入失敗(例如資料夾不存在、權限不足) → 默默回傳 False,不報錯。
如果你沒有去檢查這個回傳值,程式就會看起來像是一切正常。
解決方案:如何正確防坑?
1. 寫入時順便檢查回傳值
最簡單的方法是直接用 if 判斷它到底有沒有成功:
success = cv2.imwrite('./data/cropimg2/' + img_names2, img)
if not success:
print(" 錯誤:圖片寫入失敗!請檢查路徑或檔案名稱。")
2. 自動幫它建立資料夾(最推薦)
既然資料夾不存在,我們可以用 Python 的 os 或 pathlib 模組,在寫入前「確保資料夾一定存在」。這樣就再也不用擔心這個問題了:
import os
import cv2
output_dir = './data/cropimg2/'
# 1. 檢查資料夾是否存在,不存在就直接建立(包含多層字目錄)
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 2. 確保安全後再寫入
cv2.imwrite(output_dir + img_names2, img)
額外小提醒: > 用字串相加路徑(output_dir + img_names2)有時候容易漏掉斜線 /。建議改用 os.path.join(output_dir, img_names2),系統會自動幫你處理好斜線,更不容易出錯喔!
###########################################
###########################################
###########################################
![]()
原來還有這種問題
真的是
如果沒看到別人這樣寫還真的很難遇到

留言板
歡迎留下建議與分享!希望一起交流!感恩!