로봇 공학을 위한 실시간 360도 비디오와의 OpenCV 통합

인공지능이 더 발전함에 따라 로봇은 위험한 장소를 조사하거나 일상적인 시각 감시의 심한 일을 인간으로부터 해방하는 데 점점 더 사용되고 있습니다. 일부 자율적인 결정을 제공하기 위해 로봇은 종종 NVIDIA Jetson이나 x86 싱글 보드 컴퓨터(SBC)와 같은 내장형 리눅스 컴퓨터에 연결된 카메라를 가지고 있습니다.

만약 응용 프로그램이 실시간 360도 영상을 활용한다면 두 가지 접근 방식이 있습니다. 첫 번째, 더 어려운 방식은 여러 카메라를 사용하고 컴퓨터에서 영상을 조립하거나 각 영상 피드를 별도로 처리하는 것입니다. 사용되는 카메라의 수는 각 카메라의 시야에 따라 다릅니다. 로봇이 180도 이상을 보여줄 수 있는 두 개의 피시아이 렌즈를 사용한다면 두 개의 카메라만 필요합니다. 세 개 또는 네 개의 카메라를 사용하는 것이 일반적입니다.

더 간단한 방법은 소비자용 360° 카메라를 사용하는 것입니다. 자유롭고 독립적인 theta360.guide 개발자 커뮤니티에서 개발자들이 가장 인기 있는 주제 중 하나는 360° 비전을 로봇 프로토타입에 추가하고 영상을 OpenCV로 전달하는 방법에 대해 논의하는 것입니다.

360° 카메라에서 Linux 컴퓨터로 비디오를 가져오는 방법은 여러 가지가 있지만, 가장 일반적인 방법은 USB 케이블을 사용하는 것입니다. WiFi와 Ethernet은 그다지 인기가 없습니다. RICOH THETA V, X, Z1 모델은 Linux 컴퓨터에 USB 웹캠으로 나타날 수 있습니다. 그러나 Linux에서는 약간의 작업이 필요합니다. MacOS 컴퓨터는 RICOH THETA 카메라를 직접 사용할 수 있습니다. Windows의 경우 RICOH에서 드라이버를 제공합니다. Linux의 경우 RICOH는 GitHub에서 libuvc-theta라는 수정된 버전의 libuvc를 제공합니다.

카메라를 OpenCV에 비디오 장치로 노출하기 위해 RICOH는 샘플 프로그램인 libuvc-theta-sample를 제공합니다. 이 프로그램은 v4l2loopback와 함께 사용하여 OpenCV에서 /dev/video* 장치를 사용할 수 있도록 합니다.

Linux 컴퓨터와 카메라 연결을 테스트하려면 먼저 카메라에서 Linux 컴퓨터로 USB 케이블을 연결하고 다음 단계를 수행하세요:

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

gstreamer로 표시된 360° 비디오 카메라

빌드에 실패하면 추가 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는 4K H.264 하드웨어 디코딩 지원 부족으로 인해 작동하지 않습니다.

/dev/video* 설정

libuvc 장치를 비디오 장치로 사용할 수 있게 만들려면 v4l2loopback을 사용할 수 있습니다. libuvc-theta-sample 애플리케이션은 비디오를 v4l2로 싱크하기 위해 gstreamer를 사용할 것입니다.

컴퓨터에 하나의 비디오 카메라만 있는 경우, 빌드를 실행하기 전에 이 줄을 수정해야 합니다. 아래 줄은 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 카메라의 레이턴시는 약 350ms입니다. 로봇이 빠르게 반응해야 하는 많은 애플리케이션에는 이것이 너무 높습니다. 또한 장애물 주위를 움직이는 드론을 제어하는 경우에도 레이턴시가 너무 높습니다. 레이턴시는 두 렌즈의 카메라 내 스티칭 때문입니다. 비디오 피드에서 스티칭을 비활성화할 수 없습니다.

v4l2loopback 대체안

v4l2loopback이 복잡성과 오버헤드를 추가하므로, gstthetauvc 패키지를 사용하여 gstreamer에서 카메라에 직접 접근할 수 있습니다.

다음은 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의 파이프라인 제안에 감사드립니다
# 하드웨어 가속 강제 시도
# Ubuntu 22.04에서 오래된 GTX 950과 함께 NVIDIA 510.73로 테스트했습니다
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° 비디오 피드의 등각 사각형 프레임에서 기본 탐지가 작동하므로, 정확성을 향상시키기 위한 다양한 기술을 실험할 수 있습니다. 한 가지 방법은 각 프레임에서 여러 개의 평면 장면을 만들고 각 장면에서 객체를 감지하는 것입니다. misoji 엔지니어의 비디오 360° 객체 감지(Yolo) in ROS2 rviz2 and KR260는 이 기술을 잘 보여줍니다. 파노라마 비디오와 함께 사용하도록 수정된 YOLO 버전도 있습니다. 논문 PV-YOLO: YOLOv4 기반 파노라마 비디오를 위한 객체 탐지 모델을 참조하세요.

결론

소비자용 오프더셀프 360° 카메라를 사용하면 360° 비디오를 USB 웹캠으로 쉽게 만들어 OpenCV와 같은 소프트웨어에서 사용할 수 있습니다. 360° 비디오는 비디오 장치로도 액세스하거나 gstreamer를 통해 액세스할 수 있으며, 표준 OpenCV나 다른 감지 소프트웨어를 실시간 비디오의 이퀴렉텡근면 프레임에 사용할 수 있습니다. 이미지 왜곡으로 인해 객체 감지 알고리즘은 일반 비-360° 웹캠과 비교했을 때 잘 작동하지 않을 것입니다. 그러나 수정 없이도 일부 감지를 시작할 수 있습니다. 실제로 왜곡된 이퀴렉텡근면 뷰에서 객체를 더 잘 인식하도록 기법을 개선해야 합니다.

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