안녕하세요.
에지 컴퓨팅이라고 해서 단말 장치에서 가까운 위치에서 컴퓨팅을 하는 것을 말합니다. 그래서 라즈베리 파이가 단말장치가 되고 여기서 컴퓨팅, 분석까지 하는 것으로 생각해서 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
'Embedded > RaspberryPI' 카테고리의 다른 글
Raspberry Pi CM4에 ModbusTCP Server 설치해 보기 - 1편(ModbusTCP 기본지식) (0) | 2024.11.19 |
---|---|
Raspberry Pi에서 유량센서(YF-B10-S)로 유량계산하기 (2) | 2024.11.14 |
Raspberry PI 4(CM4 Module)과 IO보드(MCUZONE Tiny, waveshare CM4-IO-BASE-B)에서 파이캠(OV5647) 카메라 동작 시키기 (3) | 2024.10.15 |
Raspberry Pi 4 CM4 EDA 방열판(heatsink, Cooler) 확인하기 (2) | 2024.10.10 |
Raspberry Pi4를 이용한 멀티캐스트 송신 코드 및 테스트 (Multicast Sender) (0) | 2024.07.05 |