כשהבינה המלאכותית מתקדמת יותר, רובוטים משמשים יותר ויותר כדי לשחרר בני אדם מהסיכונים של בדיקת מקומות מסוכנים או מהעבודה השגרתית של פיקוח חזותי. כדי לספק רמה מסוימת של החלטה אוטונומית, לרובוט יש לעיתים קרובות מצלמות מחוברות למחשב לינוקס על הסיפון כמו NVIDIA Jetson או מחשב לוח x86 (SBC).
אם היישום נהנה מסרטון חי ב-360 מעלות, ישנן שתי גישות. הגישה הראשונה, הקשה יותר, היא להשתמש במגוון מצלמות ולחבר את הסרטון יחד במחשב או לעבד כל זרם וידאו בנפרד. מספר המצלמות שנעשה בהן שימוש תלוי בזווית הראיה של כל מצלמה. אם הרובוט משתמש בשתי עדשות עין דג שיכולות להראות יותר מ-180 מעלות, אז נדרשות רק שתי מצלמות. זה נפוץ להשתמש בשלוש או ארבע מצלמות.
גישה פשוטה יותר היא להשתמש במצלמת 360° לצרכנים. בקהילת המפתחים החינמית והעצמאית theta360.guide, אחד הנושאים הפופולריים ביותר עליהם מדברים המפתחים הוא כיצד להוסיף ראיית 360° לפרוטוטיפ הרובוט שלהם ולשלוח את הסרטון ל-OpenCV.
למרות שיש דרכים שונות להעביר את הווידאו מהמצלמה ב-360° למחשב לינוקס, השיטה הפופולרית ביותר היא להשתמש בכבל USB. WiFi ו-Ethernet אינם פופולריים כמו כן. דגמי RICOH THETA V, X ו-Z1 יכולים להופיע כמצלמת USB למחשב הלינוקס. עם זאת, נדרש קצת עבודה על לינוקס. מחשבי MacOS יכולים להשתמש במצלמת RICOH THETA ישירות. עבור Windows, RICOH מספקת דרייבר. עבור לינוקס, RICOH מספקת גרסה מותאמת של libuvc ב-GitHub בשם libuvc-theta.
כדי לחשוף את המצלמה כמכשיר וידאו ל-OpenCV, RICOH מספקת תוכנית דוגמה, libuvc-theta-sample. ניתן להשתמש בזה עם v4l2loopback כדי להפוך את המכשיר /dev/video*
לזמין עבור OpenCV.
כדי לבדוק את חיבור המצלמה למחשב הלינוקס, קודם כל חבר כבל USB מהמצלמה למחשב הלינוקס והרץ את הצעדים הללו:
git clone https://github.com/ricohapi/libuvc-theta.git
sudo apt install libjpeg-dev
cd libuvc-theta
mkdir build
cd build
cmake ..
make
sudo make install
cd ../..
git clone https://github.com/ricohapi/libuvc-theta-sample.git
cd libuvc-theta-sample/gst
make
# THETA חייב להיות מחובר למחשב שלך ובמצב
# שידור חי
./gst_viewer
מצלמת וידאו ב-360° מוצגת עם gstreamer
אם הבנייה נכשלת, ייתכן שתצטרך ספריות gstreamer נוספות. זה יתקין את כל הספריות.
sudo apt-get install \
libgstreamer1.0-0 \
gstreamer1.0-plugins-base \
gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly \
gstreamer1.0-libav \
gstreamer1.0-doc \
gstreamer1.0-tools \
gstreamer1.0-x \
gstreamer1.0-alsa \
gstreamer1.0-gl \
gstreamer1.0-gtk3 \
gstreamer1.0-qt5 \
gstreamer1.0-pulseaudio \
libgstreamer-plugins-base1.0-dev
בנוסף, Raspberry Pi 4 לא יעבוד עקב חוסר תמיכה בפענוח חומרה 4K H.264.
הגדרת /dev/video*
כדי להפוך את מכשיר ה-libuvc לזמין כמכשיר וידאו, אנו יכולים להשתמש ב-v4l2loopback. האפליקציה libuvc-theta-sample תשתמש ב-gstreamer כדי להעביר את הוידאו ל-v4l2.
אם יש לכם רק מצלמת וידאו אחת במחשב, עליכם לשנות שורה זו לפני הרצת הבנייה. השורה למטה היא עבור מחשב עם RICOH THETA מחובר אליו כמכשיר הקלטה היחיד:
"v4l2sink device=/dev/video0 sync=false";
גישה מ-OpenCV
כדי לבדוק אם המצלמה יכולה לשמש מ-OpenCV, נתחיל עם שינוי גודל פשוט של פריים.
import cv2
cap = cv2.VideoCapture(0)
# בדוק אם מצלמת הווב פתוחה כראוי
if not cap.isOpened():
raise IOError("Cannot open webcam")
while True:
ret, frame = cap.read()
frame = cv2.resize(frame, None, fx=0.25, fy=0.25, interpolation=cv2.INTER_AREA)
cv2.imshow('Input', frame)
c = cv2.waitKey(1)
if c == 27:
break
cap.release()
cv2.destroyAllWindows()
עיכוב מצלמה
עיכוב הוא נושא משמעותי בדיונים בקהילה. עיכוב המצלמה של THETA הוא כ-350ms. זה גבוה מדי עבור רבות מהאפליקציות שדורשות שהרובוט יגיב במהירות. זה גם גבוה מדי עבור טלפרסנס אם אתם שולטים בדרון שנע סביב מכשולים. העיכוב נובע מהתפיסה במצלמה של שני העדשות. התפיסה אינה יכולה להיות מושבתת על זרם הוידאו.
חלופה ל-v4l2loopback
כאשר v4l2loopback מוסיף מורכבות ועלות נוספת, אפשר להשתמש בחבילת gstthetauvc כדי לגשת למצלמה ישירות מתוך gstreamer.
הנה אותו מבחן בשימוש ב־gstthetauvc.
import cv2
# הצינורות למטה עבדו
# cap = cv2.VideoCapture("thetauvcsrc \
# ! decodebin \
# ! autovideoconvert \
# ! video/x-raw,format=BGRx \
# ! queue ! videoconvert \
# ! video/x-raw,format=BGR ! queue ! appsink")
# הצעת צינורות תודה לnickel110
# ניסיון לכפות האצת חומרה
# נבדק עם NVIDIA 510.73 ו־GTX 950 ישן על Ubuntu 22.04
cap = cv2.VideoCapture("thetauvcsrc \
! queue \
! h264parse \
! nvdec \
! gldownload \
! queue \
! videoconvert n-threads=0 \
! video/x-raw,format=BGR \
! queue \
! appsink")
if not cap.isOpened():
raise IOError('Cannot open RICOH THETA')
while True:
ret, frame = cap.read()
frame = cv2.resize(frame, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
cv2.imshow('frame', frame)
c = cv2.waitKey(1)
if c == 27:
break
cap.release()
cv2.destroyAllWindows()
דוגמאות של העברת צילום 360 וידאו בשידור חי
הנה כמה דוגמאות לשימוש ב־OpenCV להמרת צבע וזיהוי קצוות.
# המרה לצבע אפור
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# המעורבב את התמונה לזיהוי קצוות טוב יותר
img_blur = cv2.GaussianBlur(img_gray, (3,3), 0)
# זיהוי קצוות Canny
edges = cv2.Canny(image=img_blur, threshold1=100, threshold2=200) # זיהוי קצוות Canny
# הצגת תמונת זיהוי הקצוות של Canny
cv2.imshow('Canny Edge Detection', edges)
זיהוי אדם חי ומוניטור.
למצלמה יש שני עדשות. הצד ההוא לכפתור השוטף הוא העדשה האחורית והיא תונחה במרכז הסצנה. זיהוי העצם הוא הכי מדוייק כאשר העצם ממוקם במרכז התצוגה האיקוורקטנגולרית.
אדם ממוקם במרכז העדשה האחורית
אף על פי כן, הגילוי עובד די טוב כאשר האדם נמצא בקצה התצוגה האקווירקטנגולרית, גם בלילה. עשוי להיות צורך לאמן את המודל על בסיס מסד נתונים של תמונות פישאי או 360°.
אדם זוהה בקצה התצוגה האקווירקטנגולרית
שיפור זיהוי
עכשיו שיש לך זיהוי בסיסי עובד בתצלומות אקווירקטנגולריות מזרם וידאו 360° חי, תוכל לנסות טכניקות שונות לשיפור הדיוק. אחת השיטות היא ליצור סצנות מרובות משטח מכל תמונה ולאחר מכן לזהות את האובייקט בכל סצנה. הסרטון זיהוי אובייקט 360° (Yolo) ב ROS2 rviz2 ו- KR260 מאת המהנדס מיסוג'י מציג הדגמה טובה של טכניקה זו. קיימת גם גרסה של YOLO ששונתה לשימוש עם וידאו פנורמי. ניתן להתייחס למאמר PV-YOLO: מודל זיהוי אובייקטים לווידאו פנורמי המבוסס על YOLOv4.
מסקנה
באמצעות מצלמת 360° מהשוק לצרכן, ניתן בקלות יחסית לגרום לסרטון 360° להופיע כמכשיר מצלמת USB בתוכנות כמו OpenCV. כאשר הסרטון ב-360° נגיש כמכשיר וידאו או נגיש דרך gstreamer, ניתן להשתמש בתוכנות זיהוי סטנדרטיות של OpenCV או אחרות על המסגרות האקווירקטנגלית של הסרטון החי. בשל עיוות התמונה, האלגוריתם לזיהוי אובייקטים לא יעבוד באותה מידה כמו מצלמת USB רגילה שאינה ב-360°. עם זאת, גם ללא שינויים, ניתן להתחיל עם כמה זיהויים.
כדי להשתמש בזיהוי למעלה מאשר בפרויקט חינוכי או מחקרי, תצטרך לבחון טכניקות לשיפור הזיהוי של האובייקטים בתצוגה האקווירקטנגלית המעוותת.
Source:
https://dzone.com/articles/opencv-integration-live-video-for-robotics