커뮤니티

  • 제 목 라즈베리파이 4 OpenCV 4.1.2 ( opencv_contrib 포함 ) 설치하기
  • 작성자 주피터 조회 : 40,512 좋아요 : 3 댓글 : 4
  • 작성일 2019-12-12 오전 10:59:56
  • 라즈베리파이 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

     

     

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