Python SnapScript 流水线
通过 Python 脚本,你可以充分利用 OpenCV 的功能来快速构建自己的流水线。Python 解释器已经内置在 Limelight 的 C++ 后端中,因此错误和崩溃都能得到妥善处理。
常规的 SnapScript 流水线直接在 Limelight 网页界面中编程。
Limelight 负责处理硬件、相机接口、网络、流媒体和基本图像预处理。你只需要编写一个名为 runPipeline() 的 Python 函数。
- 我们提供的最重要功能之一是一键式准星。准星、双准星、tx、ty、ta、ts、tvert 以及所有其他标准的 Limelight NetworkTables 读数都会自动锁定到你从 Python runPipeline() 函数返回的轮廓上。
- 编写你自己的实时可视化、阈值处理、过滤,如果需要的话可以完全绕过我们的后端。
- Limelight 的 Python 脚本可以访问完整的 OpenCV 和 numpy 库。
- 除了可以访问图像外,runPipeline() 函数还可以访问来自机器人的数据。FTC 队伍可以使用 updatePythonInputs(), 而 FRC 队伍可以更新 "llrobot" NetworkTables 数值数组。从你的机器人发送任何数据到 Python 脚本进行可视化或高级应用(可以发送 IMU 数据、位姿数据、机器人速度等,用于 Python 脚本)
- runPipeline 函数还输出一个可通过 getPythonOutputs() 和 "llpython" networktables 数值数组访问的数值数组。这意味着你可以完全绕过 Limelight 的准星和其他功能,将你自己的自定义数据发送回机器人。
- Python 脚本在我们的 c++ 环境中是沙盒化的,所以你不用担心崩溃。对脚本的更改会立即生效,任何错误消息都会直接打印到网页界面。
最简 Limelight Python 脚本
import cv2
import numpy as np
# runPipeline() 每帧都会被 Limelight 后端调用
def runPipeline(image, llrobot):
# 将输入图像转换为 HSV 颜色空间
img_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 通过移除不在以下 HSV 最小/最大值范围内的像素
# 将 hsv 转换为二值图像
img_threshold = cv2.inRange(img_hsv, (60, 70, 70), (85, 255, 255))
# 在新的二值图像中查找 轮廓
contours, _ = cv2.findContours(img_threshold,
cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
largestContour = np.array([[]])
# 初始化一个空数组用于发送回机器人的值
llpython = [0,0,0,0,0,0,0,0]
# 如果检测到轮廓,就绘制它们
if len(contours) > 0:
cv2.drawContours(image, contours, -1, 255, 2)
# 记录最大轮廓
largestContour = max(contours, key=cv2.contourArea)
# 获取包围轮廓的未旋转边界框
x,y,w,h = cv2.boundingRect(largestContour)
# 绘制未旋转边界框
cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,255),2)
# 记录一些要发送回机器人的自定义数据
llpython = [1,x,y,w,h,9,8,7]
# 返回最大轮廓用于 LL 准星、修改后的图像和自定义机器人数据
return largestContour, image, llpython