基于Caffe的视频目标检测:修改读取本地视频代码遇报错求助
解决OpenCV读取本地视频时的AttributeError问题
你遇到的这个错误很典型,根源是**cv2.VideoCapture.read()和原代码里的VideoStream.read()返回值格式完全不同**:
- 原代码用的
VideoStream.read()直接返回单帧图像; - 而
cv2.VideoCapture.read()返回的是一个包含两个元素的元组:(success, frame),其中success是布尔值(标记是否成功读取到帧),frame才是你需要的图像数据。
你现在直接把整个元组赋值给frame,后续调用imutils.resize()时,传入的是元组而非图像,自然会触发'tuple' object has no attribute 'shape'的错误。
修复步骤
只需要修改读取帧的代码,拆分返回的元组,并增加读取失败的判断逻辑:
print("[INFO] starting video stream...") vs= cv2.VideoCapture('cars.avi') # 可选:提前检查视频文件是否成功打开 if not vs.isOpened(): print("[ERROR] 无法打开目标视频文件") exit() time.sleep(2.0) fps = FPS().start() # 循环处理视频帧 while True: # 拆分读取返回的元组,分离状态和帧数据 success, frame = vs.read() # 如果读取失败(比如视频播放完毕或文件损坏),终止循环 if not success: print("[INFO] 视频读取完毕或出现错误") break # 继续后续的resize处理 frame = imutils.resize(frame, width=400) # 保留你原来的目标检测、绘制结果、显示帧等代码 # ... # 更新FPS计数器 fps.update()
额外注意事项
- 确保
cars.avi文件和你的脚本在同一目录下,如果不在,要传入完整的文件路径(比如Windows系统下的'C:\\Users\\DEBASMITA\\videos\\cars.avi',注意路径的转义符); - 可以通过
vs.isOpened()提前检查视频是否成功打开,快速排查文件路径错误或视频格式不支持的问题。
内容的提问来源于stack exchange,提问作者Debasmita Bhoumik
相关产品推荐
相关产品推荐

