Pular para o conteúdo principal

Pipelines SnapScript Python

Com scripts Python, você pode utilizar todo o poder do OpenCV para construir rapidamente seus próprios pipelines. O interpretador Python está integrado ao backend C++ do Limelight, então erros e falhas são tratados de forma elegante.

Pipelines SnapScript regulares são programados diretamente na interface web do Limelight.

O Limelight cuida do hardware, interface da câmera, rede, streaming e pré-processamento básico de imagem. Tudo o que você precisa fazer é escrever uma função Python chamada runPipeline().

  • Um dos recursos mais importantes que oferecemos é a mira com um clique. A mira, mira dupla, tx, ty, ta, ts, tvert e todas as outras leituras padrão do NetworkTables do Limelight serão automaticamente vinculadas ao contorno que você retornar da função runPipeline() em Python.
  • Escreva suas próprias visualizações em tempo real, limiarização, filtragem e ignore completamente nosso backend, se desejar.
    • O scripting Python do Limelight tem acesso às bibliotecas completas OpenCV e numpy.
    • Além do acesso à imagem, a função runPipeline() também tem acesso aos dados do robô. Equipes FTC podem usar updatePythonInputs() e equipes FRC podem atualizar o array de números "llrobot" do NetworkTables. Envie quaisquer dados de seus robôs para seus scripts Python para visualização ou aplicações avançadas (Pode-se enviar dados de IMU, dados de pose, velocidade do robô, etc. para uso em scripts Python)
    • A função runPipeline também gera um array de números acessível com getPythonOutputs() e do array de números "llpython" do NetworkTables. Isso significa que você pode ignorar completamente a mira do Limelight e outras funcionalidades e enviar seus próprios dados personalizados de volta para seus robôs.
    • Os scripts Python são isolados dentro do nosso ambiente C++, então você não precisa se preocupar com falhas. Alterações nos scripts são aplicadas instantaneamente, e quaisquer mensagens de erro são impressas diretamente na interface web.

Script Python Mínimo do Limelight


import cv2
import numpy as np

# runPipeline() é chamada a cada quadro pelo backend do Limelight.
def runPipeline(image, llrobot):
# converte a imagem de entrada para o espaço de cores HSV
img_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# converte o HSV para uma imagem binária removendo quaisquer pixels
# que não estejam dentro dos seguintes valores Min/Max de HSV
img_threshold = cv2.inRange(img_hsv, (60, 70, 70), (85, 255, 255))

# encontra contornos na nova imagem binária
contours, _ = cv2.findContours(img_threshold,
cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

largestContour = np.array([[]])

# inicializa um array vazio de valores para enviar de volta ao robô
llpython = [0,0,0,0,0,0,0,0]

# se contornos foram detectados, desenha-os
if len(contours) > 0:
cv2.drawContours(image, contours, -1, 255, 2)
# registra o maior contorno
largestContour = max(contours, key=cv2.contourArea)

# obtém a caixa delimitadora não rotacionada que envolve o contorno
x,y,w,h = cv2.boundingRect(largestContour)

# desenha a caixa delimitadora não rotacionada
cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,255),2)

# registra alguns dados personalizados para enviar de volta ao robô
llpython = [1,x,y,w,h,9,8,7]

# retorna o maior contorno para a mira do LL, a imagem modificada e dados personalizados do robô
return largestContour, image, llpython