Python SnapScript パイプライン
Pythonスクリプティングを使用することで、OpenCVの全機能を活用して独自のパイプラインを迅速に構築できます。PythonインタープリターはLimelightのC++バックエンドに組み込まれているため、エラーやクラッシュは適切に処理されます。
通常のSnapScriptパイプラインは、Limelightのウェブインターフェースで直接プログラミングされます。
Limelightはハードウェア、カメラインターフェース、ネットワーキング、ストリーミング、基本的な画像前処理を処理します。あなたがする必要があるのは、runPipeline()というPython関数を1つ書くだけです。
- 私たちが提供する最も重要な機能の1つは、ワンクリックのクロスヘアです。クロスヘア、デュアルクロスヘア、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