Pipelines Python SnapScript
Con scripting en Python, puedes utilizar todo el poder de OpenCV para construir rápidamente tus propios pipelines. El intérprete de Python está integrado en el backend de C++ de Limelight, por lo que los errores y fallos se manejan de manera elegante.
Los pipelines regulares de SnapScript se programan directamente en la interfaz web de Limelight.
Limelight maneja el hardware, la interfaz de cámara, las redes, el streaming y el preprocesamiento básico de imágenes. Todo lo que necesitas hacer es escribir una función de Python llamada runPipeline().
- Una de las características más importantes que ofrecemos es el crosshair con un solo clic. El crosshair, crosshair dual, tx, ty, ta, ts, tvert y todas las demás lecturas estándar de NetworkTables de Limelight se vincularán automáticamente al contorno que devuelvas desde la función runPipeline() de Python.
- Escribe tus propias visualizaciones en tiempo real, umbralización, filtrado y omite nuestro backend completamente si lo deseas.
- El scripting de Python de Limelight tiene acceso a las bibliotecas completas de OpenCV y numpy.
- Más allá del acceso a la imagen, la función runPipeline() también tiene acceso a datos del robot. Los equipos de FTC pueden usar updatePythonInputs() y los equipos de FRC pueden actualizar el array de números "llrobot" de NetworkTables. Envía cualquier dato desde tus robots a tus scripts de Python para visualización o aplicaciones avanzadas (Uno podría enviar datos del IMU, datos de pose, velocidad del robot, etc. para usar en scripts de Python)
- La función runPipeline también genera un array de números accesible con getPythonOutputs() y desde el array de números "llpython" de NetworkTables. Esto significa que puedes omitir el crosshair de Limelight y otras funcionalidades completamente y enviar tus propios datos personalizados de vuelta a tus robots.
- Los scripts de Python están aislados dentro de nuestro entorno de C++, por lo que no tienes que preocuparte por fallos. Los cambios en los scripts se aplican instantáneamente, y cualquier mensaje de error se imprime directamente en la interfaz web.
Script Python Mínimo de Limelight
import cv2
import numpy as np
# runPipeline() es llamado cada frame por el backend de Limelight.
def runPipeline(image, llrobot):
# convertir la imagen de entrada al espacio de color HSV
img_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# convertir el hsv a una imagen binaria eliminando cualquier píxel
# que no caiga dentro de los siguientes valores Min/Max de HSV
img_threshold = cv2.inRange(img_hsv, (60, 70, 70), (85, 255, 255))
# encontrar contornos en la nueva imagen binaria
contours, _ = cv2.findContours(img_threshold,
cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
largestContour = np.array([[]])
# inicializar un array vacío de valores para enviar de vuelta al robot
llpython = [0,0,0,0,0,0,0,0]
# si se han detectado contornos, dibujarlos
if len(contours) > 0:
cv2.drawContours(image, contours, -1, 255, 2)
# registrar el contorno más grande
largestContour = max(contours, key=cv2.contourArea)
# obtener el bounding box sin rotar que rodea el contorno
x,y,w,h = cv2.boundingRect(largestContour)
# dibujar el bounding box sin rotar
cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,255),2)
# registrar algunos datos personalizados para enviar de vuelta al robot
llpython = [1,x,y,w,h,9,8,7]
# devolver el contorno más grande para el crosshair de LL, la imagen modificada y datos personalizados del robot
return largestContour, image, llpython