تكامل OpenCV مع الفيديو الحي بزاوية 360 درجة للروبوتيات

مع تقدم الذكاء الاصطناعي، يتم استخدام الروبوتات بشكل متزايد لتحرير البشر من مخاطر تفتيش الأماكن الخطرة أو ملل مراقبة الرؤية الروتينية. ولتوفير درجة معينة من القرار الذاتي، غالبًا ما تحتوي الروبوت على كاميرات متصلة بحاسوب Linux مثل NVIDIA Jetson أو حاسوب x86 لوحي (SBC).

إذا كان التطبيق يستفيد من فيديو بزاوية 360 درجة مباشرة، هناك نهجان. النهج الأول، الأصعب، هو استخدام عدة كاميرات ودمج الفيديو معًا على الحاسوب أو معالجة كل تغذية فيديو بشكل منفصل. يعتمد عدد الكاميرات المستخدمة على حقل الرؤية لكل كاميرا. إذا استخدم الروبوت عدستين سمكيتين يمكنهما عرض أكثر من 180 درجة، يكون هناك حاجة إلى كاميرتين فقط. ومن المشترك استخدام ثلاثة أو أربع كاميرات.

النهج الأبسط هو استخدام كاميرا 360° للمستهلك. في مجتمع المطورين المجاني والمستقل theta360.guide، أحد أكثر المواضيع شيوعًا التي يناقشها المطورون هو كيفية إضافة رؤية بزاوية 360° إلى نموذج الروبوت الخاص بهم وتغذية الفيديو إلى OpenCV.

على الرغم من وجود طرق مختلفة للحصول على الفيديو من كاميرا 360° إلى جهاز الكمبيوتر بنظام Linux، إلا أن الطريقة الأكثر شيوعًا هي استخدام كابل USB. لا تحظى الواي فاي والإيثرنت بشعبية مماثلة. يمكن أن تظهر نماذج RICOH THETA V و X و Z1 ككاميرا USB على جهاز الكمبيوتر بنظام Linux. ومع ذلك، يتطلب الأمر بعض العمل على نظام Linux. يمكن لأجهزة MacOS استخدام كاميرا RICOH THETA مباشرة. بالنسبة لنظام Windows، توفر RICOH برنامج تشغيل. بالنسبة لنظام Linux، يوفر RICOH نسخة معدلة من libuvc على GitHub تسمى libuvc-theta

لعرض الكاميرا كجهاز فيديو لـ OpenCV، يوفر RICOH برنامجًا عينيًا يسمى libuvc-theta-sample. يمكن استخدام هذا بالاشتراك مع v4l2loopback لإنشاء جهاز /dev/video* متاح لـ OpenCV.

للاختبار الاتصال بين الكاميرا وجهاز الكمبيوتر بنظام Linux، يجب توصيل كابل USB من الكاميرا إلى جهاز الكمبيوتر بنظام Linux وتشغيل هذه الخطوات:

Shell

 

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 إضافية. سيتم تثبيت جميع المكتبات.

Shell

 

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 بسبب عدم دعم فك ترميز H.264 بدقة 4K. 

إعداد /dev/video*

لجعل جهاز libuvc متاحًا كجهاز فيديو، يمكننا استخدام v4l2loopback. سيرغب تطبيق libuvc-theta-sample في استخدام gstreamer لعرض الفيديو على v4l2.

إذا كان لديك كاميرا فيديو واحدة فقط على جهاز الكمبيوتر الخاص بك، فيجب عليك تعديل هذا السطر قبل تشغيل البناء. السطر أدناه مخصص لجهاز كمبيوتر يحتوي على RICOH THETA متصلاً به ككاميرا ويب الوحيدة:

Plain Text

 

"v4l2sink device=/dev/video0 sync=false";

الوصول من OpenCV

للاختبار ما إذا كان بإمكانك استخدام الكاميرا من OpenCV، دعنا نبدأ بتغيير حجم الإطار بشكل بسيط.

Python

 

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 حوالي 350 مللي ثانية. هذا مرتفع جدًا بالنسبة للعديد من التطبيقات التي تتطلب من الروبوت الاستجابة بسرعة. كما أنه مرتفع جدًا للواقع الافتراضي إذا كنت تتحكم في طائرة بدون طيار تتحرك حول العوائق. يُرجع التأخير إلى تركيب العدستين داخل الكاميرا. لا يمكن تعطيل التركيب على تغذية الفيديو.

بديل لـ v4l2loopback

أثناء إضافة v4l2loopback للتعقيد والتكلفة الإضافية، يمكن استخدام حزمة gstthetauvc للوصول إلى الكاميرا مباشرة من خلال جيستريمر.

هنا نفس الاختبار باستخدام gstthetauvc.

Python

 

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 القديمة على أوبونتو 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 لتحويل الألوان وكشف الحواف.

Python

 

# تحويل إلى درجات الرمادي
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# طمس الصورة للحصول على كشف أفضل للحواف
img_blur = cv2.GaussianBlur(img_gray, (3,3), 0) 
# كشف حواف كاني
edges = cv2.Canny(image=img_blur, threshold1=100, threshold2=200) # كشف حواف كاني
# عرض صورة كشف حواف كاني
cv2.imshow('Canny Edge Detection', edges) 

كشف الأشخاص والشاشات المراقبة بث مباشر.

الكاميرا بها عدستان. الجانب المعاكس لزر الغالق هو العدسة الخلفية ويجب وضعها في وسط المشهد. يكون كشف الكائن دقيقًا عندما يتم وضع الكائن في وسط العرض الكروي.

الإنسان في مركز العدسة الخلفية

ومع ذلك، يعمل الكشف بشكل مقبول جيد عندما يكون الإنسان على حافة الرؤية المتساوية، حتى في الليل. قد تحتاج إلى تدريب نموذجك على قاعدة بيانات تحتوي على صور العدسة السمكية أو الـ 360 درجة.

تم اكتشاف الإنسان على حافة الرؤية المتساوية

تحسين الكشف

الآن بعد أن حصلت على كشف أساسي يعمل في إطارات متساوية الأضلاع من تغذية فيديو 360 درجة مباشرة، يمكنك تجربة تقنيات مختلفة لتحسين الدقة. أحد الطرق هو إنشاء مشاهد مسطحة متعددة من كل إطار ثم كشف الكائن في كل مشهد. الفيديو 360° Object Detect(Yolo) in ROS2 rviz2 and KR260 من إنتاج المهندس misoji يوفر عرضًا جيدًا لهذه التقنية. هناك أيضًا نسخة من YOLO تم تعديلها للاستخدام مع الفيديو البانورامي. راجع الورقة PV-YOLO: نموذج كشف الكائنات للفيديو البانورامي استنادًا إلى YOLOv4.

الاستنتاج

باستخدام كاميرا 360° استهلاكية، يمكنك بسهولة الحصول على فيديو 360° ليظهر ككاميرا USB عبر برامج مثل OpenCV. من خلال جعل الفيديو 360° متاحًا إما كجهاز فيديو أو من خلال gstreamer، يمكن استخدام برامج الكشف القياسية مثل OpenCV أو غيرها على إطارات الفيديو المباشر بتنسيق equirectangular. نظرًا لتشوه الصورة، فإن خوارزمية كشف الكائنات لن تعمل بشكل جيد مقارنة بكاميرا الويب القياسية غير الـ 360°. ومع ذلك، حتى بدون تعديل، يمكنك البدء في الكشف عن بعض الأشياء.

لاستخدام الكشف في مشاريع تعليمية أو بحثية، عليك دراسة تقنيات لتحسين تعرف الكائنات في الرؤية equirectangular المشوهة.

Source:
https://dzone.com/articles/opencv-integration-live-video-for-robotics