خطوط أنابيب Python SnapScript
باستخدام البرمجة النصية بلغة Python، يمكنك الاستفادة من القوة الكاملة لـ OpenCV لبناء خطوط الأنابيب الخاصة بك بسرعة. مفسر Python مدمج في الواجهة الخلفية C++ لـ Limelight، لذلك يتم التعامل مع الأخطاء والأعطال بسلاسة.
يتم برمجة خطوط أنابيب SnapScript العادية مباشرة في واجهة الويب الخاصة بـ Limelight.
يتعامل Limelight مع الأجهزة، وواجهة الكاميرا، والشبكات، والبث، ومعالجة الصور الأساسية. كل ما عليك فعله هو كتابة دالة Python واحدة تسمى runPipeline().
- واحدة من أهم الميزات التي نقدمها هي العلامة المتقاطعة بنقرة واحدة. ستلتصق العلامة المتقاطعة، والعلامة المتقاطعة المزدوجة، وtx، وty، وta، وts، وtvert، وجميع قراءات NetworkTables القياسية الأخرى لـ limelight تلقائيًا بالكفاف الذي تعيده من دالة runPipeline() في Python.
- اكتب التصورات الخاصة بك في الوقت الفعلي، والعتبات، والتصفية، وتجاوز الواجهة الخلفية لدينا بالكامل إذا رغبت في ذلك.
- تتمتع البرمجة النصية لـ Python في Limelight بإمكانية الوصول إلى مكتبات OpenCV وnumpy الكاملة.
- بالإضافة إلى الوصول إلى الصورة، تتمتع دالة runPipeline() أيضًا بإمكانية الوصول إلى البيانات من الروبوت. يمكن لفرق FTC استخدام updatePythonInputs() ويمكن لفرق FRC تحديث مصفوفة الأرقام "llrobot" في NetworkTables. أرسل أي بيانات من الروبوتات الخاصة بك إلى نصوص Python للتصور أو التطبيقات المتقدمة (يمكن للمرء إرسال بيانات IMU، وبيانات الوضع، وسرعة الروبوت، وما إلى ذلك لاستخدامها في نصوص Python)
- تُخرج دالة runPipeline أيضًا مصفوفة أرقام يمكن الوصول إليها باستخدام getPythonOutputs() ومن مصفوفة الأرقام "llpython" في networktables. هذا يعني أنه يمكنك تجاوز العلامة المتقاطعة لـ Limelight ووظائف أخرى بالكامل وإرسال بياناتك المخصصة مرة أخرى إلى الروبوتات الخاصة بك.
- نصوص Python محمية داخل بيئة C++ الخاصة بنا، لذلك لا داعي للقلق بشأن الأعطال. يتم تطبيق التغييرات على النصوص فورًا، ويتم طباعة أي رسائل خطأ مباشرة في واجهة الويب.
نص Python الأدنى لـ Limelight
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