Skip to main content
从连接到 Lager Box 的摄像头串流视频,用于目视检查、自动化视觉测试和远程监视。

导入

方法

方法参考

Net.get(name, type=NetType.Webcam)

按名称获取一个摄像头 Net。
参数: 返回: 摄像头 Net 实例

start(box_ip)

启动一路摄像头视频串流。
参数: 返回: 一个 dict,包含以下键:
  • url - 完整的串流 URL(例如 http://<BOX_IP>:8086/)
  • port - 该串流的端口号
  • already_running - 布尔值,表示该串流是否本就在运行
抛出: 设备已被占用或未找到时抛出 RuntimeError

stop()

停止该摄像头串流。
返回: bool - 成功停止为 True,原本未运行为 False

get_info(box_ip)

获取该串流的信息。
参数: 返回: dict 或 None - 串流信息字典;未运行时为 None。该字典包含以下键:
  • url - 完整的串流 URL
  • port - 该串流的端口号
  • video_device - 视频设备路径,例如 /dev/video0
  • source - 启动该串流的工具:本 Python API 为 'api',lager webcam 为 'cli'。没有记录来源的串流为 None。
  • started_by - 启动工具所给出的用户。从本 Python API 启动的串流为 None。

get_url(box_ip)

只获取该串流的 URL。
参数: 返回: str 或 None - 串流 URL;未运行时为 None

is_active()

检查该串流当前是否正在运行。
返回: bool - 串流正在运行为 True,否则为 False

snapshot(raw=False)

从运行中的串流取一帧 JPEG。
这一帧取自串流自己的采集,因此不会与串流或正在查看它的浏览器争用摄像头。 参数: 返回: bytes - 该 JPEG 异常: 串流已停止,或 5 秒内没有帧时抛出 RuntimeError

frame(raw=True)

从运行中的串流取一帧,并解码以供分析。
参数: 返回: numpy.ndarray - 高 x 宽 x 3,按 OpenCV 使用的 BGR 顺序 异常: 与 snapshot() 相同的 RuntimeError
在 lager python 脚本中请使用 frame(),不要用 cv2.VideoCapture 打开摄像头。串流运行时会占用摄像头,对同一设备的第二个采集得不到任何帧。

controls()

摄像头的图像控制项,每项含当前值和范围。串流启动或停止时都可使用。
返回: 控制项名称到 {"value", "min", "max", "step", "default"} 的 dict,只包含摄像头具备的控制项。名称见摄像头控制。有三个值带自动模式:exposure、white_balance_temperature 和 focus。它们还各有 auto:True、False,摄像头没有对应自动模式时为 None。power_line_frequency 还有 options,为 {"value", "label"} 列表。

set_control(name, value)

设置一个摄像头控制项,并为该 Net 保存。串流启动或停止时都可使用。
参数: 返回: bool - 摄像头接受该值时为 True 异常: 名称不是摄像头控制项时抛出 ValueError

lock_controls(**overrides)

固定所有图像控制项,使画面在帧与帧之间、运行与运行之间可比较。关闭自动曝光、自动白平衡和自动对焦。除非您覆盖,其余控制项都保持当前值。全部为该 Net 保存,然后从摄像头读回。
参数: 返回: dict,包含:
  • ok - 每个控制项读回的值都符合要求时为 True
  • controls - 摄像头每个控制项的 {name: {"wanted", "actual"}}。超出摄像头范围的值会被限制,因此读回不同,ok 为 False
异常: 无法读取摄像头控制项时抛出 RuntimeError;名称未知时抛出 ValueError

摄像头控制

每个范围都是摄像头自己的。例如亮度在某些摄像头上是 0 到 255,在另一些上是 -64 到 64。超出范围的值会被限制,Net 保存的是限制后的值。 手动曝光可能让帧率低于模式的帧率。摄像头仍接受该模式,因此 mode_error 为空:实际帧率请读取 /api/fps。例如,一台全局快门摄像头在 90 fps 模式下,exposure=312 时约为 60 fps,exposure=100 时约为 89 fps。 Lager 只更改您设置的控制项。启动串流时,其余控制项保持摄像头当前的值,因此用其他工具做的设置不受影响。通过 set_control、lock_controls 或查看页面设置的控制项会为该 Net 保存。每次启动其串流时,以及串流为新模式重新打开摄像头之后,都会重新应用它们。这也适用于断电后会忘记设置的摄像头:启动串流,或再次调用 lock_controls。
DirectShow 等 Windows 工具把曝光表示为以秒为单位的 2 的幂:-5 即 2-5 s,31.25 ms。Linux 的值为 10000 * 2**n,因此 -5 对应 exposure=312。

示例

启动多台摄像头

串流管理

目视检查测试

摄像头发现与测试

检测串流是否已在运行

Web 界面

每一路串流在它的 URL 上提供一个查看页面。它的布局和配色与示波器页面(lager scope NET stream web)相同:
  • 页头。其中的 Net 选择器可切换到 Box 上的另一路串流。页头显示摄像头的型号和设备,以及帧率、尺寸和变焦倍数。状态为 LIVE、STALLED(3 秒内没有帧)、WAITING(还没有帧)或 OFFLINE(串流没有响应)
  • 实时画面,上面叠加时钟和变焦倍数。放大后,拖动画面或使用方向键即可平移。双击某一点可放大到该点;已放大时,双击则以该点为中心
  • 侧边栏,包含:
    • Resolution:尺寸和帧率,取自摄像头提供的模式。如果摄像头无法以所选尺寸串流,它会保持原来的模式,页面会说明原因。USB 带宽不足是原因之一
    • View:变焦(滑块、Out、Reset、In)、用于平移的 Centre、Rotate(0、90、180 或 270 度)和 Flip(左右、上下)
    • Focus:Auto 或 Manual,带距离滑块,使用摄像头自己的范围。只有带自动对焦的摄像头才显示该开关
    • Image:曝光(Auto exposure 或带滑块的 Manual)、增益和亮度。还有白平衡(Auto white balance 或带色温的 Manual),以及其他图像控制项的滑块。每项只在摄像头具备时显示,并使用摄像头的范围。开启自动曝光时,增益由摄像头自行设置
    Hide sidebar 可隐藏侧边栏,页面会记住这个选择
  • Full screen 只显示画面
  • Snapshot 把一帧保存为 <net>-<timestamp>.jpg
  • 侧边栏底部显示串流的启动者、设备和端口
每项设置都为该 Net 保存在 Box 上。所有查看该串流的人看到的是同一画面,串流重启后设置也会恢复。尺寸越大,Box 编码所需的 CPU 越多:页头中的帧率显示 Box 能跟上的速度。 在启用访问网关的 Box 上,浏览器会话结束后,页面显示 SIGNED OUT,并提示运行 lager webcam url 获取新链接。

API 端点

硬件要求

lager nets add-all 会为以下摄像头提供 Net:
  • Logitech BRIO、BRIO HD、BRIO 4K Stream、4K Pro、C930e、C925e、C922 Pro、C920、C615、C270 和 StreamCam
  • ELP 全局快门摄像头(AR0234 传感器,USB ID 32e4:0234)
ELP 全局快门摄像头每一台都报告相同的序列号 01.00.00。Lager 会把同一 Box 上的两台列为一台摄像头,带两个视频设备。请手动添加第二台摄像头的 Net,并指定它自己的 /dev/video* 设备。

说明

  • 摄像头 Net 必须在 Lager Box 上配置,并指定视频设备路径
  • 串流使用从 8086 开始的端口
  • 每一路串流使用一个独立端口,由系统自动分配
  • 串流会一直保持,直到被显式停止或其进程结束
  • 已死亡的串流进程会被自动清理
  • 同一时刻只能有一路串流使用某个视频设备
  • 默认分辨率为 640x480,30 FPS。有些摄像头支持更高:ELP 全局快门摄像头在每种尺寸下都支持 90 FPS。Box 会重新编码每一帧,尺寸较大时可能跟不上。查看页面上的帧率显示实际送出的速度
  • JPEG 质量设为 80,以平衡带宽和画质
  • 串流通过 HTTP 在 Lager Box 的 IP 地址上提供。在访问受控的 Box 上,请求需要携带登录令牌,而 start() 返回的 url 不带令牌。请用 lager webcam url 获取带有您令牌的链接
  • 变焦是数字变焦(裁剪并缩放),不是光学变焦