본문 바로가기
NVIDIA Jeston/CUDAㆍVPI

NVIDIA VPI 를 이용한 스테레오 카메라 Example

by makepluscode 2022. 7. 20.
반응형

VPI 를 통한 하드웨어 가속 스테레오 카메라 예제

NVIDIA Xavier NX devkit 에서 VPI (Vision Programming Interface) 를 통해 하드웨어 가속이 되는 스테레오 카메라 예제 실행 방법을 정리한다.

VPI (Vision Programming Interface) 가 아닌 OpenCV 를 이용한 스테레오 카메라 개발은 아래 포스팅을 참고한다.

2022.06.12 - [프로그래밍/OpenCV] - [OPENCV] 스테레오 카메라 StereoBM 예제 첫번째

2022.06.15 - [프로그래밍/OpenCV] - [OPENCV] 스테레오 깊이맵 성능 높이기

2022.06.15 - [프로그래밍/OpenCV] - [OPENCV] SGBM vs StereoBM 깊이맵 결과 비교

2022.06.16 - [프로그래밍/OpenCV] - [OPENCV] 카메라 캘리브레이션

2022.06.18 - [프로그래밍/OpenCV] - [OPENCV] 카메라 이미지 왜곡보정

VPI 스테레오 카메라 예제

테스트 환경

  • NVIDIA Xavier NX devkit (16G emmc module)
  • Jetpack 4.6 (L4T R32.6.1)

NVIDIA 엔비디아 공식 github 예제에서는 라즈베리파이 카메라 v2 (sony imx219) 2개를 사용하였다. 이 예제에서는 아래 그림의 e-consystems mipi 카메라로 테스트 하였다. (베이스라인 약 6cm)

makepluscode

소스 다운로드 및 빌드

NVIDIA 엔비디아 stereo camera 예제를 다운로드 한다.

$ git clone https://github.com/NVIDIA-AI-IOT/jetson-stereo-depth.git

NVIDIA 엔비디아 stereo camera 예제를 빌드하기 위해서 종속 패키지를 설치한다.

$ sudo apt install libnvvpi1 python3-vpi1 vpi1-dev

NVIDIA 엔비디아 stereo camera 예제는 라즈베리파이 카메라 v2 (sony imx219) 2개를 사용하였다. 이 예제에서는 아래 그림의 e-consystems mipi 카메라를 사용했기 때문에 카메라에 맞게 gst-reamer pipeline 을 수정한다.

nvidia@linux:~/jetson-stereo-depth$ git diff
diff --git a/calib/calib_images/download_images.sh b/calib/calib_images/download_images.sh
old mode 100644
new mode 100755
diff --git a/detph_pipeline_cpp/main.cpp b/detph_pipeline_cpp/main.cpp
index 8bb8002..4cf8acc 100644
--- a/detph_pipeline_cpp/main.cpp
+++ b/detph_pipeline_cpp/main.cpp
@@ -51,7 +51,11 @@ std::string gstreamer_pipeline(
     int flip_method
     )
 {
+#if 0
     return "nvarguscamerasrc sensor_id=" + std::to_string(sensor_id) + " ! video/x-raw(memory:NVMM), width=(int)" + std::to_string(capture_width) + ", height=(int)" + std::to_string(capture_height) + ", format=(string)NV12, framerate=(fraction)" + std::to_string(framerate) + "/1 ! nvvidconv flip-method=" + std::to_string(flip_method) + " ! video/x-raw, width=(int)" + std::to_string(display_width) + ", height=(int)" + std::to_string(display_height) + ", format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink max-buffers=2 drop=true";
+#else
+    return "v4l2src device=/dev/video" + std::to_string(sensor_id) +  " ! video/x-raw, format=(string)UYVY, width=(int)1280, height=(int)720 ! nvvidconv ! video/x-raw(memory:NVMM), format=(string)I420 ! nvvidconv ! video/x-raw, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink max-buffers=2 drop=true";
+#endif
 }

NVIDIA 엔비디아 stereo camera 예제를 cmake 와 make 를 이용해서 빌드한다.

$ cd depth_pipeline_cpp
$ mkdir build && cd build
$ cmake .. && make -j$(nproc)

생성된 depth_pipeline 을 실행한다.

$ ./depth_pipeline

생성된 depth_pipeline 을 실행한 화면이다. Stereo camera 의 영상을 받아서 disparity map 을 생성한 결과 이다.

 

Post-mortem

NVIDIA Xavier NX devkit 에서 VPI (Vision Programming Interface) 를 통해 하드웨어 가속이 되는 스테레오 카메라 예제를 실행해보았다.

  1. Stereo camera 의 영상을 받아서 disparity map 을 생성한 결과가 좋지 못하다. 카메라 Calibration 과 Retification 이 필요하다.
  2. VPI API 를 사용해서 동작되기 때문에, (지연을 느낄 수 없을 정도로) 실시간으로 disparity map 이 출력된다. 아래 그림이 전체 pipeline 을 나타낸다. 이 포스팅에서는 IMX219 대신에 (ISP 가 내장된) 3rd party camera 를 사용했다.

참고자료

NVIDIA 엔비디아 공식 github 의 코드를 참고한다.

https://github.com/NVIDIA-AI-IOT/jetson-stereo-depth

 

GitHub - NVIDIA-AI-IOT/jetson-stereo-depth

Contribute to NVIDIA-AI-IOT/jetson-stereo-depth development by creating an account on GitHub.

github.com

OpenCV 를 이용한 스테레오 카메라 개발은 아래 포스팅을 참고한다.

2022.06.12 - [프로그래밍/OpenCV] - [OPENCV] 스테레오 카메라 StereoBM 예제 첫번째

2022.06.15 - [프로그래밍/OpenCV] - [OPENCV] 스테레오 깊이맵 성능 높이기

2022.06.15 - [프로그래밍/OpenCV] - [OPENCV] SGBM vs StereoBM 깊이맵 결과 비교

2022.06.16 - [프로그래밍/OpenCV] - [OPENCV] 카메라 캘리브레이션

2022.06.18 - [프로그래밍/OpenCV] - [OPENCV] 카메라 이미지 왜곡보정

반응형