Raspberry pi CM4에 OpenCV 4.6.0과 Contrib 모듈 설치해보기
안녕하세요.
에지 컴퓨팅이라고 해서 단말 장치에서 가까운 위치에서 컴퓨팅을 하는 것을 말합니다. 그래서 라즈베리 파이가 단말장치가 되고 여기서 컴퓨팅, 분석까지 하는 것으로 생각해서 OpenCV를 설치해서 분석을 해보려고 합니다.
OpenCV 설치는 하단 <참조 사이트 1>을 따라 진행하였으며, OpenCV 4.5.4에서 에러가 났다고 글이 쓰여 있어서 그 상위 버전으로 테스트해 보았습니다. 그리고 Raspberry Pi OS는 Bullseye 32bit에서 초기화한 상태에서 내용 조금 수정하여 진행하였습니다.
만약 기존 버전이 설치되어 있다면 하단 <참고 사이트 1>을 참고해서 삭제 후 진행하시길 추천드립니다.
1. OpenCV 컴파일 전 필요한 패키지 설치
pi@raspberrypi:~ $ sudo apt update
pi@raspberrypi:~ $ sudo apt upgrade
- upgrade 된 것이 없으면 reboot 불필요
pi@raspberrypi:~ $ reboot
pi@raspberrypi:~ $ sudo apt install build-essential cmake vim -y
- 특정 포맷 이미지를 저장하거나 불러오기 위한 패키지 설치
pi@raspberrypi:~ $ sudo apt install libjpeg-dev libtiff5-dev libjasper-dev libpng-dev -y
- 특정 코덱과 FFmpeg 관련 패키지 설치 (libx265-dev 추가)
pi@raspberrypi:~ $ sudo apt install libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libx265-dev libxine2-dev -y
- 리눅스에서 비디오 캡처 지원하기 위한 디바이스 드라이버와 유틸리티 패키지 설치
pi@raspberrypi:~ $ sudo apt install libv4l-dev v4l-utils -y
- 특정 코덱의 비디오 파일과 스트림을 재생하거나 기록하기 위한 gstreamer 관련 패키지 설치
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
- OpenCV에서 highgui 모듈을 사용하여 자체적으로 윈도우 생성 시 사용할 때 라이브러리 설치, libqt5-dev는 지원하지 않기 때문에 참고사이트 2번 방법을 통해서 설치
pi@raspberrypi:~ $ sudo apt install libgtk2.0-dev -y
- Qt Package 설치 (qt5-default 지원 안 함 / cmake build-essential 은 위에서 설치해서 지움)
pi@raspberrypi:~ $ sudo apt-get install qtbase5-dev qtdeclarative5-dev qt5-qmake qtcreator libqt5gui5 qtscript5-dev qtmultimedia5-dev libqt5multimedia5-plugins qtquickcontrols2-5-dev libqt5network5 -y
- 설치된 버전 확인 가능
pi@raspberrypi:~ $ qmake -version
- OpenGL 관련 사용계획은 없으니 넘어가고, OpenCV 최적화를 위한 라이브러리 설치
pi@raspberrypi:~ $ sudo apt install mesa-utils libgl1-mesa-dri libgtkgl2.0-dev libgtkglext1-dev <= OpenGL 관련
pi@raspberrypi:~ $ sudo apt install libatlas-base-dev gfortran libeigen3-dev -y
- 파이썬 관련 패키지 설치 (현재 OS 버전에서는 최신 버전이 설치되어 있다고 나옴, 설치 불필요)
pi@raspberrypi:~ $ sudo apt install python3-dev python3-numpy -y
2. OpenCV 4.6.0 컴파일 및 설치 (글 작성 시점으로 최신 버전)
- 컴파일할 소스를 다운로드 (OpenCV, Contrib)
pi@raspberrypi:~ $ mkdir opt && cd opt
pi@raspberrypi:~/opt $ wget -O opencv4.6.zip https://github.com/opencv/opencv/archive/4.6.0.zip
pi@raspberrypi:~/opt $ unzip opencv4.6.zip
pi@raspberrypi:~/opt $ wget -O opencv_contrib4.6.zip https://github.com/opencv/opencv_contrib/archive/4.6.0.zip
pi@raspberrypi:~/opt $ unzip opencv_contrib4.6.zip
- build 할 디렉터리를 생성한 후 이동
pi@raspberrypi:~/opt $ mkdir opencv-4.6.0/build -p && cd opencv-4.6.0/build
- cmake 사용해서 OpenCV 컴파일 설정 (변경한 부분 : Qt 사용하고, OpenGL 사용 안 함, 버전에 맞게 contrib 경로 설정), 필요에 맞게 사용할 것과 사용하지 않을 것을 선택해서 ON, OFF로 설정
pi@raspberrypi:~/opt/opencv-4.6.0/build $ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=OFF -D WITH_IPP=OFF -D WITH_1394=OFF -D BUILD_WITH_DEBUG_INFO=OFF -D BUILD_DOCS=OFF -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D ENABLE_NEON=ON -D ENABLE_VFPV3=ON -D WITH_QT=ON -D WITH_GTK=ON -D WITH_OPENGL=OFF -D OPENCV_ENABLE_NONFREE=ON -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.6.0/modules -D WITH_V4L=ON -D WITH_FFMPEG=ON -D WITH_XINE=ON -D ENABLE_PRECOMPILED_HEADERS=OFF -D BUILD_NEW_PYTHON_SUPPORT=ON -D OPENCV_GENERATE_PKGCONFIG=ON ../
- Configuring done과 Generating done 이 나왔다면 다음이 진행이 가능하며, 그렇지 않다면 에러를 보면서 라이브러리를 추가로 설치해주어야 합니다.
- 멀티코어를 사용하여 컴파일 시 메모리 부족 현상을 막기 위해서 스왑(Swap) 메모리 CONF_SWAPSIZE=100에서 2048로 바꾼 후 저장합니다. 컴파일 끝나고는 다시 100MB으로 변경합니다.
pi@raspberrypi:~/opt/opencv-4.6.0/build $ sudo vim /etc/dphys-swapfile
- 현재 swap 메모리를 확인할 수 있으며, 위의 설정이 아직 적용되지 않은 상태입니다.
pi@raspberrypi:~/opt/opencv-4.6.0/build $ free
- 스왑 서비스를 재시작하고 free를 해보면 약 2048MB로 변경된 것을 확인할 수 있습니다.
pi@raspberrypi:~/opt/opencv-4.6.0/build $ sudo /etc/init.d/dphys-swapfile restart
- make 명령어로 컴파일 진행하며 -j4 옵션을 주어 병렬로 프로세스를 작동시켜 컴파일합니다. 그리고 최종 시간을 확인할 수 있게 time 명령어를 붙입니다.
pi@raspberrypi:~/opt/opencv-4.6.0/build $ time make -j4
- 최종시간을 보면 Raspberry Pi eMMC 16G CM4버전으로 진행할 경우 아래와 같이 컴파일 시간이 소요된 것을 확인할 수 있습니다.
- 컴파일한 프로그램과 라이브러리를 설치합니다
pi@raspberrypi:~/opt/opencv-4.6.0/build $ sudo make install
- 동적 라이브러리를 사용할 수 있도록 공유 라이브러리 Cache를 다시 설정합니다.
pi@raspberrypi:~/opt/opencv-4.6.0/build $ sudo ldconfig
- 스왑(Swap) 메모리를 100으로 다시 바꾼 후 swap서비스를 재시작합니다.
pi@raspberrypi:~/opt/opencv-4.6.0/build $ sudo vim /etc/dphys-swapfile
pi@raspberrypi:~/opt/opencv-4.6.0/build $ sudo /etc/init.d/dphys-swapfile restart
3. OpenCV 작동 확인하기
- 현재 Bullseye에서 기존 카메라 읽어오는 방법을 추천하고 있지 않고, cv.VideoCapture(0) 실시간 영상을 프레임을 불러와지지 않아서 다음에 gstreamer 통해서 영상을 출력하는 것으로 진행해 보겠습니다.
- 이번에는 사진 파일을 불러와서 윈도우에 보여주는 것으로 확인합니다.
- 테스트할 디렉터리를 하나 만듭니다.
pi@raspberrypi:~/opt/opencv-4.6.0/build $ mkdir ~/openCV_test -p && cd ~/openCV_test
- 테스트할 수 있는 이미지(Raspberry Pi wallpaper Image) 하나 복사해 옵니다. 동일한 이미지가 없다면 다른 이미지를 복사해도 됩니다.
pi@raspberrypi:~/openCV_test $ cp /usr/share/rpd-wallpaper/raspberry-pi-logo.png ./logo.png
- 이미지를 불러오는 소스를 작성합니다.
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat image; // 이미지 파일 배열 설정
image = imread("logo.png", IMREAD_COLOR); // 이미지를 읽어 MAT에 대입
if (image.empty())
{
cout << "Image Open Error!" << endl;
return -1;
}
imshow("Image Test", image); // imread에서 읽어온 것을 Display
waitKey(0); // Key 대기
return 0;
}
- 컴파일 시 OpenCV 경로와 여러 옵션을 넣어주어야 하는데, pkg-config 명령어를 통해서 간소화합니다.
pi@raspberrypi:~/openCV_test $ g++ -o first first.cpp $(pkg-config opencv4 --libs --cflags)
- 실행파일을 실행해 보면 png 이미지 파일의 라즈베리파이 로고가 나타나는 것을 확인할 수 있습니다.
pi@raspberrypi:~/openCV_test $ ./first
감사합니다.
<참고 사이트>
1. Raspberry Pi 4에 Extra Module(contrib) 포함하여 OpenCV 4.5.1 설치하는 방법
https://webnautes.tistory.com/916
2. Raspberry Pi 4에 Qt5 설치
https://webnautes.tistory.com/957
3. ldconfig 명령어는 왜 쓰는 걸까
https://doprogramming.tistory.com/20
4. [c++]2. 이미지 출력하기
https://merry-nightmare.tistory.com/160