树莓派4运行路面坑洞检测程序时实现检测到坑洞自动抓拍图像
检测到坑洞自动抓拍对应帧实现方法
核心逻辑很简单:在推理得到检测结果后,判断当前帧是否存在符合置信度要求的坑洞目标,满足条件时调用OpenCV的图像写入接口保存当前帧即可,额外加个时间间隔判断避免同一个坑洞连续重复抓拍占用存储。
具体修改步骤
- 首先在代码开头补充需要的依赖和抓拍相关配置:
import os import time # 抓拍图片保存目录 SAVE_FOLDER = "pothole_captures" # 同一坑洞最小抓拍间隔(单位:秒),避免短时间重复存图 MIN_CAPTURE_GAP = 2 # 初始化上次抓拍时间戳 last_save_ts = 0 # 坑洞对应的类别ID,需和你模型标签文件里的序号匹配 POTHOLE_CLS_ID = 0 # 目录不存在时自动创建 os.makedirs(SAVE_FOLDER, exist_ok=True)
- 然后在你拿到检测结果的代码行
detection_result = detector.detect(input_tensor)后面,追加检测判断和存图逻辑:
# 遍历检测结果判断是否存在坑洞 has_pothole = False for det in detection_result.detections: cat = det.categories[0] # 匹配坑洞类别+满足置信度阈值(和你初始化模型时设的0.3阈值保持一致) if cat.index == POTHOLE_CLS_ID and cat.score >= 0.3: has_pothole = True break current_ts = time.time() # 检测到坑洞 且 距离上次抓拍超过间隔,就执行存图 if has_pothole and (current_ts - last_save_ts) > MIN_CAPTURE_GAP: # 用时间戳生成文件名,避免重名覆盖 file_name = f"pothole_{time.strftime('%Y%m%d_%H%M%S', time.localtime(current_ts))}.jpg" save_path = os.path.join(SAVE_FOLDER, file_name) # 直接保存当前处理后的帧即可,如果你要存带检测框的图,就把画框的代码放在这行前面 cv2.imwrite(save_path, image) print(f"已抓拍坑洞帧,保存路径:{save_path}") # 更新上次抓拍时间 last_save_ts = current_ts
注意事项
- 如果你需要保存无标注的原始帧,就在执行
cv2.flip(image, 1)之后先拷贝一份原始帧变量,存图时用这个原始变量即可;如果要保存带检测框、置信度文字的可视化结果,就等所有绘制操作完成后再调用cv2.imwrite。 - 树莓派4的SD卡存储空间有限,
MIN_CAPTURE_GAP建议设为1~3秒,不要过小,否则同一个坑洞会被连续抓拍几十上百张,很快占满存储。 POTHOLE_CLS_ID一定要和你自己模型的标签映射对应,比如你标签文件里坑洞是第一个类别就填0,第二个就填1,填错会导致误抓拍其他目标。- 不建议在存图时频繁切换相机分辨率,树莓派上USB相机切换分辨率容易触发丢帧、相机断连问题,用你当前推理用的640*480分辨率存图足够做后续核验。
内容的提问来源于stack exchange,提问作者Mae
相关产品推荐
相关产品推荐

