OpenCV:解決NoneType錯誤

(注:本文摘錄自Adrian Rosebrock的教程文章經翻譯整理而來)

在運行程序時經常會遇到NoneType相關的錯誤,主要是兩種可能緣由:
(1)cv2.imread()加載圖像的路徑無效
(2)經過cv2.VideoCapture或cv2.read從視頻中讀取圖像存在問題python

1.Python中的NoneType錯誤

在Python使用過程當中會遇到這樣的錯誤:
AttributeError: 'NoneType' object has no attribute ‘something’
something能夠用實際屬性的名稱替換
當咱們認爲咱們正在使用特定類或對象的實例時會看到這些錯誤,其實是Python內置類型’None‘,’None‘ 表示缺乏值,好比當函數調用返回意外結果或徹底失敗時。
下面是個python遇到NoneType錯誤的例子:網絡

>>> foo = None
>>> foo.bar = True
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'bar'

建立變量foo,賦值爲None,嘗試賦值foo.bar=True , 可是因爲foo 是一個None對象,Python不容許這樣作-所以出現錯誤消息ide

2.介紹95%的OpenCV NoneType錯誤的兩個緣由

超過95%的NoneType錯誤是和cv2.imread或cv2.VideoCapture有關,舉一下兩個例子:
(1)cv2.imread()加載圖像的路徑無效函數

$ python
>>> import cv2
>>> path = "path/to/image/that/does/not/exist.png"
>>> image = cv2.imread(path)
>>> print(image.shape)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'shape'

cv2.imread()接受圖像路徑並不會報錯(即便它不存在),顯示圖像時發現路徑無效,而後返回None。
當嘗試傳遞無效的圖片(即None圖像)到另外一個OpenCV函數中,Python + OpenCV會報錯該圖像沒有任何寬度,高度或深度信息等:翻譯

>>> import cv2
>>> path = "path/to/image/that/does/not/exist.png"
>>> image = cv2.imread(path)
>>> gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor, file /tmp/opencv20150906-42178-3d0iam/opencv-2.4.12/modules/imgproc/src/color.cpp, line 3739
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
cv2.error: /tmp/opencv20150906-42178-3d0iam/opencv-2.4.12/modules/imgproc/src/color.cpp:3739: error: (-215) scn == 3 || scn == 4 in function cvtColor

更罕見的錯誤是假設在磁盤上有一個.JPEG文件,而且確切知道該文件 正確的路徑。而後經過cv2.imread()加載JPEG文件,報錯NoneType或者斷言錯誤 ,多是忘記了在啓用JPEG文件支持的狀況下編譯OpenCV,固然若是按照我推薦的pip安裝是不會出現這個問題的
(2)cv2.VideoCapture()視頻截取錯誤
cv2.VideoCapture()接受一個參數能夠是字符串,表明視頻路徑;或者是整數,表明攝像頭的索引。所以報錯NoneType緣由多是:3d

  • 輸入的視頻文件的路徑可能不正確
  • 沒有安裝正確的視頻編解碼器,在這種狀況下,須要安裝編解碼器,而後從新編譯並從新安裝OpenCV
  • 沒法經過OpenCV訪問網絡攝像頭。這多是因爲多種緣由,包括缺乏驅動程序、錯誤的攝像頭索引傳遞給cv二、或者只是網絡攝像頭未正確鏈接到系統

排查問題:首先,嘗試經過OpenCV以外的軟件訪問網絡攝像頭,或者嘗試在電影播放器​​中打開視頻。若是這兩種方法都起做用,則OpenCV安裝可能有問題。不然,極可能是編解碼器或驅動程序問題。code

相關文章
相關標籤/搜索