鱼眼相机实时视频去畸变报错:'NoneType'无shape属性
解决鱼眼相机实时流去畸变时的AttributeError问题
错误原因
报错AttributeError: 'NoneType' object has no attribute 'shape'是因为cap.read()未能成功读取视频帧,返回的frame为None。常见触发场景:
- 视频文件路径填写错误
- 摄像头设备无法被OpenCV识别
- 视频流已播放完毕
解决方案
1. 验证视频源并添加帧读取检查
在循环中先判断帧读取状态,若读取失败直接退出循环,避免后续代码报错:
while True: success, frame = cap.read() # 检查是否成功读取帧 if not success: break
2. 优化代码结构(提升运行效率)
将固定的相机校准参数、去畸变映射表移到循环外部,避免每次循环重复计算:
修改后的完整代码
import cv2 import numpy as np # 初始化视频捕获:替换为正确的视频路径或摄像头索引(如0代表默认摄像头) cap = cv2.VideoCapture('正确的视频路径或设备索引') # 提前检查视频捕获是否成功打开 if not cap.isOpened(): print("无法打开视频源") exit() # 获取视频属性 frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) fps = cap.get(cv2.CAP_PROP_FPS) # 初始化视频写入器 fourcc = cv2.VideoWriter_fourcc(*'XVID') output = cv2.VideoWriter('output.mp4', fourcc, fps, (frame_width, frame_height)) # 相机校准参数(移到循环外,避免重复定义) DIM = (1280, 720) K = np.array([[378.68613029205295, 0.0, 631.5070934616149], [0.0, 379.1372862000342, 353.49063700941866], [0.0, 0.0, 1.0]]) D = np.array([[-0.044342379001557394], [0.07719525629446446], [-0.07364775294823307], [0.023329834056879786]]) # 预计算去畸变映射表(仅需计算一次) map1, map2 = cv2.fisheye.initUndistortRectifyMap(K, D, np.eye(3), K, DIM, cv2.CV_16SC2) while True: success, frame = cap.read() if not success: break # 读取失败或视频结束时退出循环 # 执行去畸变 new_frame = cv2.remap(frame, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT) # 写入输出视频 output.write(new_frame) # 按q键手动退出 if cv2.waitKey(20) == ord('q'): break # 释放资源 cap.release() output.release() cv2.destroyAllWindows()
额外注意事项
- 若使用摄像头,确保设备未被其他程序占用
- 视频写入时,输出文件的尺寸需与去畸变后的帧尺寸匹配(此处DIM为1280x720,若原视频尺寸不同,需调整写入器的尺寸参数)
内容的提问来源于stack exchange,提问作者Rune619
相关产品推荐
相关产品推荐

