OpenCV:解决NoneType错误

(注:本文摘录自Adrian Rosebrock的教程文章经翻译整理而来)

在运行程序时常常会遇到NoneType相关的错误,主要是两种可能原因:
(1)cv2.imread()加载图像的路径无效
(2)通过cv2.VideoCapture或cv2.read从视频中读取图像存在问题

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 "", line 1, in 
AttributeError: 'NoneType' object has no attribute 'bar'

创建变量foo,赋值为None,尝试赋值foo.bar=True , 但是由于foo 是一个None对象,Python不允许这样做-因此出现错误消息

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 "", line 1, in 
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 "", line 1, in 
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原因可能是:

  • 输入的视频文件的路径可能不正确
  • 没有安装正确的视频编解码器,在这种情况下,需要安装编解码器,然后重新编译并重新安装OpenCV
  • 无法通过OpenCV访问网络摄像头。这可能是由于多种原因,包括缺少驱动程序、错误的摄像头索引传递给cv2、或者只是网络摄像头未正确连接到系统

排查问题:首先,尝试通过OpenCV之外的软件访问网络摄像头,或者尝试在电影播放器​​中打开视频。如果这两种方法都起作用,则OpenCV安装可能有问题。否则,很可能是编解码器或驱动程序问题。

你可能感兴趣的:(python,ubuntu,linux,图像识别,人工智能)