https://webnautes.tistory.com/916
OpenCV 4.5.0과 opencv_contrib(extra modules)를 컴파일하여 Raspberry Pi 3에 설치하는 방법을 다룹니다.
2016. 5. 4 최초작성
2020. 11. 22 최종작성
Python에서 사용할 OpenCV만 설치하는 경우에는 다음 명령으로 설치할 수 있습니다.
OpenCV의 nonfree 모듈을 사용해야 할 경우에는 컴파일을 해야 합니다.
pip3 install opencv-contrib-python
1. 기존 OpenCV 버전 제거
1-1. OpenCV 2.4대 버전이 설치되어 있으면 새로 설치하는 OpenCV 4.5.0 버전이 제대로 동작하지 않기 때문에 제거해주어야 합니다.
1-2. 아래처럼 보이면 OpenCV 2.4대 버전이 설치안되어 있는 상태입니다. 2장을 진행하세요.
OpenCV 2.4대 버전이 설치되어 있는 경우에는 OpenCV 2.4 버전이 출력됩니다.
다음 명령으로 OpenCV 라이브러리 설정 파일을 포함해서 기존에 설치된 OpenCV 패키지를 삭제하고 진행해야 합니다.
1-3. 컴파일하여 설치한 경우 다음처럼 OpenCV 버전을 확인할 수 있습니다.
또는
다음 명령으로 기존에 설치된 opencv 라이브러리를 삭제합니다.
2. 기존 설치된 패키지 업그레이드
2-1. OpenCV 4.5.0을 설치해주기 전에 기존에 설치된 패키지들을 업그레이드 해주기 위한 작업입니다.
오래 걸리더라도 해주는 것이 좋습니다.
2-2. 기존에 설치된 패키지의 새로운 버전이 저장소에 있다면 패키지 리스트를 업데이트합니다.
여기에서 에러가 난다면 앞에서 추가한 주소를 다른 곳으로 변경해보세요.
2-3. 기존에 설치된 패키지의 새로운 버전이 있으면 업그레이드합니다.
업데이트한 패키지가 모두 적용되도록 재부팅후 진행합니다.
3. OpenCV 컴파일 전 필요한 패키지 설치
3-1. OpenCV를 컴파일하는데 필요한 패키지들을 설치합니다.
일부 패키지는 배포된 Raspbian 이미지에 이미 포함되어 있는 경우도 있습니다.
또는 다른 패키지 설치시 같이 설치되기도 하지만 필요한 패키지들이라 언급하도록 하겠습니다.
3-2. build-essential 패키지에는 C/C++ 컴파일러와 관련 라이브러리, make 같은 도구들이 포함되어 있습니다.
cmake는 컴파일 옵션이나 빌드된 라이브러리에 포함시킬 OpenCV 모듈 설정등을 위해 필요합니다.
3-3. 특정 포맷의 이미지 파일을 불러오거나 기록하기 위해 필요한 패키지들입니다.
3-4. 특정 코덱의 비디오 파일/스트리밍을 읽어오거나 기록하기 위해 필요한 FFmpeg 관련 패키지들입니다.
3-5. Video4Linux 패키지는 리눅스에서 실시간 비디오 캡처를 지원하기 위한 디바이스 드라이버와 API를 포함하고 있습니다.
3-6. 특정 코덱의 비디오 파일/스트리밍을 읽어오거나 기록하기 위해 필요한 GStreamer 관련 패키지들입니다.
3-7. OpenCV에서는 highgui 모듈을 사용하여 자체적으로 윈도우 생성하여 이미지나 영상을 보여줍니다.
윈도우 생성 등의 GUI를 위해 gtk 또는 qt를 선택해서 사용가능합니다. 본 글에서는 gtk2를 사용합니다.
그외 선택 가능한 패키지는 다음과 같습니다. QT를 사용하려면 cmake 옵션에 WITH_GTK 대신에 WITH_QT를 추가해야 합니다.
libgtk-3-dev
libqt4-dev
libqt5-dev
3-8. OpenGL 지원하기 위해 필요한 라이브러리입니다.
3-9. OpenCV 최적화를 위해 사용되는 라이브러리들입니다.
3-10. python2.7-dev와 python3-dev 패키지는 파이썬을 위한 헤더파일과 라이브러리가 포함된 패키지들입니다.
Numpy는 매트릭스 연산등을 빠르게 처리할 수 있어서 OpenCV Python에서 사용됩니다.
4. OpenCV 설정과 컴파일 및 설치
4-1. 소스 코드를 저장할 임시 디렉토리를 생성하여 이동 후.. 진행합니다
4-2. OpenCV 4.5.0 소스코드를 다운로드 받아 압축을 풀어줍니다.
4-3. opencv_contrib(extra modules) 소스코드를 다운로드 받아 압축을 풀어줍니다.
SIFT, SURF 등을 사용하기 위해 필요합니다.
4-4. 다음처럼 두 개의 디렉토리가 생성됩니다.
4-5. opencv-4.5.0 디렉토리로 이동하여 build 디렉토리를 생성하고 build 디렉토리로 이동합니다.
컴파일은 build 디렉토리에서 이루어집니다.
4-6. cmake를 사용하여 OpenCV 컴파일 설정을 해줍니다. 복사해서 터미널에 붙여넣기 해주면 됩니다.
다음 옵션은 빌드할 OpenCV 버전에 맞추어 아래 경로중 빨간색 부분을 변경하세요.
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.5.0/modules
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 ../
4-7. 다음처럼 cmake 실행 중에 추가적인 다운로드가 있습니다. 라즈베리파이에 인터넷이 연결된 상태에서 진행하세요..
4-8. 다음과 같은 메시지가 보이면 정상적으로 된 것입니다.
cmake 실행 결과입니다.
4-9. 진행하기 전에 스왑(swap) 공간을 늘려줘야 멀티코어를 사용하여 컴파일시 메모리 부족으로 에러가 나지 않습니다.
( 참고 https://www.pyimagesearch.com/2017/10/09/optimizing-opencv-on-the-raspberry-pi/ )
/etc/dphys-swapfile 파일을 열어서
CONF_SWAPSIZE 변수값을 100에서 2048로 수정합니다.
스왑 서비스 재시작하여 변경된 설정을 반영시켜주면 스왑 크기가 대략 20배가 됩니다.
4-10. 이제 make 명령을 사용하여 컴파일을 시작합니다. -j4 옵션을 주고 우선 진행합니다.
트위터에서 오래 빌드하는 과정에 라즈베리파이3가 과열되어 문제 된다는 말이 보여서
이번에는 새로 구입한 라즈베리파이3용 냉각팬을 돌리면서 진행했습니다.
이번에는 에러없이 진행이 되었습니다. 256/60 = 4.2 시간 정도 걸렸네요.
real 256m37.705s
user 587m51.886s
sys 24m29.895s
다음 링크의 스크립트를 사용하여 빌드 40% 진행했을 때 온도를 측정해보니 다음과 같습니다.
https://www.cyberciti.biz/faq/linux-find-out-raspberry-pi-gpu-and-arm-cpu-temperature-command/
GPU => temp=44.0'C
CPU => 43'C
Raspberry Pi OS 2020년 8월 20일 버전과 OpenCV 4.5.0을 사용했을 때에 문제 없이 완료된 것입니다. 추가로 빌드시 발생하는 열을 냉각시키기위해 냉각팬을 돌렸습니다. 사용한 조합이 다르면 예상치 못한 문제가 생길 수도 있습니다.
혹, python 라이브러리 빌드하는 부분에서 다음처럼 오랫동안 멈춤 현상이 있는 경우 . Ctrl + C를 눌러 중지하고 (이 부분이 오래 걸리는 부분인데 멈춤현상이 오래 지속되기도 합니다. 과열때문인거 같아서 이번에 냉각팬을 새로 구입하여 진행해봤습니다. 이 부분에서 위에서 사용한 스크립트로 온도를 측정해보면 과열때문에 문제가 된건지 알 수 있을 듯합니다.)
make 명령으로 다시 진행해서 완료하면 됩니다.
4-11. 이제 컴파일 결과물을 설치합니다.
샘플 코드들은 /usr/local/share/opencv4/samples/ 위치에 복사됩니다.
4-12. opencv 라이브러리를 찾을 수 있도록 다음 명령을 실행합니다.
4-13. /etc/dphys-swapfile 파일을 열어서
CONF_SWAPSIZE 변수값을 다시 100으로 수정합니다.
스왑 서비스 재시작하여 변경된 설정을 반영시켜주면 스왑 크기가 원래대로 돌아옵니다.
5. OpenCV 설치 결과 확인
5.1. C/C++
5.1.1. OpenCV 4.x에서는 옵션으로 opencv대신에 opencv4를 사용하면 pkg-config를 사용하여 컴파일할 수 있습니다.
이번에 설치시 OpenCV 4.5.0에서 GStreamer를 디폴트로 사용하게 되었는데 문제가 있어서 수정을 했습니다. 참고로 다음 경고가 나오면서 영상이 보이지 않았습니다.
[ WARN:0] global /home/pi/opencv/opencv-4.5.0/modules/videoio/src/cap_gstreamer.cpp (935) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1
현재 위치로 코드를 가져옵니다.
파일을 열어서 다음 부분을 수정합니다. Ctrl + O를 눌러 저장하고 Ctrl + X를 눌러 빠져옵니다.
int apiID = cv::CAP_V4L2;
빌드합니다.
5.1.2. 테스트를 하기 위해 필요한 웹캠 또는 Raspberry Pi Camera(pi camera)를 Raspberry Pi에 연결합니다.
대부분의 웹캠은 연결후 dmesg | tail 명령어로 해당 웹캠을 확인시 다음처럼 문제 없이 인식이 됩니다.
인식이 안되면 해당 웹캠을 위한 디바이스 드라이버를 설치해줘야 합니다.
다음처럼 /dev/video0 디바이스 파일이 생성되었는지 확인해봅니다.
파이 카메라의 경우에는 다음 명령으로 /dev/video0 장치를 만들어줘야 합니다.
자세한 내용은 아래 포스팅을 참고하세요.
Raspberry Pi Camera Module( pi camera )를 위해 /dev/video0 생성하는 방법
http://webnautes.tistory.com/1192
파이 카메라의 경우 추가로 소스코드를 수정해야 합니다. open 함수의 아규먼트를 -1로 해야 정상적으로 동작합니다. 0으로 하면 카메라를 열지 못하고 무한 대기 상태에 빠지게 됩니다.
5.1.3. 터미널 프로그램으로 MobaXterm을 사용하면 SSH 접속 상태에서 실행해보면 바로 실행 결과를 확인 가능합니다.
(일종의 VNC처럼 동작해서 속도는 느립니다..)
https://mobaxterm.mobatek.net/
실행시켜보면 웹캠 영상이 보입니다.
실행에 문제가 있는 경우 웹캠을 연결한채 재부팅하고나서 VNC를 사용하여 진행하세요.
Raspberry Pi 3를 VNC로 접속하여 원격 제어하는 방법
https://webnautes.tistory.com/549
5.2. Python
5.2.1. python 2와 python 3에서 opencv 라이브러리를 사용가능한지는 확인합니다.
각각 OpenCV 버전이 출력되어야 합니다.
5.2.2. 파이 카메라의 경우 도 0 대신에 다음처럼 -1을 사용해야 합니다.
5.2.3. 예제 코드를 실행해봅니다. 웹캠 영상을 볼 수 있습니다.
C++때와 똑같은 에러가 나지만 영상은 보이네요
[ WARN:0] global /home/pi/opencv/opencv-4.5.0/modules/videoio/src/cap_gstreamer.cpp (935) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1
하지만 C++ 처럼 수정을 해보았습니다. 직접 예제를 작성하면 코드가 더 간단해지지만
OpenCV에서 있는 것으로 진행해보았습니다.
$ cp /usr/local/share/opencv4/samples/python/video.py .
$ cp /usr/local/share/opencv4/samples/python/tst_scene_render.py .
$ cp /usr/local/share/opencv4/samples/python/common.py .
$ chmod +w video.py
video.py 파일을 열어서
$ nano video.py
188번째 줄을 다음처럼 수정합니다. Ctrl + O로 저장후, Ctrl + X로 종료합니다.
cap = cv.VideoCapture(source, cv.CAP_V4L2)
실행해봅니다. 경고문 없이 영상이 바로 보입니다.
이제 필요 없어진 컴파일에 사용했던 opencv 소스코드 디렉토리를 삭제합니다.