참조 : qengineering.eu/install-opencv-4.5-on-raspberry-pi-4.html
webnautes.tistory.com/916
설치 환경 : Raspberry Pi 4, Rasbian OS January 11th 2021 (kernal 5.4), pi Camera 8MP
일반 개발 환경(윈도우, 리눅스 등)에선 pip로 openCV를 설치 할 수 있다.
pip install opencv-python
하지만 모종의 이유로 라즈비안OS에선 pip 사용이 불가하다. 따라서 openCV를 직접 빌드 및 컴파일 해서 설치해야 한다. 대략적인 설치 절차는 다음과 같다.
1. 기존에 깔린 openCV를 제거해준다
2. apt-get를 업데이트 및 업그레이드한다.
3. openCV 구동에 필요한 패키지를 설치한다.
4. openCV 설정을 입력하고 cmake로 빌드한다.
5. 스왑공간을 확장한다.
6. 컴파일한다.
7. openCV가 잘 설치됐는지 확인한다.
1. 기존 openCV 제거
Raspberry Pi OS with recommended software에는 openCV 2.4 가 기본 설치 되어있다. 4.5.0으로 업데이트 하기 위해선 반드시 삭제해줘야 한다.
ssh 또는 라즈베리파이 내 shell에서 다음 명령어로 openCV 버전을 확인한다.
pkg-config --modversion opencv
만약 다음과 같은 화면이 나오면 순정 상태이므로 바로 2번을 진행한다.
No package 'opencv' found
만약 다음과 같이 버전이 나오면 openCV를 제거해야 한다.
2.4.9.1
apt-get으로 패키지 삭제 툴을 다운받는다.
pi@raspberrypi:~ $ sudo apt-get purge libopencv* python-opencv
pi@raspberrypi:~ $ sudo apt-get autoremove
다음 명령어로 기존 설치된 openCV 라이브러리를 삭제한다.
pi@raspberrypi:~ $ sudo find /usr/local/ -name "*opencv*" -exec rm {} \;
2. apt-get 업데이트 및 업그레이드
apt는 리눅스 계열 OS의 프로그램 패키지 설치를 돕는 라이브러리다. 항상 최신으로 유지해주는게 중요하다.
apt의 업데이트, 업그레이드 진행 후 한번 재부팅 해준다.
pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get upgrade
pi@raspberrypi:~ $ sudo reboot
3. openCV 컴파일 전 패키지 설치
openCV 구동에 필요한 패키지를 설치한다.
- openCV는 C++ 기반이므로 리눅스 C컴파일러 cmake와 관련 라이브러리 툴 build-essential을 설치한다.
sudo apt-get install build-essential cmake
- 이미지 파일 읽기 쓰기에 필요한 패키지를 설치한다.
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev libwebp-dev libopenexr-dev
- 비디오 파일 읽기 쓰기 및 스트리밍에 필요한 패키지를 설치한다.
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
- 리눅스 실시간 비디오 캡쳐 패키지인 v4l을 설치한다.
sudo apt-get install libv4l-dev v4l-utils
- openCV 작업 결과물이 보여질 GUI 라이브러리 gtk를 설치한다 (대체품 : libqt5-dev(일명 qt))
sudo apt-get install libgtk2.0-dev
- openCV 최적화 도구를 설치한다.
sudo apt-get install libatlas-base-dev gfortran libeigen3-dev
- openCV를 python 기반으로 사용할 것이므로 python 및 numpy를 설치해준다.
sudo apt-get install python2.7-dev python3-dev python-numpy python3-numpy
4. openCV 소스코드 설치
openCV 설치파일을 담을 폴더를 제작하고 그 폴더로 이동한다.
sudo apt-get install python2.7-dev python3
mkdir opencv
cd opencv
정상적으로 이동했다면 다음과 같은 화면이 보인다.
pi@raspberrypi:~/opencv $
openCV 4.5.0 소스코드를 깃헙에서 직접 다운받고 압축을 풀어준다.
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.0.zip
unzip opencv.zip
opencv_contrib 소스코드를 역시 직접 다운받고 압축을 풀어준다.
opencv_contrib은 opencv 구동에 필요한 추가 모듈이다.
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.0.zip
unzip opencv_contrib.zip
opencv-4.5.0 폴더 내에서 build 폴더를 새로 만들어 준다. 컴파일은 이 폴더 내에서 이뤄진다.
cd opencv-4.5.0
mkdir build
cd build
정상적으로 이동했다면 다음과 같은 화면이 보인다.
pi@raspberrypi:~/opencv/opencv-4.5.0/build $
5. cmake로 설정 입력 및 빌드
설치 설정은 cmake로 구성한다. 각 항목에 대한 설명은 생략한다.
다음을 복사해서 터미널에 붙여넣기 (Ctrl + shift + v) 해주면 된다.
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=OFF -D WITH_GTK=ON -D WITH_OPENGL=ON -D OPENCV_ENABLE_NONFREE=ON -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.5.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 -D WITH_OPENMP=ON -D BUILD_TIFF=ON -D WITH_FFMPEG=ON -D BUILD_TBB=ON -D WITH_EIGEN=OFF -D WITH_LIBV4L=ON -D WITH_VTK=OFF -D BUILD_opencv_python3=TRUE -D BUILD_EXAMPLES=OFF ..
* 4.5.0 버전이 아닌 다른 버전 설치를 원할 경우 상기 빨간색 4.5.0을 설치하고자 하는 버전으로 바꿔준다.
구성에 시간이 소요된다. 완료 시 다음과 같은 화면이 보이면 성공.
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/opencv/opencv-4.5.0/build
6. 스왑메모리 확장
컴파일은 상당히 메모리를 많이 잡아먹는다. RAM 사용량 증가로 SD카드의 스왑메모리가 사용될 때를 대비해, 스왑메모리 용량 확장으로 메모리 부족 오류를 방지해야 한다.
nano 텍스트 에디터로 스왑메모리 관장 파일인 root/etc 폴더의 dphys-swapfile을 열어준다.
sudo nano /etc/dphys-swapfile
CONF_SWAPSIZE 를 100에서 2048로 수정 후 Ctrl + x로 저장, 종료한다.
# set size to absolute value, leaving empty (default) then uses computed value
# you most likely don't want this, unless you have an special disk situation
CONF_SWAPSIZE=2048
스왑 서비스를 재시작하고 free 명령어로 스왑 메모리가 확장됐는지 확인한다.
sudo /etc/init.d/dphys-swapfile restart
free
다음과 같은 화면이 마지막 줄에 보이면 성공이다.
Swap: 2097148 0 2097148
7. 컴파일
모든 준비는 끝났다. make 명령어로 컴파일을 시작한다. 이때 소요시간 파악을 위해 time 명령어를 앞에 붙여준다.
멀티코어 사용을 위해 -j4를 뒤에 붙여준다.
time make -j4
raspberry pi 4 4gb 기준 약 1시간 30분이 소요됐다. 과열 방지를 위해 시원한 환경에서 진행하거나 냉각팬을 구동하는 것을 권장한다. 하지만 필자는 아무 조치 없이도 과열은 일어나지 않았다.
컴파일이 완료되면 컴파일 결과물을 설치한다.
sudo make install
컴파일이 완료됐으므로 스왑메모리를 다시 원 값인 100으로 맞춰야 한다.
nano 텍스트 에디터로 스왑메모리 관장 파일인 root/etc 폴더의 dphys-swapfile을 열어준다.
sudo nano /etc/dphys-swapfile
CONF_SWAPSIZE 를 2048에서 100로 수정 후 Ctrl + x로 저장, 종료한다.
# set size to absolute value, leaving empty (default) then uses computed value
# you most likely don't want this, unless you have an special disk situation
CONF_SWAPSIZE=100
스왑 서비스를 재시작하고 free 명령어로 스왑 메모리가 확장됐는지 확인한다.
sudo /etc/init.d/dphys-swapfile restart
free
다음과 같은 화면이 마지막 줄에 보이면 성공이다.
Swap: 102396 0 102396
8. 설치 확인
먼저 openCV 설치버전을 확인해 볼 것이다.
python3 명령어로 파이썬 3.7을 실행하고 cv2를 임포트 후, 버전 출력 함수인 __version__을 사용한다.
pi@raspberrypi:~/opencv/opencv-4.5.0/build $ python3
Python 3.7.3 (default, Jul 25 2020, 13:03:44)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'4.5.0'
'4.5.0'이 보이면 성공이다.
9. pi 카메라 설정 및 예시 소스코드 구동
일반 usb 형식 웹캠은 연결 시 바로 인식한다. 즉 딱히 다른 조치 없이도 바로 소스코드 구동이 가능하다.
일반 웹캠 사용자는 바로 10.으로 넘어가도 된다.
하지만 pi camera 사용자는 드라이버를 설치해야 한다.
먼저 pi camera를 라즈베리파이에 연결한다. (전원 끄고 연결을 추천)
후 콘솔에서 vcgencmd get_camera 명령어로 연결상태를 확인한다.
supported 와 detected가 1이면 성공.
pi@raspberrypi:~ $ vcgencmd get_camera
supported=1 detected=1
modprobe 명령으로 bcm2835-v4l2 모듈을 로드한다.
이때 주의점으로 v4l2 에서 l은 알파벳 '엘'이다. (필자는 1로 오해해서 한참을 해멨었다.)
sudo modprobe bcm2835-v4l2
ls /dev/video0 -l 명령으로 /dev/video0 폴더가 생성됐는지 확인한다. (이때도 - 다음에 오는 글자는 알파벳 엘이다)
pi@raspberrypi:~ $ ls /dev/video0 -l
crw-rw----+ 1 root video 81, 0 Jun 25 15:57 /dev/video0
raspistill -0 image.jpg 명령어로 사진이 찍히는 지 확인해본다. 정상적이라면 바탕화면에 찍힌 사진이 저장된다.
raspistill -o image.jpg
다음은 opencv 기본 기능으로 실시간 영상을 출력하는 python 코드다.
소스코드를 복붙해서 main.py를 만들고, 이를 라즈베리파이 python에서 실행시켜 보면 정상적으로 영상이 송출될 것이다.
유의점으로 파이 카메라 사용시 cap = cv2.VideoCapture(-1)을 사용해야 한다.
import numpy as np
import cv2
# 일반 웹캠이면 0 입력!
cap = cv2.VideoCapture(-1)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
# Our operations on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Display the resulting frame
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()