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)
소스 다운로드 및 빌드
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) 를 통해 하드웨어 가속이 되는 스테레오 카메라 예제를 실행해보았다.
- Stereo camera 의 영상을 받아서 disparity map 을 생성한 결과가 좋지 못하다. 카메라 Calibration 과 Retification 이 필요하다.
- VPI API 를 사용해서 동작되기 때문에, (지연을 느낄 수 없을 정도로) 실시간으로 disparity map 이 출력된다. 아래 그림이 전체 pipeline 을 나타낸다. 이 포스팅에서는 IMX219 대신에 (ISP 가 내장된) 3rd party camera 를 사용했다.
참고자료
NVIDIA 엔비디아 공식 github 의 코드를 참고한다.
https://github.com/NVIDIA-AI-IOT/jetson-stereo-depth
OpenCV 를 이용한 스테레오 카메라 개발은 아래 포스팅을 참고한다.
2022.06.12 - [프로그래밍/OpenCV] - [OPENCV] 스테레오 카메라 StereoBM 예제 첫번째
2022.06.15 - [프로그래밍/OpenCV] - [OPENCV] 스테레오 깊이맵 성능 높이기
2022.06.15 - [프로그래밍/OpenCV] - [OPENCV] SGBM vs StereoBM 깊이맵 결과 비교