프로젝트 대표사진

라즈베리파이 4 OpenCV 4.1.2 ( opencv_contrib 포함 ) 설치하기

라즈베리파이에 라즈비안( 2019-09-26 버전 ) 설치 후 OpenCV 4.1.2와 opencv_contrib( extra modules)를 설치를 합니다.
라즈베리파이 4 OpenCV 4.1.2 ( opencv_contrib 포함 ) 설치하기 작성자 : 주피터

라즈베리파이 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 \
> -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 ../

 

 

아래와 같은 메시지가 보이면 정상 적으로 설치가 된 것입니다.

 

-- -----------------------------------------------------------------
-- 
-- 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
Mem:       3947004      192488     2154636       17768     1599880     3587344
Swap:      
2097148             0     2097148

 

 

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
Mem:       3947004      192488     2154636       17768     1599880     3587344
Swap:       
102396              0      102396

 

 

 

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) 
[GCC 8.3.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'

 

 

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

 

 

※ e4ds make에 등록된 자료는 e4ds와 지식 제공자(기업포함) 이외에는 상업화 용도로 사용할 수 없습니다. 영리 목적 이외의 사용 시 출처를 밝혀야 합니다.

Comments

2022.05.19 00:10 답글  |  신고
다 잘따라가다가 3.6부터 안되는데 어찌해야할까요ㅠㅠ
level 지영 2020.08.21 16:50 답글  |  신고
빌드하는 과정 중에 CMAKE_CXX_COMPILER를 찾지 못한다는 오류가 계속 발생합니다.... 구글링을 계속 해보면서 여러 가지 설치도 해보았지만 몇일 째 해결되고 있지 않습니다.... 이런경우에는 어떻게 해결을 하는게 좋을까요...?
level fillets** 2020.10.30 17:20 신고
댓글
컴파일러가 설치 안되어 있는거 아닌가요?
level handuw** 2020.02.07 01:30 답글  |  신고
라즈베리파이를 혼자 공부하고 있는 학생입니다. 위의 순서를 차례로 진행하는데 4.1.2파트에서 Interfaces 탭에서 Camera 항목을 Enable 체크하고 OK를 클릭하여 리부팅 한다. 를 할 때 리부팅시 라즈베리 파이가 나온후 검은화면에서 안넘어가는데 놓친 부분이 있을 까요??? 위의 순서는 그대로 두번정도 시행해봤습니다ㅠㅠ
level 주피터 2020.03.09 17:32 신고
댓글
답변이 늦어 죄송합니다^^ 검은화면에서 안넘어간다는게 부팅 했을때 중간에 멈추는건가요? 저도 몇번 설치해봤는데 그런형상은 처음이라. 저는 라즈비안 기본 설치한 후 위 순서대로 진행하였습니다. 혹시 터미널에서 raspi-config 실행해서 카메라를 Enable해 보시기 바랍니다.

관련 Make

관련 상품