행복한 하루

Raspberry pi CM4에 OpenCV 4.6.0과 Contrib 모듈 설치해보기 본문

RaspberryPi/CM4(Compute Module)

Raspberry pi CM4에 OpenCV 4.6.0과 Contrib 모듈 설치해보기

변화의 물결 2022. 6. 15. 00:08

 

 

안녕하세요.

 

  에지 컴퓨팅이라고 해서 단말 장치에서 가까운 위치에서 컴퓨팅을 하는 것을 말합니다. 그래서 라즈베리 파이가 단말장치가 되고 여기서 컴퓨팅, 분석까지 하는 것으로 생각해서 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   

first.cpp
0.00MB

 

Comments