OpenCV Integratie Met Live 360 Video Voor Robotica

Naarmate kunstmatige intelligentie geavanceerder wordt, worden robots steeds vaker gebruikt om mensen te bevrijden van de risico’s van inspectie op gevaarlijke locaties of de eentonigheid van routinematig visueel toezicht. Om enige mate van autonome besluitvorming te bieden, heeft de robot vaak camera’s verbonden met een ingebed Linux-computer zoals een NVIDIA Jetson of x86 single-board computer (SBC).

Als de toepassing baat heeft bij live 360-gradenvideo, zijn er twee benaderingen. De eerste, meer uitdagende benadering is om meerdere camera’s te gebruiken en de video op de computer samen te voegen of elk videofeed afzonderlijk te verwerken. Het aantal gebruikte camera’s is afhankelijk van het gezichtsveld van elke camera. Als de robot twee fisheye-lenzen gebruikt die meer dan 180 graden kunnen tonen, zijn er slechts twee camera’s nodig. Het is gebruikelijk om drie of vier camera’s te gebruiken.

Een eenvoudigere benadering is om een consumenten 360°-camera te gebruiken. Op de gratis en onafhankelijke theta360.guide ontwikkelaarsgemeenschap, is een van de meest besproken onderwerpen hoe 360°-zicht toe te voegen aan hun robotprototype en de video in OpenCV te voeden.

Hoewel er verschillende manieren zijn om de video van de 360° camera naar de Linux computer te krijgen, is de meest populaire methode het gebruik van een USB-kabel. WiFi en Ethernet zijn minder populair. De RICOH THETA V, X en Z1 modellen kunnen als een USB-webcam verschijnen op de Linux computer. Er is echter enige inspanning nodig op Linux. MacOS computers kunnen de RICOH THETA camera rechtstreeks gebruiken. Voor Windows biedt RICOH een stuurprogramma aan. Voor Linux levert RICOH een gewijzigde versie van libuvc op GitHub genaamd libuvc-theta.

Om de camera als een videotoestel aan OpenCV bloot te stellen, biedt RICOH een voorbeeldprogramma, libuvc-theta-sample. Dit kan worden gebruikt met v4l2loopback om een /dev/video* toestel beschikbaar te maken voor OpenCV.

Om de verbinding tussen de camera en de Linux computer te testen, sluit eerst een USB-kabel van de camera aan op de Linux computer en voer deze stappen uit:

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 moet op uw computer zijn aangesloten en in 
# live streaming modus

./gst_viewer

360° video camera weergegeven met gstreamer

Als de bouw mislukt, heeft u mogelijk aanvullende gstreamer-bibliotheken nodig. Dit installeert alle bibliotheken.

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

Daarnaast werkt een Raspberry Pi 4 niet vanwege een gebrek aan ondersteuning voor hardwaredecodering van 4K H.264.

Instellen van /dev/video*

Om het libuvc-apparaat beschikbaar te maken als een videotoestel, kunnen we v4l2loopback gebruiken. De libuvc-theta-sample-toepassing zal gstreamer gebruiken om de video naar v4l2 te sturen.

Als je slechts één videocamera op je computer hebt, dan moet je deze regel aanpassen voordat je de build uitvoert. De onderstaande regel is voor een computer met de RICOH THETA erop aangesloten als enige webcam:

Plain Text

 

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

Toegang vanuit OpenCV

Om te testen of de camera kan worden gebruikt vanuit OpenCV, beginnen we met een eenvoudige formaataanpassing van het frame.

Python

 

import cv2

cap = cv2.VideoCapture(0)

# Controleer of de webcam correct is geopend
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()

Camera Latency

Latentie is een groot probleem in de gemeenschapsdiscussies. De latentie van de THETA-camera is ongeveer 350ms. Dit is te hoog voor veel toepassingen die vereisen dat de robot snel reageert. Het is ook te hoog voor telepresence als je een drone bestuurt die zich om obstakels verplaatst. De latentie wordt veroorzaakt door het in-camera samenvoegen van de twee lenzen. Het samenvoegen kan niet worden uitgeschakeld op de videofeed.

Alternatief voor v4l2loopback

Aangezien v4l2loopback complexiteit en overhead toevoegt, kan het gstthetauvc-pakket worden gebruikt om rechtstreeks toegang te krijgen tot de camera vanuit gstreamer.

Hier is dezelfde test met gebruik van gstthetauvc.

Python

 

import cv2
# onderstaande pipeline werkte
# cap = cv2.VideoCapture("thetauvcsrc \
#     ! decodebin \
#     ! autovideoconvert \
#     ! video/x-raw,format=BGRx \
#     ! queue ! videoconvert \
#     ! video/x-raw,format=BGR ! queue ! appsink")

# pipeline suggestie dankzij nickel110
# poging om hardwareversnelling af te dwingen
# getest met NVIDIA 510.73 met oude GTX 950 op 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()

Voorbeelden van 360 Video Live Feed

Hier zijn enkele voorbeelden van het gebruik van OpenCV voor kleurtransformatie en randdetectie.

Python

 

# Omzetten naar grijswaarden
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Vervagen van de afbeelding voor betere randdetectie
img_blur = cv2.GaussianBlur(img_gray, (3,3), 0) 
# Canny Edge Detection
edges = cv2.Canny(image=img_blur, threshold1=100, threshold2=200) # Canny Edge Detection
# Weergave van de afbeelding met Canny Edge Detection
cv2.imshow('Canny Edge Detection', edges) 

Detectie van personen en monitoren in realtime.

De camera heeft twee lenzen. De zijde tegenover de ontspanknop is de achterste lens en wordt in het midden van de scène geplaatst. De objectdetectie is het meest nauwkeurig wanneer het object zich in het midden van het equirectangulaire beeld bevindt.

De mens bevindt zich in het midden van de achterste lens

Echter werkt de detectie redelijk goed wanneer de persoon aan de rand van het equirectangulaire beeld staat, zelfs ’s nachts. Je moet je model misschien trainen op een database van fisheye- of 360°-afbeeldingen.

Mens gedetecteerd aan de rand van het equirectangulaire beeld

Verbetering van de Detectie

Nu je basisdetectie hebt werken in equirectangulaire frames van een live 360° videofeed, kun je experimenteren met verschillende technieken om de nauwkeurigheid te verbeteren. Een methode is om meerdere afgevlakte scènes te maken van elk frame en vervolgens het object in elke scène te detecteren. De video 360° Object Detect(Yolo) in ROS2 rviz2 and KR260 door misoji engineer geeft een goede demonstratie van deze techniek. Er is ook een versie van YOLO die is aangepast voor gebruik met panoramische video’s. Raadpleeg het artikel PV-YOLO: Een Objectdetectiemodel voor Panoramische Video’s gebaseerd op YOLOv4.

Conclusie

Met behulp van een kant-en-klare consumenten 360° camera kun je vrij eenvoudig de 360° video laten verschijnen als een USB-webcam voor software zoals OpenCV. Met de 360° video toegankelijk als een videodevice of toegankelijk via gstreamer, kunnen standaard OpenCV of andere detectiesoftware worden gebruikt op de equirectangular frames van de live video. Vanwege de vervorming van het beeld zal het objectdetectiealgoritme niet zo goed werken als bij een standaard niet-360° webcam. Toch kun je zelfs zonder aanpassingen aan de slag met wat detectie.

Om de detectie daadwerkelijk te gebruiken voor meer dan alleen een educatief of onderzoeksproject, zul je moeten kijken naar technieken om de herkenning van de objecten in het vervormde equirectangular beeld te verbeteren.

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