RuntimeWarning:log运算遇除零错误及绘图Frames轴范围缩小问题
问题解决方案
1. 解决RuntimeWarning: divide by zero encountered in log
警告的核心原因是min_width/1.8的值为0(或≤0),而np.log()要求参数必须严格大于0。以下是两种可行处理方案:
添加参数合法性校验:在计算对数前过滤无效输入,避免非法值传入
np.log():min_width = (min(widths_in_frame) * 0.00633217993) # 仅当min_width有效时记录数据 if min_width > 0: log_val = np.log(min_width / 1.8) widths.append(log_val) frames.append(cap.get(cv2.CAP_PROP_POS_FRAMES)) else: # 可选:打印异常提示或记录默认值 print(f"当前帧min_width无效: {min_width},跳过记录")设置安全阈值保留全量帧数据:如果需要保留所有帧的记录,给输入值设置极小阈值避免触发警告:
min_width = (min(widths_in_frame) * 0.00633217993) # 限制最小值为1e-6,确保log参数合法 safe_input = max(min_width / 1.8, 1e-6) log_val = np.log(safe_input) widths.append(log_val) frames.append(cap.get(cv2.CAP_PROP_POS_FRAMES))
2. 解决Frames轴范围从1600缩小至1400的问题
轴范围缩小通常是因为有效帧记录数量减少,或绘图工具自动缩放导致,对应解决方案如下:
检查帧记录完整性:如果是异常帧被跳过导致数据点减少,可调整上述校验逻辑(比如用阈值方案替代直接跳过),确保所有预期帧都被记录。
手动锁定绘图轴范围:以matplotlib为例,绘图时强制指定x轴范围:
import matplotlib.pyplot as plt plt.plot(frames, widths) # 强制设置Frames轴范围为0到1600 plt.xlim(0, 1600) plt.show()验证帧号读取正确性:检查
cap.get(cv2.CAP_PROP_POS_FRAMES)是否返回正确帧号。若视频读取存在跳帧,可尝试调整OpenCV读取参数(比如设置cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)减少缓存影响)。
内容的提问来源于stack exchange,提问作者mais
相关产品推荐
相关产品推荐

