Python SnapScript पाइपलाइन्स
Python स्क्रिप्टिंग के साथ, आप अपनी खुद की पाइपलाइन्स तेज़ी से बनाने के लिए OpenCV की पूरी शक्ति का उपयोग कर सकते हैं। Python इंटरप्रेटर Limelight के C++ बैकएंड में बेक किया गया है, इसलिए एरर और क्रैश को सुचार ू रूप से हैंडल किया जाता है।
रेगुलर SnapScript पाइपलाइन्स को सीधे Limelight वेब इंटरफ़ेस में प्रोग्राम किया जाता है।
Limelight हार्डवेयर, कैमरा इंटरफ़ेसिंग, नेटवर्किंग, स्ट्रीमिंग, और बेसिक इमेज प्री-प्रोसेसिंग को हैंडल करता है। आपको बस runPipeline() नाम का एक python फंक्शन लिखना है।
- हमारी सबसे महत्वपूर्ण फीचर्स में से एक है वन-क्लिक क्रॉसहेयर। क्रॉसहेयर, ड्यूअल क्रॉसहेयर, tx, ty, ta, ts, tvert, और अन्य सभी स्टैंडर्ड limelight NetworkTables रीडिंग्स स्वचालित रूप से उस contour से जुड़ जाएंगी जो आप python runPipeline() फंक्शन से रिटर्न करते हैं।
- अपने खुद के रियल-टाइम विज़ुअलाइज़ेशन, थ्रेशोल्डिंग, फ़िल्टरिंग लिखें, और अगर चाहें तो हमारे बैकएंड को पूरी तरह से बायपास करें।
- Limelight की python स्क्रिप्टिंग के पास पूर्ण OpenCV और numpy लाइब्रेरीज़ तक पहुंच है।
- इमे ज तक पहुंच के अलावा, runPipeline() फंक्शन के पास रोबोट से डेटा तक भी पहुंच है। FTC टीमें updatePythonInputs() का उपयोग कर सकती हैं और FRC टीमें "llrobot" NetworkTables नंबर ऐरे को अपडेट कर सकती हैं। अपने रोबोट्स से अपनी python स्क्रिप्ट्स में विज़ुअलाइज़ेशन या एडवांस्ड एप्लिकेशन के लिए कोई भी डेटा भेजें (कोई python स्क्रिप्ट्स में उपयोग के लिए IMU डेटा, pose डेटा, रोबोट वेलोसिटी, आदि भेज सकता है)
- 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 Min/Max वैल्यूज़ के अंदर नहीं आते
img_threshold = cv2.inRange(img_hsv, (60, 70, 70), (85, 255, 255))
# नई बाइनरी इमेज में contours खोजें
contours, _ = cv2.findContours(img_threshold,
cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
largestContour = np.array([[]])
# रोबोट को वापस भेजने के लिए वैल्यूज़ का एक खाली ऐरे इनिशियलाइज़ करें
llpython = [0,0,0,0,0,0,0,0]
# अगर contours डिटेक्ट हुए हैं, तो उन्हें ड्रॉ करें
if len(contours) > 0:
cv2.drawContours(image, contours, -1, 255, 2)
# सबसे बड़े contour को रिकॉर्ड करें
largestContour = max(contours, key=cv2.contourArea)
# contour के चारों ओर अनरोटेटेड बाउंडिंग बॉक्स प्राप्त करें
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 क्रॉसहेयर के लिए सबसे बड़ा contour, मॉडिफाइड इमेज, और कस्टम रोबोट डेटा रिटर्न करें
return largestContour, image, llpython