Rerun 实战:用 OpenCV Canny 实时可视化相机边缘检测流水线
Rerun 实战用 OpenCV Canny 实时可视化相机边缘检测流水线【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun导读本文围绕 Rerun 仓库中的 live_camera_edge_detection 示例讲解如何捕获实时摄像头画面用 OpenCV Canny 边缘检测算法处理后将 RGB 原图、灰度图和边缘图三路图像同步记录到 Rerun 中进行并排可视化。读完本文你将掌握 Rerun 日志图像的基本 APIrr.Image与rr.log、时间轴设置方式、脚本级 CLI 参数体系--num-frames、--device等以及如何用 Blueprint 代码预设多视图布局为后续接入任何视频/相机类数据流打下基础。示例概览一条输入、三路输出本示例的核心思路非常简洁摄像头每帧图像经 OpenCV 处理后被拆分为三个实体Entity分别写入 Rerun实体路径内容生成方式image/rgbRGB 彩色原图cv2.cvtColor(img, cv2.COLOR_BGR2RGB)或直接声明color_modelBGRimage/gray灰度图cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)image/cannyCanny 边缘检测结果cv2.Canny(gray, 50, 200)完整实现位于 live_camera_edge_detection.py依赖配置见同目录下的 pyproject.toml。三个实体共享同一时间轴因此在 Rerun Viewer 中拖动时间游标时三张视图会逐帧同步刷新方便直观对比原图 → 灰度 → 边缘的处理链条。Canny 边缘检测背景Canny 边缘检测是计算机视觉中最经典的边缘检测算法之一。它能够在显著削减计算量的前提下高效提取视觉对象的重要结构信息轮廓、边界因此常被用作目标检测、车道线识别、SLAM 等任务的前置处理步骤。本示例的完整处理链路为相机帧 (BGR) → RGB 原图 → 灰度化 → Canny 边缘检测灰度化压缩了颜色维度只保留亮度信息使得 Canny 算法能够专注于梯度结构Canny 的双阈值本示例取50与200则用于抑制噪声并连接边缘线段50是低阈值弱边缘判定200是高阈值强边缘判定介于两者之间且与强边缘连通的像素才会被保留为边缘。逐帧处理主循环源码级拆解示例的运行核心是run_canny()函数其逐帧处理流程如下cap cv2.VideoCapture(0) # 打开默认摄像头 frame_nr 0 while cap.isOpened(): if num_frames and frame_nr num_frames: break ret, img cap.read() # 读取一帧 if not ret: ... break # 时间戳优先使用 OpenCV 记录的毫秒时间 frame_time_ms cap.get(cv2.CAP_PROP_POS_MSEC) if frame_time_ms ! 0: rr.set_time(frame_time, duration1e-3 * frame_time_ms) rr.set_time(frame_nr, sequenceframe_nr) # 帧序号时间轴 frame_nr 1 rr.log(image/rgb, rr.Image(img, color_modelBGR)) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) rr.log(image/gray, rr.Image(gray)) canny cv2.Canny(gray, 50, 200) rr.log(image/canny, rr.Image(canny))几个值得注意的工程细节双时间轴代码同时设置了frame_timerr.set_time的duration参数单位为秒和frame_nrsequence参数。frame_time来自cv2.CAP_PROP_POS_MSEC即当前帧在视频流中的毫秒位置可用于对齐真实时间frame_nr则保证即使某些平台返回的时间戳恒为 0源码注释中已特别说明该情况依然可以用帧序号回放数据。通道序声明rr.Image(img, color_modelBGR)直接告诉 Rerun 输入是 BGR 布局省去了cv2.cvtColor转 RGB 的开销这与 README 中先转 RGB 再记录的写法等价两种方式 Rerun 都支持。循环终止既支持--num-frames限制帧数便于演示和测试也会在摄像头断开ret为 False时优雅退出并在首帧就失败时提示No camera connected?。Rerun 图像数据模型rr.Image与颜色模型三路图像全部通过rr.log(entity_path, rr.Image(...))写入。rr.Image是 Rerun SDK 的 图像 archetype其扩展实现 image_ext.py 揭示了底层行为支持三种构造方式按imagenumpy 数组/张量color_model构造按bytespixel_format如 NV12、YUV420 等色度下采样格式构造按bytescolor_modeldatatype构造。通道数自动推断传入二维数组H×W时视为单通道三维数组H×W×C按通道数推断颜色模型——1 通道默认L灰度、3 通道默认RGB、4 通道默认RGBA。显式传入color_model时则会校验通道数是否匹配见channel_count_from_color_model映射表不匹配会发出警告或直接报错。单位维度忽略1x480x640x3x1这类带单位维度的数组会被自动压平为480x640x3与 OpenCV 输出的 ndarray 天然兼容。数据类型推导ChannelDatatype由数组 dtype如uint8自动推导灰度图与边缘图均按单通道uint8编码体积小、传输快。这正是本示例三行日志代码背后的完整语义image/rgb是 3 通道 BGR、image/gray与image/canny是单通道灰度Rerun Viewer 会为单通道图像自动应用默认灰度着色。用 Blueprint 预设三视图布局为了让三路图像并排呈现示例在script_setup阶段通过 rerun.blueprint 声明了默认布局rr.script_setup( args, rerun_example_live_camera_edge_detection, default_blueprintrrb.Vertical( rrb.Horizontal( rrb.Spatial2DView(origin/image/rgb, nameVideo), rrb.Spatial2DView(origin/image/gray, nameVideo (Grayscale)), ), rrb.Spatial2DView(origin/image/canny, nameCanny Edge Detector), row_shares[1, 2], ), )布局结构为第一行左右并排两个Spatial2DViewRGB 视图与灰度视图第二行单独一个大视图显示 Canny 边缘结果row_shares[1, 2]让第二行占据更多垂直空间。这是典型的视频监控墙式布局同一时间轴下三块画面联动回放。脚本级 CLI一行命令获得完整交互能力示例通过 script_setup / script_add_args / script_teardown 这套辅助函数免费获得了一套标准化的 Rerun 脚本参数无需自己实现参数作用--headless不显示 GUI仅在后台运行--connect连接外部 Viewer--url可指定地址--serve启动 gRPC 与 Web 服务并打开 Web Viewer--save path将数据保存为.rrd文件--stdout将数据输出到标准输出可管道给 Viewer在此基础上示例又通过argparse扩展了两个业务参数见 live_camera_edge_detection.py--device摄像头设备编号默认0直接透传给cv2.VideoCapture()可切换外接/多路摄像头--num-frames最多记录的帧数默认不限便于演示时限定时长。script_setup内部会依次执行rr.init、按参数选择数据去向stdout / serve / connect / save / spawn并把default_blueprint一并下发最终script_teardown负责收尾如--serve模式下保持进程存活以持续提供 Web 服务。安装与运行1. 环境准备先安装 Rerun SDK 与示例依赖示例声明于 pyproject.toml核心依赖为opencv-python与rerun-sdkpip install --upgrade rerun-sdk2. 以可编辑模式安装示例pip install -e examples/python/live_camera_edge_detection该命令会同时安装示例本身与opencv-python。pyproject.toml中还注册了控制台入口[project.scripts] live_camera_edge_detection live_camera_edge_detection:main因此安装完成后也可直接用live_camera_edge_detection命令启动等价于python -m live_camera_edge_detection。3. 运行示例python -m live_camera_edge_detection运行后会自动弹出 Rerun Viewer呈现三视图布局。若没有检测到摄像头程序会打印 Failed to capture any frame. No camera connected? 并退出。4. 常用运行姿势# 限定只记录 30 帧仓库 CI 演示即采用此配置见 pyproject.toml 的 extra-args python -m live_camera_edge_detection --num-frames 30 # 切换摄像头设备 python -m live_camera_edge_detection --device 1 # 无界面运行数据保存为 rrd 文件 python -m live_camera_edge_detection --num-frames 30 --save output.rrd # 查看全部参数说明 python -m live_camera_edge_detection --help调试建议与扩展方向排查无画面优先确认摄像头是否被其他进程占用Linux 下可检查/dev/video*或尝试--device 1/2切换设备编号cap.isOpened()为 False 时程序不会进入主循环。调整边缘灵敏度cv2.Canny(gray, 50, 200)的阈值可以改为通过argparse暴露例如--low-threshold/--high-threshold便于交互式调参后对比三视图效果。扩展更多视图仿照现有代码再增加一路实体如把 Canny 结果二值化后叠加到原图rr.Image支持draw_order与opacity实现半透明叠加见 image_ext.py即可快速验证轮廓叠加效果。复用流水线模式本示例的原始帧 中间特征 处理结果三实体同时间轴模式可直接迁移到深度估计、目标检测框叠加等任何逐帧视觉任务只需把 Canny 换成对应算法即可。小结live_camera_edge_detection 是一个麻雀虽小、五脏俱全的 Rerun 视频流水线模板它演示了rr.Image的通道语义与自动推断、rr.set_time的双时间轴用法、script_setup标准 CLI 体系以及 Blueprint 代码布局全部围绕实时摄像头 Canny 边缘检测这一具体场景展开。以它为起点你可以快速把任意逐帧视觉算法接入 Rerun获得可回放、可对比、可分享的可视化体验。【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考