在運行程序時經常會遇到NoneType相關的錯誤,主要是兩種可能緣由:
(1)cv2.imread()加載圖像的路徑無效
(2)經過cv2.VideoCapture或cv2.read從視頻中讀取圖像存在問題python
在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
超過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安裝可能有問題。不然,極可能是編解碼器或驅動程序問題。code