OpenCV:解決NoneType錯誤(P2)
書接上文(doge)
案例?#2: CV2.VideoCapture 和?.read
就像我們在使用CV2.imread時看到的NoneType錯誤和AssertionError異常一樣,在處理視頻流/視頻文件時,您也會看到這些錯誤。
為了訪問視頻流,OpenCV使用CV2.VideoCapture,它接受一個參數(shù),可以是:
表示磁盤上視頻文件路徑的字符串。
表示計算機(jī)上網(wǎng)絡(luò)攝像頭索引的整數(shù)。
使用OpenCV處理視頻流和視頻文件比簡單地通過CV2加載圖像要復(fù)雜得多。我讀過,但同樣的規(guī)則適用。
如果你試著運(yùn)行.read實例化CV2的方法。VideoCapture(無論是視頻文件還是網(wǎng)絡(luò)攝像頭流)并注意到NoneType錯誤或斷言錯誤,則您可能會遇到以下任一問題:
輸入視頻文件的路徑(可能不正確)。
沒有安裝正確的視頻編解碼器,在這種情況下,您需要安裝編解碼器,然后重新編譯并重新安裝OpenCV(有關(guān)完整的教程列表,請參閱本頁:https://www.pyimagesearch.com/opencv-tutorials-resources-guides/?_ga=2.139358459.955629704.1643158794-1706104520.1639213599)。
無法通過OpenCV訪問您的網(wǎng)絡(luò)攝像頭。這可能是由于多種原因造成的,包括缺少驅(qū)動程序、傳遞給CV2.VideoCapture的索引不正確,或者只是網(wǎng)絡(luò)攝像頭未正確連接到系統(tǒng)。
同樣,處理視頻文件比處理簡單的圖像文件要復(fù)雜得多,所以要確保在解決問題時系統(tǒng)化。
首先,嘗試通過一個獨(dú)立于OpenCV的軟件訪問網(wǎng)絡(luò)攝像頭。
或者,嘗試將視頻文件加載到電影播放器中。
如果這兩種方法都有效,那么您的OpenCV安裝可能會有問題。
否則,很可能是編解碼器或驅(qū)動程序問題。
創(chuàng)建和解決OpenCV NoneType錯誤的示例
為了演示操作中的NoneType錯誤,我決定創(chuàng)建一個高度簡化的Python+OpenCV腳本,它代表了您在PyImageSearch博客的其他地方可能看到的內(nèi)容。
打開一個新文件,將其命名為display_image.py,并插入以下代碼:
這個程序所做的只是:
解析命令行參數(shù)。
(嘗試)從磁盤加載映像。
將圖像的寬度、高度和深度打印到終端。
將圖像顯示到屏幕上。
對于大多數(shù)熟悉命令行的Python開發(fā)人員來說,這個腳本不會給您帶來任何麻煩。
但是,如果您是程序小白,對命令行參數(shù)不熟悉,如果不小心,很容易遇到NoneType錯誤。
你可能會說怎么做?
答案在于沒有正確使用/理解命令行參數(shù)。
在過去的幾年里,我運(yùn)行這個博客,看到了許多讀者的電子郵件和博客帖子評論,他們試圖修改這個博客?.add_argument?以提供其圖像文件的路徑。
不要這樣做——你不必更改一行參數(shù)解析代碼。
相反,您應(yīng)該花10分鐘閱讀這篇優(yōu)秀的文章,解釋什么是命令行參數(shù)以及如何在Python中使用它們:
https://pyimagesearch.com/2018/03/12/python-argparse-command-line-arguments/?_ga=2.154734704.955629704.1643158794-1706104520.1639213599
如果你想閱讀PyImageSearch博客上的教程,這是必讀的。
使用命令行,因此使用命令行參數(shù),是計算機(jī)科學(xué)家的一個重要組成部分——缺乏命令行技能只會傷害你。你以后會感謝我的。
回到示例,讓我們檢查一下本地目錄的內(nèi)容:
我們可以看到,我有兩個文件:
display_image.py:我將很快執(zhí)行的Python腳本。
jemma.png?:?我將從磁盤加載的照片。
如果我執(zhí)行以下命令,我將看到j(luò)emma.png顯示在我的屏幕上,以及有關(guān)圖像尺寸的信息:

但是,讓我們嘗試加載一個不存在的映像路徑:
果然,這是我們的????NoneType錯誤。
在本例中,這是因為我沒有向CV2.imread提供有效的圖像路。
總結(jié)
在這篇博文中,我討論了OpenCV和Python中的NoneType錯誤和AssertionError異常。
在絕大多數(shù)情況下,這些錯誤可歸因于CV2.imread或CV2.VideoCapture方法。
無論何時遇到這些錯誤之一,請確保在繼續(xù)之前可以加載圖像/讀取幀。在超過95%的情況下,您的圖像/幀沒有被正確讀取。
否則,如果您使用的是命令行參數(shù),并且對它們不熟悉,則可能是您沒有正確使用它們。在這種情況下,請務(wù)必閱讀本教程中有關(guān)命令行參數(shù)的內(nèi)容,以進(jìn)行自我教育——稍后您將感謝我。
無論如何,我希望本教程能幫助您掌握OpenCV!
如果你剛剛開始學(xué)習(xí)計算機(jī)視覺和OpenCV,我強(qiáng)烈建議你看看這本書《實用Python和OpenCV》,這將幫助你掌握基礎(chǔ)知識。(以下為書記鏈接)
https://www.pyimagesearch.com/practical-python-opencv/?_ga=2.160388981.955629704.1643158794-1706104520.1639213599
不然,也可以關(guān)注我,以便于第一時間看到新的文章和教程

沒想到真么快,兩天搞定一篇文章