当尝试在 Linux 上实现基本的 try/ except 语句以从相机获取帧时,我注意到当相机丢失或设备索引错误时,OpenCV 不会引发错误;相反,它会打印一条警告。我怎样才能捕捉到这个?
示例:
import cv2
def foo(camera_index):
try:
cap = cv2.VideoCapture(camera_index)
except Exception:
print("Couldn't open camera at {}".format(camera_index))
在 /dev/video/0 处使用工作摄像头运行 foo(1) 将打印:
WARN:0] global /tmp/pip-req-build-kne9u3r2/opencv/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video1): can't open camera by index
然后我的 except 就没用了,因为 cv2 永远不会引发适当的异常(但消息文本听起来像是一个错误)。
OpenCV 没有对
VideoCapture
失败抛出异常。它返回一个错误代码(通常为
None
)和一个警告消息。要捕获这种情况并抛出异常,可以检查
VideoCapture
的打开状态,并根据需要手动抛出异常。
以下是更新后的代码:
import cv2
def foo(camera_index):
try:
cap = cv2.VideoCapture(camera_index)
# 检查 cap 是否已成功打开
if not cap.isOpened():
raise IOError("Cannot open webcam")
except IOError as e:
print(e)
在这个代码中:
-
我们创建
VideoCapture
对象。 -
我们使用
cap.isOpened()
检查摄像头是否已成功打开。 -
如果
cap.isOpened()
返回False
,我们抛出一个IOError
,表示无法打开摄像头。 -
然后,可以使用
try...except
块捕获IOError
并优雅地处理它。
通过这种方式,可以将 OpenCV 的警告行为转换为可捕获的异常,从而更好地控制错误处理。
标签:python,opencv,error-handling,video-capture From: 64393215