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),系統會自動幫你處理好斜線,更不容易出錯喔!

 

###########################################
###########################################
###########################################

 

原來還有這種問題

真的是

如果沒看到別人這樣寫還真的很難遇到