행복한 하루
Raspberry pi CM4(Bullseye) OpenCV에서 gstreamer를 통해 카메라 영상 출력 본문
Raspberry pi CM4(Bullseye) OpenCV에서 gstreamer를 통해 카메라 영상 출력
변화의 물결 2022. 6. 16. 19:04
안녕하세요.
이전 글을 따라 OpenCV 4.6.0을 설치한 다음,
Bullseyes 32bit에서 libcamerasrc를 사용할 생각으로 gstreamer 최신 버전(1.9.2 혹은 1.20.x)을 다운로드하여서 컴파일할 경우 아래와 같은 컴파일 에러가 발생했습니다.
현재 상황에서는 gstreamer최신 버전을 사용하고자 한다면, Buster OS 버전 혹은 64bit Bullseye 버전에서 gstreamer 소스 컴파일하라고 조언합니다. Buster 버전은 문제가 없을 것으로 생각되는데, 64bit Bullseye 테스트해보지 않아서 현재로서 된다 안된다고 말씀드릴 수는 없습니다. 그러나 패키지로 설치된 버전(1.18.4)을 사용할 경우 문제없이 작동했습니다.
1. gstreamer 최신 버전을 컴파일 시 문제사항
- 테스트 환경 : raspberry pi CM4, bullseye 32bit, libcamera 라이브러리 사용 시, OpenCV 4.6.0
- 최신 버전의 gstreamer1.20.2 혹은 1.19.2 버전을 연동해서 OpenCV를 사용하려고 했으나 Bullseye 버전의 libcamerasrc를 사용하기 위해서 gstreamer 소스(gst-plugins-base)를 컴파일할 수가 없었습니다.
- 발생 에러 : “.. unknown type name ‘EGL_DISPMANX_WINDOW_T’”
- 현재 시점에서는 gstreamer 포럼과 raspberry pi 포럼에서도 이슈로 하여 이야기가 되고 있는 듯합니다. 그래서 몇몇 댓글들을 보면 OS를 변경하거나 고전 카메라 방식(Legacy Camera)을 이용해서 우회해서 사용하라고 조언해주고 있습니다. 내용은 하단 <참고 사이트 링크> 참고
- gst-plugins-base 소스 컴파일 설정 옵션에서 “-D gst-plugins-base:gl_winsys=egl”를 추가해보라고 해서 따라 했지만, 동일한 에러가 발생했습니다.
- raspi-config에서 Legacy Camera를 이용할 경우 OpenCV 4.6.0에서 간편하게 영상을 불러올 수 있지만, 현재 상황에서는 OpenCV에서 libcamera 라이브러리를 이용해서 프레임을 처리하려고 한다면, gstreamer를 사용하는 것이 하나의 좋은 방법이 될 것입니다.
2. gstreamer 1.18.4 설치된 버전 확인
- 이전 글에서 처럼 아래와 같이 패키지를 설치 했다면,
pi@raspberrypi:~ $ sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly -y
- 현재 설치된 gstreamer 버전을 확인할 수 있습니다.
pi@raspberrypi:~ $ dpkg -l | grep gstream*
3. OpenCV에서 카메라 영상 가져오기
1) 소스 수정
- 카메라 영상을 보기 위해서 OpenCV 샘플 코드를 복사해서 사용합니다. 테스트 디렉터리를 만들어 그곳에 복사합니다.
pi@raspberrypi:~ $ mkdir openCV
pi@raspberrypi:~ $ cd openCV
pi@raspberrypi:~/openCV_test $ cp /usr/local/share/opencv4/samples/cpp/videocapture_basic.cpp .
pi@raspberrypi:~/openCV_test $ vim videocapture_basic.cpp
- main() 함수에서 ## 표시한 2부분을 수정합니다.
VideoCapture cap;
// open the default camera using default API
// cap.open(0);
// OR advance usage: select any API backend
int deviceID = 0; // 0 = open default camera
int apiID = cv::CAP_ANY; // 0 = autodetect default API
// open selected camera using selected API
//cap.open(deviceID, apiID); // ## 주석 처리 1
cap.open("libcamerasrc ! video/x-raw, width=640, height=480, framerate=30/1 ! videoconvert ! videoscale ! video/x-raw, width=680, height=480 ! appsink"); // ## 내용 추가 2
2) 컴파일
- 컴파일 시 OpenCV 경로와 여러 옵션을 넣어주어야 하는데, pkg-config 명령어를 통해서 간소화합니다.
pi@raspberrypi:~/openCV_test $ g++ -o videocapture_basic videocapture_basic.cpp $(pkg-config opencv4 --libs --cflags)
4. 실행결과 확인하기
- 생성된 파일을 실행합니다. 그러면 아래 사진과 같이 내용이 나오면서 영상이 출력되는 윈도우를 볼 수 있습니다.
- 카메라 영상
5. 추가 확인 및 에러 상황
5.1 gstreamer tool 설치
- 소스를 컴파일해서 사용하는 것이 아니라 패키지를 설치해서 할 경우 gst-launch-1.0가 없습니다. 그래서 추가로 패키지를 설치합니다.
$ sudo apt install gstreamer1.0-tools gstreamer1.0-gl gstreamer1.0-gtk3
5.2 실행 에러 상황
1) GStreamer warning: cannot find appsink in manual pipeline
< 원인 >
- 모든 경우가 아래의 원인이라고 할 수는 없지만, 참고 정도만 하시면 좋을 듯합니다. 마지막 OpenCV 소스 내에 gstreamer 파이프라인 안에 autovideosink를 넣으면 에러가 발생했습니다.
- 셀 스크립트에서
$ gst-launch-1.0 libcamerasrc ! video/x-raw, width=640, height=480, framerate=30/1 ! videoconvert ! videoscale ! autovideosink
로 입력할 경우 문제없이 동작했습니다. 그러나 OpenCV 에서 파이프라인으로 넣을 경우 에러 발생했습니다.
cap.open("libcamerasrc ! video/x-raw, width=640, height=480, framerate=30/1 ! videoconvert ! videoscale ! autovideosink"); //에러 발생
<해결책> : autovideosink를 appsink로 변경
cap.open("libcamerasrc ! video/x-raw, width=640, height=480, framerate=30/1 ! videoconvert ! videoscale ! appsink");
감사합니다.
<참고 사이트>
1. Install GStreamer 1.18 on Raspberry Pi 4.
https://qengineering.eu/install-gstreamer-1.18-on-raspberry-pi-4.html
2. Fail building Gstreamer 1.20.0 or 1.18.5 on 32bit - unknown type name ‘EGL_DISPMANX_WINDOW_T’
https://forums.raspberrypi.com/viewtopic.php?t=329096
3. gst-plugins-base: build fails: error: unknown type name ‘EGL_DISPMANX_WINDOW_T’
https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/issues/952
4. djthorpe/build-gstreamer-rpi.sh
https://gist.github.com/djthorpe/864c11ef7cba2d0f8341eacc836ecec4
5. GStreamer-1.18.4-RPi_32-bits (main.cpp)
https://github.com/Qengineering/GStreamer-1.18.4-RPi_32-bits
'RaspberryPi > CM4(Compute Module)' 카테고리의 다른 글
Raspberry Pi CM4 Module Heatsink 장착하기 (0) | 2022.03.17 |
---|