[References]
https://webnautes.tistory.com/916
$ sudo apt-get update
$ sudo apt-get upgrade
build-essential 패키지 : C/C++ 컴파일러와 관련 라이브러리, make 같은 도구들이 포함
cmake : 컴파일 옵션이나 빌드된 라이브러리에 포함시킬 OpenCV 모듈 설정 등을 위해 필요
$ sudo apt-get install build-essential cmake pkg-config git
특정 포맷의 이미지 파일을 불러오거나 기록하기 위해 필요한 패키지들
$ sudo apt install libjpeg-dev libtiff-dev libjasper-dev libpng-dev libwebp-dev libopenexr-dev
특정 코덱의 비디오 파일을 읽어오거나 기록하기 위해 필요한 패키지들
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev libdc1394-22-dev
Video4Linux : 리눅스에서 실시간 비디오 캡처를 지원하기 위한 디바이스 드라이버와 API를 포함
$ sudo apt-get install libv4l-dev v4l-utils
GStreamer : 비디오 스트리밍을 위한 라이브러리
$ sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
OpenCV에서는 highgui 모듈 사용을 통해 자체적으로 윈도우를 생성하여 이미지나 비디오를 보여줄 수 있음.
GUI(윈도우 생성)를 위해 'gtk' 또는 'qt'를 선택해서 사용 가능
$ sudo apt-get install libgtk2.0-dev
그 외 libgtk-3-dev, libqt4-dev, libqt5-dev 선택 가능
$ sudo apt install libgtk-3-dev libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
OpenGL 지원하기 위해 필요한 라이브러리
$ sudo apt-get install mesa-utils libgl1-mesa-dri libgtkgl2.0-dev libgtkglext1-dev
OpenCV 최적화를 위해 사용되는 라이브러리
$ sudo apt-get install libatlas-base-dev gfortran libeigen3-dev liblapacke-dev
$ sudo apt install libhdf5-dev libhdf5-103
python2.7-dev, python3-dev : OpenCV-Python 바인딩을 위해 필요한 패키지
Numpy : 매트릭스 연산 등을 빠른 속도로 처리
$ sudo apt-get install python2.7-dev python3-dev python-numpy python3-numpy python3-pip
소스 코드를 저장할 임시 디렉토리를 생성, 이동, 진행
pi@raspberrypi:~ $ mkdir opencv
pi@raspberrypi:~ $ cd opencv
OpenCV 4.1.2 소스 코드를 다운로드 받아 압축 해제
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.1.2.zip
$ unzip opencv.zip
opencv_contrib(extra modules) 소스 코드를 다운로드 받아 압축 해제
SIFT, SURF 등을 사용하기 위해 필요
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.1.2.zip
$ unzip opencv_contrib.zip
생성된 디렉토리 확인
pi@raspberrypi:~/opencv $ ls -d */
opencv-4.1.2 opencv_contrib-4.1.2
opencv-4.1.2 디렉토리로 이동
build 디렉토리를 생성
build 디렉토리로 이동합니다.
pi@raspberrypi:~/opencv $ cd opencv-4.1.2
pi@raspberrypi:~/opencv/opencv-4.1.2 $ mkdir build
pi@raspberrypi:~/opencv/opencv-4.1.2 $ cd build
cmake를 사용하여 OpenCV 컴파일 설정 진행
아래 내용을 복사한 후 터미널에 붙여넣기
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.1.2/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 ../
build할 OpenCV 버전(opencv_contrib 버전이 다르다면)에 맞추어 경로를 변경
(-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.1.2/modules )
cmake 실행 중에 추가적인 다운로드가 있기 때문에 라즈베리파이가 인터넷에 연결된 상태에서 진행
스왑(swap) 공간을 늘려주어야 멀티코어를 사용하여 컴파일 시 메모리 부족으로 에러가 나지 않음
/etc/dphys-swapfile 파일 열기
$ sudo nano /etc/dphys-swapfile
CONF_SWAPSIZE 변수값을 100에서 2048로 수정합니다.
# 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
CONF_SWAPSIZE=2048
스왑 서비스 재시작하여 변경된 설정을 반영 -> 대략 20배의 스왑 크기로 변경
pi@raspberrypi:~/opencv/opencv-4.1.2/build $ free
total used free shared buff/cache available
Mem: 896672 79656 64716 11840 752300 739640
Swap: 102396 0 102396
pi@raspberrypi:~/opencv/opencv-4.1.2/build $ sudo /etc/init.d/dphys-swapfile restart
[ ok ] Restarting dphys-swapfile (via systemctl): dphys-swapfile.service.
pi@raspberrypi:~/opencv/opencv-4.1.2/build $ free
total used free shared buff/cache available
Mem: 896668 86292 63540 18036 746836 726832
Swap: 2097148 0 2097148
make 명령을 사용하여 컴파일을 시작 (-j4 옵션을 주고 진행)
pi@raspberrypi:~/opencv/opencv-4.1.2/build $ time make -j4
컴파일 결과물을 설치
pi@raspberrypi:~/opencv/opencv-4.1.2/build $ sudo make install
샘플 코드들은 /usr/local/share/opencv4/samples/ 위치에 복사됨
openCV 라이브러리를 찾을 수 있도록 다음 명령을 실행
pi@raspberrypi:~/opencv/opencv-4.1.2/build $ sudo ldconfig
"/usr/local/lib/pkgconfig"로 이동
'opencv4.pc' 파일을 복사하여 'opencv.pc' 파일명으로 저장
sudo cp opencv4.pc opencv.pc
설치된 OpenCV 버전 확인
pkg-config --modversion opencv
/etc/dphys-swapfile 파일을 오픈
$ sudo nano /etc/dphys-swapfile
CONF_SWAPSIZE 변수값을 다시 100으로 수정
CONF_SWAPSIZE=100
스왑 서비스 재시작하여 변경된 설정을 반영
pi@raspberrypi:~/opencv/opencv-4.1.2/build $ sudo /etc/init.d/dphys-swapfile restart
[ ok ] Restarting dphys-swapfile (via systemctl): dphys-swapfile.service.
python 2와 python 3에서 openCV 라이브러리가 사용 가능한지 확인 (OpenCV 버전이 출력되어야 함)
pi@raspberrypi:~/opencv/opencv-4.1.2/build $ python
Python 2.7.16 (default, Apr 6 2019, 01:42:57)
[GCC 8.2.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'4.1.2'
pi@raspberrypi:~/opencv/opencv-4.1.2/build $ python3
Python 3.7.3 (default, Apr 3 2019, 05:39:12)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'4.1.2'
테스트를 하기 위해 필요한 웹캠 또는 Raspberry Pi Camera(pi camera)를 Raspberry Pi에 연결
대부분의 웹캠은 연결후 dmesg | tail 명령어로 해당 웹캠을 확인시 다음처럼 문제 없이 인식
/dev/video0 디바이스 파일이 생성되었는지 확인
pi@raspberrypi:~/opencv/opencv-4.1.2/build $ ls /dev/video*
/dev/video0
파이 카메라는 다음 명령으로 /dev/video0 장치를 만들어줘야 함
sudo modprobe bcm2835-v4l2
파이 카메라의 경우 추가로 소스 코드를 수정해야 함
open 함수의 아규먼트를 -1로 해야 정상적으로 동작
0으로 하면 카메라를 열지 못하고 무한 대기 상태에 빠짐
cap = cv.VideoCapture(-1)
예제 코드를 실행하여 웹캠 영상을 확인
$ python /usr/local/share/opencv4/samples/python/video.py
$ python3 /usr/local/share/opencv4/samples/python/video.py
컴파일에 사용했던 openCV 소스코드 디렉토리를 삭제
pi@raspberrypi:~/opencv/opencv-4.1.2/build $ cd
pi@raspberrypi:~ $ rm -rf opencv