라즈베리파이 4 OpenCV 4.1.2 ( opencv_contrib 포함 ) 설치하기
라즈베리파이에 라즈비안( 2019-09-26 버전 ) 설치 후 OpenCV 4.1.2와 opencv_contrib( extra modules)를 설치를 합니다.
라즈베리파이 4에 OpenCV 4.1.2 설치
OpenCV 설치 방법은 webnautes님의 티스토리를 참고 하였습니다. ( webnautes 티스토리 방문하기 )
0. 라즈베리파이에 라즈비안 ( 2019-09-26 버전 ) 기본 설치 후 아래 설치
1. 패키지 업그레이드
1.1 기존에 설치된 패키지에 새로운 패키지 리스트를 업데이트 한다.
pi@raspberrypi:~ $ sudo apt-get update |
1.2 새로운 버전의 패키지가 있으면 업그레이드 한다.
pi@raspberrypi:~ $ sudo apt-get upgrade |
1.3 업그레이드 후 리부팅 한다.
pi@raspberrypi:~ $ reboot |
※ 라즈비안 2019-09-26 버전에서 upgrade 후 File Manager가 안 열리는 경우가 발생하면 아래와 같이 실행한다.
$ sudo apt-get install --reinstall pcmanfm |
2. OpenCV 컴파일전 필요 패키지 설치
2.1 build-essential 및 cmake 설치
$ sudo apt-get install build-essential cmake |
2.2 특정 포멧의 이미지 파일을 Read, Write 하기 위한 필요 패키지 설치
$ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev |
2.3 특정 코덱의 비디오 파일을 Read, Write 하기 위한 필요 패키지 설치
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev |
2.4 Video4Linux 리눅스에서 실시간 비디오 캡처 및 비디오 디바이스 제어를 위한 API 패키지 설치
$ sudo apt-get install libv4l-dev v4l-utils |
2.5 GStreamer는 리눅스 기반에서 영상 스트리밍을 쉽게 처리할 수 있더록 만든 오픈 소스 프레임워크 이다.
$ sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev |
2.6 OpenCV에서 윈도우 생성 등의 GUI를 위해 gtk 또는 qt를 선택해서 사용가능하며 여기서는 gtk2를 지정해준다.
$ sudo apt-get install libgtk2.0-dev |
2.7 OpenGL 지원하기 위해 필요한 라이브러리 설치
$ sudo apt-get install mesa-utils libgl1-mesa-dri libgtkgl2.0-dev libgtkglext1-dev |
2.8 OpenCV 최적화를 위해 사용되는 라이브러리 설치
$ sudo apt-get install libatlas-base-dev gfortran libeigen3-dev |
2.9 python 패키지는 OpenCV-Python 바인딩을 위한 패키지이며, Numpy는 매트릭스 연산등을 빠르게 처리할 수 있다.
$ sudo apt-get install python2.7-dev python3-dev python-numpy python3-numpy |
3. OpenCV 컴파일 및 설치
3.1 소스 코드 저장 할 임시 디렉토리 생성 및 이동
pi@raspberrypi:~ $ mkdir opencv pi@raspberrypi:~ $ cd opencv pi@raspberrypi:~ /opencv $ |
3.2 OpenCV 4.1.2 소스코드를 다운 받아 압축을 풀어준다
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.1.2.zip $ unzip opencv.zip |
3.3 opencv_contrib 다운 및 압축 풀어준다 ( SIFT, SURF 등을 사용하기 위해 필요 )
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.1.2.zip $ unzip opencv_contrib.zip |
3.4 두개의 디렉토리 생성 확인
pi@raspberrypi:~ /opencv $ ls -d */ opencv-4.1.2/ opencv_contrib-4.1.2/ |
3.5 opencv-4.1.2 디렉토리로 이동하여 build 디렉토리 생상 및 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 pi@raspberrypi:~ /opencv/opencv-4.1.2/build $ |
3.6 cmake를 사용하여 OpenCV 컴파일 설정을 해준다
( cmake 실행 중 추가적인 다운로드가 있으므로 라즈베리파이에 인터넷이 연결되어 있어야 한다 )
pi@raspberrypi:~ /opencv/opencv-4.1.2/build $ cmake -D CMAKE_BUILD_TYPE=RELEASE \ > -D CMAKE_INSTALL_PREFIX=/usr/local \ |
아래와 같은 메시지가 보이면 정상 적으로 설치가 된 것입니다.
-- ----------------------------------------------------------------- -- -- Configuring done -- Generating done -- Build files have been written to: /home/pi/opencv/opencv-4.1.2/build |
3.7 컴파일 시 메모리 부족으로 에러가 나지 않도록 swap 공간을 늘려줘야 한다.
/etc/dphys-swapfile 파일을 연다
pi@raspberrypi:~ /opencv/opencv-4.1.2/build $ sudo nano /etc/dphys-swapfile |
CONF_SWAPSIZE 변수값을 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 |
swap을 재시작하여 변경된 설정값을 반영해준다.
pi@raspberrypi:~ /opencv/opencv-4.1.2/build $ sudo /etc/init.d/dphys-swapfile restart [ ok ] Restarting dphys-swapfile (via systemctl): dphys-swapfile.service. |
변경된 설정값 확인 ( swap : 2097148
pi@raspberrypi:~ /opencv/opencv-4.1.2/build $ free total used free shared buff/cache available |
3.8 make 명령을 사용하여 컴파일 시작 ( -j4 옵션을 주고 진행 )
pi@raspberrypi:~ /opencv/opencv-4.1.2/build $ make -j4 |
- python 라이브러리 빌드부분에서 오랫동안 멈춰 있으면 Ctrl +C를 눌러 중지하고 make 명령으로 다시 진행하면 된다.
pi@raspberrypi:~ /opencv/opencv-4.1.2/build $ make |
- 컴파일 완료
3.9 컴파일 결과물을 설치
pi@raspberrypi:~ /opencv/opencv-4.1.2/build $ sudo make install |
샘플 코드들은 /usr/local/share/opencv4/samples/ 위치로 복사된다.
3.10 opencv 라이브러리를 찾을 수 있도록 다음 명령을 실행한다.
pi@raspberrypi:~ /opencv/opencv-4.1.2/build $ sudo ldconfig |
3.11 /etc/dphys-swapfile 파일을 열어서 CONF_SWAPSIZE 변수값을 다시 100으로 수정하고 restart 한다.
pi@raspberrypi:~ /opencv/opencv-4.1.2/build $ sudo nano /etc/dphys-swapfile |
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 |
4. OpenCV 설치 결과 확인
4.1 C/C++
4.1.1 OpenCV 4.x에서는 옵션으로 opencv 대신 opencv4를 사용하면 pkg-config를 사용하여 컴파일 할 수 있다.
pi@raspberrypi:~ /opencv/opencv-4.1.2/build $ g++ -o videocapture_basic /usr/local/share/opencv4/samples/cpp/videocapture_basic.cpp $(pkg-config opencv4 --libs --cflags) |
4.1.2 테스트를 위해 라즈베리파이 카메라를 연결한다.
Preferences > Raspberry Pi Configuration 창을 연다
Interfaces 탭에서 Camera 항목을 Enable 체크하고 OK를 클릭하여 리부팅 한다.
/dev/video0 디바이스 파일이 생성되었는지 확인한다.
pi@raspberrypi:~ /opencv/opencv-4.1.2/build $ ls /dev/video* /dev/video0 /dev/video10 /dev/video11 /dev/video12 |
/dev/video0 가 없으면 디바이스 장치를 만들어줘야 한다.
만드는 방법은 webnautes님의 티스토리를 참고 ( http://webnautes.tistory.com/1192 )
파이 카메라의 경우 소스 코드를 수정해야 한다.
open 함수의 아규먼트를 -1로 해야 정상 작동하며, 0으로 하면 카메라를 열지 못하고 무한 대기 상태에 빠지게 된다.
//cap.open(deviceID + apiID); cap.open(-1); |
4.1.3 CMake를 사용하는 방법으로 예제 코드를 가져와서 컴파일 해본다.
pi@raspberrypi:~ $ mkdir example pi@raspberrypi:~ $ cd example pi@raspberrypi:~ /example $ cp /usr/local/share/opencv4/samples/cpp/videocapture_basic.cpp ./ |
CMakeLists.txt 파일을 생성하여 아래 내용을 복사한다.
pi@raspberrypi:~ /example $ nano CMakeLists.txt |
cmake_minimum_required(VERSION 2.8) project( videocapture_basic) find_package( OpenCV REQUIRED ) include_directories( ${OpenCV_INCLUDE_DIRS} ) add_executable( videocapture_basic videocapture_basic.cpp ) target_link_libraries( videocapture_basic ${OpenCV_LIBS} ) |
videocapture_basic.cpp 파일을 열어 cap.open(-1)로 수정한다.
pi@raspberrypi:~ /example $ nano videocapture_basic.cpp |
아래 소스코드에서 cap.open(deviceID + apiID) 부분을 cap.open(-1)로 수정한다.
build 디렉토리를 생성하여 컴파일을 진행한다.
pi@raspberrypi:~ /example $ mkdir build pi@raspberrypi:~ /example $ cd build pi@raspberrypi:~ /example/build $ cmake .. pi@raspberrypi:~ /example/build $ make |
결과는 아래와 같이 나온다.
4.1.4 videocapture_basic 파일을 실행 시키면 영상이 보인다.
pi@raspberrypi:~ /example/build $ ./videocapture_basic |
결과 영상
실행시 아래와 같이 WARN 발생하나 영상이 보이는데는 문제가 없다.
pi@raspberrypi:~ /example/build $ ./videocapture_basic [ INFO:0] global /home/pi/opencv/opencv-4.1.2/modules/videoio/src/videoio_registry.cpp (187) VideoBackendRegistry VIDEOIO: Enabled backends(7, sorted by priority): FFMPEG(1000); GSTREAMER(990); INTEL_MFX(980); V4L2(970); CV_IMAGES(960); CV_MJPEG(950); XINE(940) [ WARN:0] global /home/pi/opencv/opencv-4.1.2/modules/videoio/src/cap_gstreamer.cpp (1757) handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Cannot identify device '/dev/video-1'. [ WARN:0] global /home/pi/opencv/opencv-4.1.2/modules/videoio/src/cap_gstreamer.cpp (886) open OpenCV | GStreamer warning: unable to start pipeline [ WARN:0] global /home/pi/opencv/opencv-4.1.2/modules/videoio/src/cap_gstreamer.cpp (480) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created (DEBUG) V4L: opening /dev/video0 Start grabbing Press any key to terminate |
4.2 Python
4.2.1 python 2 와 python 3에서 OpenCV 버전이 출력되는지 확인한다.
pi@raspberrypi:~ /opencv/opencv-4.1.2/build $ python Python 2.7.16 (default, Oct 10 2019, 22:02:15) |
pi@raspberrypi:~ /opencv/opencv-4.1.2/build $ python3 Python 3.7.3 (default, Apr 3 2019, 05:39:12) |
4.2.2 Python도 c/c++ 처럼 파이 카메라의 경우 0 대신 -1을 사용한다.
//cap = cv.VideoCapture(source) cap = cv.VideoCapture(-1) |
아래 소스코드에서 cap = cv.VideoCapture(source) 부분을 cap = cv.VideoCapture(-1)로 수정한다.
pi@raspberrypi:/usr/local/share/opencv4/samples/python $ sudo nano video.py |
4.2.3 video.py 예제 코드를 실행하면 영상을 볼 수 있다.
pi@raspberrypi:~ $ python /usr/local/share/opencv4/samples/python/video.py pi@raspberrypi:~ $ python3 /usr/local/share/opencv4/samples/python/video.py |
python도 c/c++과 같이 실행시 아래와 같이 WARN 발생하나 영상이 보이는데는 문제가 없다.
[ INFO:0] global /home/pi/opencv/opencv-4.1.2/modules/videoio/src/videoio_registry.cpp (187) VideoBackendRegistry VIDEOIO: Enabled backends(7, sorted by priority): FFMPEG(1000); GSTREAMER(990); INTEL_MFX(980); V4L2(970); CV_IMAGES(960); CV_MJPEG(950); XINE(940) [ WARN:0] global /home/pi/opencv/opencv-4.1.2/modules/videoio/src/cap_gstreamer.cpp (1757) handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Cannot identify device '/dev/video-1'. [ WARN:0] global /home/pi/opencv/opencv-4.1.2/modules/videoio/src/cap_gstreamer.cpp (886) open OpenCV | GStreamer warning: unable to start pipeline [ WARN:0] global /home/pi/opencv/opencv-4.1.2/modules/videoio/src/cap_gstreamer.cpp (480) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created (DEBUG) V4L: opening /dev/video0 |
필요 없어진 컴파일에 사용했던 opencv 소스 코드 디렉토리를 삭제한다.
pi@raspberrypi:~ $ rm -rf opencv |