OpenCV 4.0.0과 opencv_contrib(extra modules)를 컴파일하여 Raspberry Pi 3에 설치하는 방법을 다룹니다.


2018년 11월 13일에 릴리즈된 Raspbian 이미지를 사용했습니다.

OpenCV를 컴파일하기 위해서는 최소 16G Micro SD 카드를 사용해야 합니다.


포스팅은 라즈비안 초기 이미지부터 진행하기 때문에 상황이 다른 경우에는 모두  대처하기가 힘든 점을 감안해주세요.





1. OpenCV 2.4 버전 제거

2. 기존 설치된 패키지 업그레이드

3. OpenCV 컴파일 전 필요한 패키지 설치

4. OpenCV 설정과 컴파일 및 설치

5. OpenCV 설치 결과 확인

   5.1. C/C++

   5.2. Python




2018. 10. 2 - 파이 카메라로 테스트시 주의점 추가




1. OpenCV 2.4 버전 제거

1-1. OpenCV 2.4대 버전이 설치되어 있으면 새로 설치하는 OpenCV 4.0.0 버전이 제대로 동작하지 않기 때문에 제거해주어야 합니다.




1-2. 아래처럼 보이면 OpenCV 2.4대 버전이 설치안되어 있는 상태입니다.

다음 단계로 넘어가도  됩니다.


pi@raspberrypi:~ $ pkg-config --modversion opencv
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found



OpenCV 2.4대 버전이 설치되어 있는 경우에는 OpenCV  2.4 버전이 출력됩니다.

pi@raspberrypi:~ $  pkg-config --modversion opencv
2.4.9.1



다음 명령으로 OpenCV 라이브러리 설정 파일을 포함해서 기존에 설치된 OpenCV 패키지를 삭제하고 진행해야 합니다.

pi@raspberrypi:~ $ sudo apt-get purge  libopencv* python-opencv
pi@raspberrypi:~ $ sudo apt-get autoremove




2. 기존 설치된 패키지 업그레이드

2-1. OpenCV 4.0.0을 설치해주기 전에 기존에 설치된 패키지들을 업그레이드 해주기 위한 작업입니다.

오래 걸리더라도 해주는 것이 좋습니다.




2-2. 기존에 설치된 패키지의 새로운 버전이 저장소에 있다면 패키지 리스트를 업데이트합니다.


pi@raspberrypi:~ $ sudo apt-get update




2-3. 기존에 설치된 패키지의 새로운 버전이 있으면 업그레이드합니다.


pi@raspberrypi:~ $ sudo apt-get upgrade




3. OpenCV 컴파일 전 필요한 패키지 설치

3-1. 일부 패키지는 배포된 Raspbian 이미지에 이미 포함되어 있는 경우도 있습니다.

또는 다른 패키지 설치시 같이 설치되기도 하지만 필요한 패키지들이라 언급하도록 하겠습니다.


OpenCV를 컴파일하는데 사용하는 것들이 포함된 패키지들을 설치합니다.




3-2. build-essential 패키지에는 C/C++ 컴파일러와 관련 라이브러리, make 같은 도구들이 포함되어 있습니다.

cmake는 컴파일 옵션이나 빌드된 라이브러리에 포함시킬 OpenCV 모듈 설정등을 위해 필요합니다.


$ sudo apt-get install build-essential cmake




3-3. 특정 포맷의 이미지 파일을 불러오거나 기록하기 위해 필요한 패키지들입니다.

$ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev




3-4. 특정 코덱의 비디오 파일을 읽어오거나 기록하기 위해 필요한 패키지들입니다.

$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev




3-5. Video4Linux 패키지는 리눅스에서 실시간 비디오 캡처를 지원하기 위한 디바이스 드라이버와 API를 포함하고 있습니다.

$ sudo apt-get install libv4l-dev v4l-utils




3-6. GStreamer는 비디오 스트리밍을 위한 라이브러리입니다.

$ sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev




3-7. OpenCV에서는 highgui 모듈을 사용하여 자체적으로 윈도우 생성하여 이미지나 비디오들을 보여줄 수 있습니다.


윈도우 생성 등의 GUI를 위해 gtk 또는 qt를 선택해서 사용가능합니다.  여기서는 gtk2를 지정해주었습니다.

$ sudo apt-get install libgtk2.0-dev



그외 선택 가능한 패키지는 다음과 같습니다.

libgtk-3-dev

libqt4-dev

libqt5-dev




3-8. OpenGL 지원하기 위해 필요한 라이브러리입니다.

$ sudo apt-get install mesa-utils libgl1-mesa-dri libgtkgl2.0-dev libgtkglext1-dev   




3-9. OpenCV 최적화를 위해 사용되는 라이브러리들입니다.

$ sudo apt-get install libatlas-base-dev gfortran libeigen3-dev




3-10. python2.7-dev와 python3-dev 패키지는 OpenCV-Python 바인딩을 위해 필요한 패키지들입니다.

Numpy는 매트릭스 연산등을 빠르게 처리할 수 있어서 OpenCV Python에서 사용됩니다.

$ sudo apt-get install python2.7-dev python3-dev python-numpy python3-numpy




4. OpenCV 설정과 컴파일 및 설치

소스 코드를 저장할 임시 디렉토리를 생성하여 이동 후.. 진행합니다


pi@raspberrypi:~ $ mkdir opencv
pi@raspberrypi:~ $ cd opencv
pi@raspberrypi:~/opencv $




OpenCV 4.0.0 소스코드를 다운로드 받아 압축을 풀어줍니다.

$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.0.0.zip
$ unzip opencv.zip




opencv_contrib(extra modules) 소스코드를 다운로드 받아 압축을 풀어줍니다.

SIFT, SURF 등을 사용하기 위해 필요합니다.

$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.0.0.zip
$ unzip opencv_contrib.zip




다음처럼 두 개의 디렉토리가 생성됩니다.


pi@raspberrypi:~/opencv $  ls -d */

opencv-4.0.0  opencv_contrib-4.0.0




opencv-4.0.0 디렉토리로 이동하여 build 디렉토리를 생성하고 build 디렉토리로 이동합니다.

컴파일은 build 디렉토리에서 이루어집니다.


pi@raspberrypi:~/opencv $  cd opencv-4.0.0

pi@raspberrypi:~/opencv/opencv-4.0.0 $  mkdir build

pi@raspberrypi:~/opencv/opencv-4.0.0 $  cd build

pi@raspberrypi:~/opencv/opencv-4.0.0/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_EXTRA_MODULES_PATH=../../opencv_contrib-4.0.0/modules \
-D WITH_V4L=ON \
-D WITH_FFMPEG=ON \
-D WITH_XINE=ON \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
../



다음 처럼 cmake 실행 중에  추가적인 다운로드도 있으므로 라즈베리파이에 인터넷이 연결된 상태에서 진행하세요..



-- xfeatures2d/boostdesc: Download: boostdesc_bgm.i

-- xfeatures2d/boostdesc: Download: boostdesc_bgm_bi.i

-- xfeatures2d/boostdesc: Download: boostdesc_bgm_hd.i

-- xfeatures2d/boostdesc: Download: boostdesc_binboost_064.i

-- xfeatures2d/boostdesc: Download: boostdesc_binboost_128.i

-- xfeatures2d/boostdesc: Download: boostdesc_binboost_256.i

-- xfeatures2d/boostdesc: Download: boostdesc_lbgm.i

-- xfeatures2d/vgg: Download: vgg_generated_48.i

-- xfeatures2d/vgg: Download: vgg_generated_64.i

-- xfeatures2d/vgg: Download: vgg_generated_80.i

-- xfeatures2d/vgg: Download: vgg_generated_120.i

-- data: Download: face_landmark_model.dat




다음과 같은 메시지가 보이면 정상적으로 된 것입니다.


-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/opencv/opencv-4.0.0/build



cmake 실행 결과입니다.


-- General configuration for OpenCV 4.0.0 =====================================
--   Version control:               unknown
--
--   Extra modules:
--     Location (extra):            /home/pi/opencv/opencv_contrib-4.0.0/modules
--     Version control (extra):     unknown
--
--   Platform:
--     Timestamp:                   2018-11-24T14:19:37Z
--     Host:                      Linux 4.14.79-v7+ armv7l
--     CMake:                      3.7.2
--     CMake generator:             Unix Makefiles
--     CMake build tool:            /usr/bin/make
--     Configuration:               RELEASE
--
--   CPU/HW features:
--     Baseline:                    VFPV3 NEON
--       requested:                 DETECT
--       required:                  VFPV3 NEON
--
--   C/C++:
--     Built as dynamic libs?:      YES
--     C++ Compiler:                /usr/bin/c++ (ver 6.3.0)
--     C++ flags (Release):         -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -mfp16-format=ieee -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG -DNDEBUG
--     C++ flags (Debug):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -mfp16-format=ieee -fvisibility=hidden -fvisibility-inlines-hidden -g -O0 -DDEBUG -D_DEBUG
--     C Compiler:                  /usr/bin/cc
--     C flags (Release):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-narrowing -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -mfp16-format=ieee -fvisibility=hidden -O3 -DNDEBUG -DNDEBUG
--     C flags (Debug):             -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-narrowing -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -mfp16-format=ieee -fvisibility=hidden -g -O0 -DDEBUG -D_DEBUG
--     Linker flags (Release):
--     Linker flags (Debug):
--     ccache:                      NO
--     Precompiled headers:         YES
--     Extra dependencies:          dl m pthread rt /usr/lib/arm-linux-gnueabihf/libGLU.so /usr/lib/arm-linux-gnueabihf/libGL.so
--     3rdparty dependencies:
--
--   OpenCV modules:
--     To be built:                 aruco bgsegm bioinspired calib3d ccalib core datasets dnn dnn_objdetect dpm face features2d flann freetype fuzzy gapi hfs highgui img_hash imgcodecs imgproc java_bindings_generator line_descriptor ml objdetect optflow phase_unwrapping photo plot python2 python3 python_bindings_generator reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking video videoio videostab xfeatures2d ximgproc xobjdetect xphoto
--     Disabled:                    world
--     Disabled by dependency:      -
--     Unavailable:                 cnn_3dobj cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev cvv hdf java js matlab ovis sfm ts viz
--     Applications:                apps
--     Documentation:               NO
--     Non-free algorithms:         NO
--
--   GUI:
--     GTK+:                      YES (ver 2.24.31)
--       GThread :                  YES (ver 2.50.3)
--       GtkGlExt:                  YES (ver 1.2.0)
--     OpenGL support:              YES (/usr/lib/arm-linux-gnueabihf/libGLU.so /usr/lib/arm-linux-gnueabihf/libGL.so)
--     VTK support:                 NO
--
--   Media I/O:
--     ZLib:                      /usr/lib/arm-linux-gnueabihf/libz.so (ver 1.2.8)
--     JPEG:                      /usr/lib/arm-linux-gnueabihf/libjpeg.so (ver 62)
--     WEBP:                      build (ver encoder: 0x020e)
--     PNG:                      /usr/lib/arm-linux-gnueabihf/libpng.so (ver 1.6.28)
--     TIFF:                      /usr/lib/arm-linux-gnueabihf/libtiff.so (ver 42 / 4.0.8)
--     JPEG 2000:                   /usr/lib/arm-linux-gnueabihf/libjasper.so (ver 1.900.1)
--     OpenEXR:                     build (ver 1.7.1)
--     HDR:                      YES
--     SUNRASTER:                   YES
--     PXM:                      YES
--     PFM:                      YES
--
--   Video I/O:
--     FFMPEG:                      YES
--       avcodec:                  YES (ver 57.64.101)
--       avformat:                  YES (ver 57.56.101)
--       avutil:                  YES (ver 55.34.101)
--       swscale:                  YES (ver 4.2.100)
--       avresample:                NO
--     GStreamer:
--       base:                  YES (ver 1.10.4)
--       video:                  YES (ver 1.10.4)
--       app:                  YES (ver 1.10.4)
--       riff:                  YES (ver 1.10.4)
--       pbutils:                  YES (ver 1.10.4)
--     v4l/v4l2:                    linux/videodev2.h
--     Xine:                      YES (ver 1.2.6)
--
--   Parallel framework:            pthreads
--
--   Trace:                         YES (built-in)
--
--   Other third-party libraries:
--     Lapack:                      NO
--     Eigen:                      YES (ver 3.3.2)
--     Custom HAL:                  YES (carotene (ver 0.0.1))
--     Protobuf:                    build (3.5.1)
--
--   OpenCL:                        YES (no extra features)
--     Include path:                /home/pi/opencv/opencv-4.0.0/3rdparty/include/opencl/1.2
--     Link libraries:              Dynamic load
--
--   Python 2:
--     Interpreter:                 /usr/bin/python2.7 (ver 2.7.13)
--     Libraries:                   /usr/lib/arm-linux-gnueabihf/libpython2.7.so (ver 2.7.13)
--     numpy:                      /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.12.1)
--     packages path:               lib/python2.7/dist-packages
--
--   Python 3:
--     Interpreter:                 /usr/bin/python3 (ver 3.5.3)
--     Libraries:                   /usr/lib/arm-linux-gnueabihf/libpython3.5m.so (ver 3.5.3)
--     numpy:                      /usr/lib/python3/dist-packages/numpy/core/include (ver 1.12.1)
--     packages path:               lib/python3.5/dist-packages
--
--   Python (for build):            /usr/bin/python2.7
--
--   Java:
--     ant:                      NO
--     JNI:                      NO
--     Java wrappers:               NO
--     Java tests:                  NO
--
--   Install to:                    /usr/local
-- -----------------------------------------------------------------
--
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/opencv/opencv-4.0.0/build




다음처럼 Python 2 또는 Python 3 라이브러리 항목이 보이지 않는 경우에는


--   Python 2:
--     Interpreter:                 /usr/bin/python2.7 (ver 2.7.13)
--     Libraries:                   /usr/lib/arm-linux-gnueabihf/libpython2.7.so (ver 2.7.13)
--     numpy:                      /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.12.1)
--     packages path:               lib/python2.7/dist-packages
--
--   Python 3:
--     Interpreter:                 /usr/bin/python3 (ver 3.5.3)
--     Libraries:                   /usr/lib/arm-linux-gnueabihf/libpython3.5m.so (ver 3.5.3)
--     numpy:                      /usr/lib/python3/dist-packages/numpy/core/include (ver 1.12.1)
--     packages path:               lib/python3.5/dist-packages
--
--   Python (for build):            /usr/bin/python2.7




다음 붉은색 줄처럼 해당 경로들을 직접 적어줘야 합니다. 포스팅에서 사용한 옵션과 차이가 있을 수 있습니다.


$ 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 WITH_QT=OFF \

-D WITH_GTK=ON \

-D WITH_OPENGL=ON \

-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.0.0/modules \

-D WITH_V4L=ON  \

-D WITH_FFMPEG=ON \

-D WITH_XINE=ON \

-D BUILD_NEW_PYTHON_SUPPORT=ON \

-D PYTHON2_INCLUDE_DIR=/usr/include/python2.7 \

-D PYTHON2_NUMPY_INCLUDE_DIRS=/usr/lib/python2.7/dist-packages/numpy/core/include/ \

-D PYTHON2_PACKAGES_PATH=/usr/lib/python2.7/dist-packages \

-D PYTHON2_LIBRARY= /usr/lib/arm-linux-gnueabihf/libpython2.7.so \

-D PYTHON3_INCLUDE_DIR=/usr/include/python3.5m \

-D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include/ \

-D PYTHON3_PACKAGES_PATH=/usr/lib/python3.5/dist-packages \

-D PYTHON3_LIBRARY=/usr/lib/arm-linux-gnueabihf/libpython3.5m.so \

../




진행하기 전에 스왑(swap) 공간을 늘려줘야 멀티코어를 사용하여 컴파일시 메모리 부족으로 에러가 나지 않습니다.

( 참고 https://www.pyimagesearch.com/2017/10/09/optimizing-opencv-on-the-raspberry-pi/ )



/etc/dphys-swapfile 파일을 열어서


$ sudo nano /etc/dphys-swapfile



CONF_SWAPSIZE  변수값을 100에서 1024로 수정합니다.


# 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=1024



스왑 서비스 재시작하여 변경된 설정을 반영시켜주면 스왑 크기가 대략 10배가 됩니다.


pi@raspberrypi:~/opencv/opencv-4.0.0/build $ free
             total used        free shared buff/cache   available
Mem:         896672 79656       64716 11840 752300      739640
Swap:        102396           0      102396

100 메가 였던 Swap이


pi@raspberrypi:~/opencv/opencv-4.0.0/build $ sudo /etc/init.d/dphys-swapfile restart
[ ok ] Restarting dphys-swapfile (via systemctl): dphys-swapfile.service.
pi@raspberrypi:~/opencv/opencv-4.0.0/build $ free
             total used        free shared buff/cache   available
Mem:         896672 80128       61304 11840 755240      739168
Swap:        102396           0     1048572

2048메가로 바뀝니다.



이제 make 명령을 사용하여 컴파일을 시작합니다.


pi@raspberrypi:~/opencv/opencv-4.0.0/build $ make -j4



make 명령에 추가로 -d 옵션을 주어서 확인 결과 다음 상태에서 멈추어 버립니다.


The prerequisites of 'modules/python2/CMakeFiles/opencv_python2.dir/build' are being made.

Live child 0x1f42958 (modules/python2/CMakeFiles/opencv_python2.dir/__/src2/cv2.cpp.o) PID 4413

[100%] Building CXX object modules/python2/CMakeFiles/opencv_python2.dir/__/src2/cv2.cpp.o

Reaping winning child 0x1f42958 PID 4413

Live child 0x1f42958 (modules/python2/CMakeFiles/opencv_python2.dir/__/src2/cv2.cpp.o) PID 4417

[100%] Building CXX object modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2.cpp.o

Reaping winning child 0x1e0eb08 PID 4415

Live child 0x1e0eb08 (modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2.cpp.o) PID 4419




Ctrl + C를 눌러서 강제 종료시키고(좀 기다려야 됩니다. )  -j4 옵션없이 다시 한번 make를 하면 문제없이 완료 됩니다.


pi@raspberrypi:~/opencv/opencv-4.0.0/build $ make




이제 컴파일 결과물을 설치합니다.


pi@raspberrypi:~/opencv/opencv-4.0.0/build $ sudo make install



샘플 코드들은 /usr/local/share/opencv4/samples/ 위치에 복사됩니다.



opencv  라이브러리를 찾을 수 있도록 다음 명령을 실행합니다.

pi@raspberrypi:~/opencv/opencv-4.0.0/build $ sudo ldconfig




/etc/dphys-swapfile 파일을 열어서


$ sudo nano /etc/dphys-swapfile



CONF_SWAPSIZE  변수값을 다시 100으로 수정합니다.


# 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=1024



스왑 서비스 재시작하여 변경된 설정을 반영시켜주면 스왑 크기가 원래대로 돌아옵니다.


pi@raspberrypi:~/opencv/opencv-4.0.0/build $ sudo /etc/init.d/dphys-swapfile restart
[ ok ] Restarting dphys-swapfile (via systemctl): dphys-swapfile.service.


pi@raspberrypi:~/opencv/opencv-4.0.0/build $ free
             total used        free shared buff/cache   available
Mem:         896672 85660      220784 22084 590228      725888
Swap:        102396           0      102396




5. OpenCV 설치 결과 확인

5.1. C/C++

OpenCV 4.0.0에서 pkg-config를 디폴트로 지원하지 않습니다.  CMake를 사용해서 컴파일 해야 합니다.



예제 코드를 하나 가져와서 컴파일 해보겠습니다.


pi@raspberrypi:~ $ mkdir example

pi@raspberrypi:~ $ cd example

pi@raspberrypi:~/example $ cp /usr/local/share/opencv4/samples/cpp/facedetect.cpp ./



CMakeLists.txt 파일을 생성하여 다음 내용을 복사합니다.


pi@raspberrypi:~/example $ nano CMakeLists.txt


cmake_minimum_required(VERSION 2.8)
project( facedetect)
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( facedetect facedetect.cpp )
target_link_libraries( facedetect ${OpenCV_LIBS} )



build 디렉토리를 생성하여 컴파일을 진행합니다.

pi@raspberrypi:~/example $ mkdir build
pi@raspberrypi:~/example $ cd build
pi@raspberrypi:~/example/build $ cmake ..
pi@raspberrypi:~/example/build $ make



테스트를 하기 위해  필요한 웹캠 또는 Raspberry Pi Camera(pi camera)를  Raspberry Pi에 먼저 연결합니다.


대부분의 웹캠은 연결후 dmesg | tail 명령어로 해당 웹캠을 확인시 다음처럼 문제 없이 인식이 됩니다.

인식이 안되면 해당 웹캠을 위한 디바이스 드라이버를 설치해줘야 합니다.




/dev/video0 디바이스 파일이 생성되었는지 확인해봅니다.




파이 카메라의 경우에는 다음 명령으로 /dev/video0 장치를 만들어줘야 합니다.


sudo modprobe bcm2835-v4l2


자세한 내용은 아래 포스팅을 참고하세요.


Raspberry Pi Camera Module( pi camera )를 위해 /dev/video0 생성하는 방법

http://webnautes.tistory.com/1192



파이 카메라의 경우 추가로 소스코드를 수정해야 합니다. open 함수의 아규먼트를 -1로 해야 정상적으로 동작합니다. 0으로 하면 카메라를 열지 못하고 무한 대기 상태에 빠지게 됩니다.


VideoCapture capture;
........................................
if(!capture.open(-1))
           cout << "Capture from camera #" <<  camera << " didn't work" << endl;




이제 실행시켜 봅니다.


$ ./facedetect --cascade="/usr/local/share/opencv4/haarcascades/haarcascade_frontalface_alt.xml" --nested-cascade="/usr/local/share/opencv4/haarcascades/haarcascade_eye_tree_eyeglasses.xml " --scale=1.3




터미널 프로그램으로 MobaXterm을 사용하면 SSH 접속 상태에서 실행해보면 바로 실행 결과를 확인 가능합니다.

(일종의 VNC처럼 동작해서 속도는 느립니다..)


https://mobaxterm.mobatek.net/




검출시간이 표시되면서 카메라 영상에 얼굴이 검출된 결과를 얻을 수 있습니다.


pi@raspberrypi:~/example/build $ ./facedetect --cascade="/usr/local/share/opencv4/haarcascades/haarcascade_frontalface_alt.xml" --nested-cascade="/usr/local/share/opencv4/haarcascades/haarcascade_eye_tree_eyeglasses.xml " --scale=1.3

Video capturing has been started ...
[ INFO:0] Initialize OpenCL runtime...
detection time = 317.549 ms
detection time = 292.267 ms
detection time = 285.393 ms
detection time = 287.672 ms
detection time = 291.738 ms
detection time = 336.075 ms
detection time = 297.108




5.2. Python

라이브러리 파일을 복사해줍니다.


$ sudo cp  ~/opencv/opencv-4.0.0/build/lib/python3/cv2.cpython-35m-arm-linux-gnueabihf.so /usr/lib/python3/dist-packages

$ sudo cp ~/opencv/opencv-4.0.0/build/lib/cv2.so /usr/local/lib/python2.7/dist-packages/



python 2와 python 3에서 opencv 라이브러리를 사용가능한지는 다음처럼 확인합니다.

각각 OpenCV 버전이 출력되어야 합니다.

pi@raspberrypi:~ $ python
Python 2.7.13 (default, Nov 24 2017, 17:33:09)
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'4.0.0'
>>>


pi@raspberrypi:~ $ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170124] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'4.0.0'
>>>




파이 카메라의 경우 소스코드에서 다음부분을 -1로 수정해줘야 합니다.


cam = create_capture(-1, fallback='synth:bg=../data/lena.jpg:noise=0.05')



파이 카메라의 경우 다른 코드에서도 0 대신에 다음처럼 -1을 사용해야 합니다.


cap = cv.VideoCapture(-1)




예제 코드를 실행해봅니다.


$ python /usr/local/share/opencv4/samples/python/facedetect.py --cascade "/usr/local/share/opencv4/haarcascades/haarcascade_frontalface_alt.xml" --nested-cascade "/usr/local/share/opencv4/haarcascades/haarcascade_eye_tree_eyeglasses.xml" /dev/video0


$ python3 /usr/local/share/opencv4/samples/python/facedetect.py --cascade "/usr/local/share/opencv4/haarcascades/haarcascade_frontalface_alt.xml" --nested-cascade "/usr/local/share/opencv4/haarcascades/haarcascade_eye_tree_eyeglasses.xml" /dev/video0




카메라 영상에 얼굴이 검출된 결과를 얻을 수 있습니다.


pi@raspberrypi:~/opencv/opencv-4.0.0/build $ python /usr/local/share/opencv4/samples/python/facedetect.py --cascade "/usr/local/share/opencv4/haarcascades/haarcascade_frontalface_alt.xml" --nested-cascade "/usr/local/share/opencv4/haarcascades/haarcascade_eye_tree_eyeglasses.xml" /dev/video0

face detection using haar cascades

USAGE:
   facedetect.py [--cascade <cascade_fn>] [--nested-cascade <cascade_fn>] [<video_source>]

[ INFO:0] Initialize OpenCL runtime...




이제 필요 없어진 컴파일에 사용했던 opencv 소스코드 디렉토리를 삭제합니다.


pi@raspberrypi:~/opencv/opencv-4.0.0/build $ cd
pi@raspberrypi:~ $ rm -rf opencv






해봤어요 www.facebook.com/webnautes/
여러분의 관심과 댓글에 감사드립니다.

  1. 이전 댓글 더보기
  2. jwbae 2018.10.13 20:19 신고

    안녕하세요, 좋은 글 덕분에 많은 공부하고 갑니다. 혹시 그러면 마지막 예제를 통해 얼굴이 나오게 되는것은 스트리밍 되고 있는 것인가요?

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.10.13 20:34 신고

      스트리밍은 아니고 mobaXterm을 사용하면 VNC와 유사하게 동작해서 실행결과 창을 윈도우에서 띄워줍니다.

    • jwbae 2018.10.21 16:47 신고

      넵 감사합니당

  3. GUN0S 2018.10.14 00:12 신고

    다 따라했는데 중간에 time make -j4 부분에서
    98% Building CXX object modules/python3/CMakeFiles/opencv_python2.dir/__/src2/cv2.cpp.o
    98% Building CXX object modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2.cpp.o

    여기서 멈춥니다. 어떻게해결해야하나요?ㅜㅜ

    • gun0s 2018.10.14 00:50 신고

      추가로 질문드립니다.
      계속 해봤는데 똑같네요..
      우선 작성자님께서 작성해주신 글 그대로 따라하고있었구요
      따라하면서 CMAKE부분에서 다른 점이 하나있었습니다.
      바로 파이썬의 버전이
      python은 2.7.9
      python3은 3.4.2
      입니다. 혹시 위의 98% 멈춤 해결하려면 어떻게해야하나요 제발 알려주세요 ㅜㅜ

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.10.14 06:21 신고

      그부분이 파이썬용 라이브러리 생성하는 건데. 오래.걸렸던것으로 기억합니다

  4. 라즈베리초보 2018.10.15 14:18 신고

    첨에 github 외국 블로거 글 보고 설치를 했는데 예제 파일이 없어서 이 글 찾은다음 그대로 재설치를 했는데도 예제파일이 없어요 ㅠㅠ
    일단 설치 끝나고 pkg-config --libs --cflags opencv를 해보면

    -I/usr/local/include/opencv -I/usr/local/include -L/usr/local/lib -lopencv_dnn - lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superre s -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core

    작성자님이랑은 다르게 목록이 조금 적게 나와요ㅠㅠ
    또 설치전 Cmake를 했을때 GUI 목록에서 OpenGL 부분도 안나오구요 ㅠㅠ

    작성자님이랑 제 환경이 조금 다른게 제 라즈베리는 Raspberry pi 3 b+ 인데 이게 문제인가요?
    아 그리구 설치 후에도 Cmake 수정하고 다시 설치하면 아무 이상없나요? 아니면 Cmake 변경하려면 다시 삭제하고 해야하나요?

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.10.15 15:23 신고

      라즈비안은 똑같기때문에 차이는 없을듯 보입니다.

      예제코드는 소스코드 디렉토리 opencv/shmples에 있습니다.

    • 라즈베리초보 2018.10.15 15:41 신고

      /usr/local/share/OpenCV/ 폴더에 samples 라는 폴더도 없고 cpp 파일 비스무리한 파일도 없습니다 ㅠㅠ

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.10.15 15:44 신고

      다운로드 받아 압축을 풀었던 opencv / samples를 확인하세요

    • 라즈베리초보 2018.10.15 15:54 신고

      컹 ㅋㅋㅋㅋ 감사합니다 찾았습니다. ㅠㅠ
      cp 명령어를 build 폴더안에서 쓰고 앉았었네요ㅠㅠ이거때매 이틀 헤맸는데 하.. 왜 예제코드 가져오는 명령어 앞에 달라표시만 있었는지 생각을 못햇을까 ㅋㅋㅋㅋ 아직 리눅스 초보라 죄송합니다 ㅠㅠ

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.10.15 15:57 신고

      괜찮습니다. 첨엔 다들 그러는 거죠 ^^

    • 라즈베리초보 2018.10.16 15:01 신고

      sudo python /usr/local/share/OpenCV/samples/python/facedetect.py --cascade "/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" --nested-cascade "/usr/local/share/OpenCV/haarcascades/haarcascade_eye_tree_eyeglasses.xml" /dev/video0
      Traceback (most recent call last):
      File "/usr/local/share/OpenCV/samples/python/facedetect.py", line 17, in <module>
      from video import create_capture
      ImportError: No module named video

      cpp 파일은 동작가능한데 python 파일은 이런 오류코드가 뜹니다. cam = create_capture(-1, fallback='synth:bg=../data/lena.jpg:noise=0.05')

      이 소스 코드 수정했고, 그 밑에 소스코드 cap = cv.VideoCapture(-1) 이거는 facedetect.py 파일에 없는데 어디서 수정해야되는지 모르겠습니다. ㅠㅠ 혹시 /usr/local/share/OpenCV/samples/python 폴더에 facedect.py 파일 말고 다른 파일도 함께 넣어줘야하는건가요?

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.10.16 15:30 신고

      확인해보니 facedetect.py를 실행하려면 samples/python 폴더에서 다음 파일들이 추가로 필요합니다.

      common.py
      tst_scene_render.py
      video.py




    • 라즈베리초보 2018.10.16 15:39 신고

      감사합니당 ㅎㅎ
      근데 그냥 opencv-3.4.3 샘플폴더의 Python 폴더 다 복사해서 usr/local/share/OpenCV/samples 에 다 넣어 주니까 되더라구요

      아 그리고 저는 파이 카메라 쓰는데도 -1 코드수정 안해줘도 카메라랑 얼굴인식 실행되던데 대신 이런 메세지가 뜹니다.

      face detection using haar cascades

      USAGE:
      facedetect.py [--cascade <cascade_fn>] [--nested-cascade <cascade_fn>] [<video_source>]


      (python:3326): GStreamer-CRITICAL **: gst_element_get_state: assertion 'GST_IS_ELEMENT (element)' failed
      ^CTraceback (most recent call last):
      File "/usr/local/share/OpenCV/samples/python/facedetect.py", line 57, in <module>
      rects = detect(gray, cascade)
      File "/usr/local/share/OpenCV/samples/python/facedetect.py", line 23, in detect
      flags=cv.CASCADE_SCALE_IMAGE)

      ㅎㅎ 무튼 실행되면 상관없겠지요?

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.10.16 15:51 신고

      네.. 무시해도 됩니다..

  5. 안녕하세요 2018.10.16 22:25 신고

    저번에 카메라 때문에 질문드렸는데요
    카메라 새로 사서 달아봤는데도 안되더라구요
    그래서 혹시 opencv path가 문제있나 다시 깔아보려는데
    opencv 삭제할때 2.4버전 삭제랑 똑같이 하면 되나요?

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.10.17 00:03 신고

      포스팅처럼 2018년 6월 27일 버전 라즈비안을 설치해서 패키지 업데이트 후 똑같이 진행해보세요.. 그래야 하드웨어 문제인지 알수 있을 듯합니다.

      USB 포트가 4개이니 바꿔서도 꽂아보시구요..

  6. 2018.10.24 01:58 신고

    파이썬3 라이브러리가 안떠서 빨간줄 추가해도 계속안되네요ㅜㅜㅜ뭐가문제인지 다른건 다 잘돼서 opencv설치 포스트중 이게 제일 좋은데ㅜㅜㅜ파이썬3만 설치가안되네요..다른이유가 있을까요??

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.10.24 03:57 신고

      라즈비안 버전차이로 안될수도 있을듯합니다

      현재 포스팅은 2018년 6월 버전으로 진행한 결과입니다

  7. Clockwork01 2018.10.28 23:45 신고

    안녕하세요 4번에서 CMake로 빌드를 하려고
    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_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.3/modules \
    -D WITH_V4L=ON \
    -D WITH_FFMPEG=ON \
    -D WITH_XINE=ON \
    -D BUILD_NEW_PYTHON_SUPPORT=ON \
    ../ 를 한 결과
    언급하신 파이썬 경로같은 것은 제대로 나오는데 마지막에 Configuring incomplete, errors occurred! 이렇게 뜨네요
    Error 로그는Build output check failed:
    Regex: 'command line option .* is valid for .* but not for C\+\+'
    Output line: 'cc1plus: warning: command line option ‘-Wmissing-prototypes’ is valid for C/ObjC but not for C++'
    Compilation failed:
    source file: '/home/pi/opencv/opencv-3.4.3/build/CMakeFiles/CMakeTmp/src.cxx'
    check option: ' -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes'

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.10.28 23:57 신고

      예상치못한에러네요. 사용한 라즈비안 버전이 어떻게 되나요? 2018년 6월 27일 이후에 나온 건가요?

    • Clockwork01 2018.10.29 18:46 신고

      네! 라즈베리파이는 3 B+를 사용하고 라즈비안은 며칠 전 다운로드로 2018-6-27 strech 버전으로 설치했습니다. 단계별로 내려오면서 설치한 라이브러리 외에는 기본으로 이미지에 포함된 라이브러리만 있는 상태입니다..

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.10.29 19:09 신고

      포스팅과의 차이가 라즈3와 라즈3+ 차이 뿐이라서..

      올려주신 메시지가 cmake가 실패한 직접적인 원인이 아닌 싶습니다. 좀 더 에러메시지를 살펴봐야 할 듯합니다.

    • Clockwork01 2018.10.29 20:43 신고

      앗 말씀 듣고 에러로그를 다시 보다가 sys/videoio.h missing 문제가 스탭대로 따라하지 않은 경우라고 해서 살펴봤는데 소스코드를 하나만 풀고 넘어갔었네요.. 여러번 댓글 감사합니다

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.10.29 21:03 신고

      원인을 찾아서 다행이네요 ^^

  8. poison 2018.11.08 23:03 신고

    안녕하세요 opencv관련글을 찾던 중에 이 글을 보고 opencv3.4.3를 설치하던 중에
    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_PREF_TESTS=OFF-D ENABLE_NEON=ON-D ENABLE_VFPV3=ON-D WITH_QT=OFF-D WITH_GTK=ON-D WITH_OPENGL=ON-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.3/modules-D WITH_V4L=ON-D WITH_FFMPEG=ON-D WITH_XINE=ON-D BUILD_opencv_python3=on../
    위 명령어에서
    CMake Error: The source directory "/home/pi/opencv/opencv-3.4.3/build/BUILD_NEW_PYTHON_SUPPORT=ON.." does not exist.
    Specify --help for usage, or press the help button on the CMake GUI.
    라는 메시지가 출력이 됩니다
    이건 어떤경우인지 알고싶어 댓글 남겨봅니다

  9. hyuns 2018.11.11 21:57 신고

    In file included from /home/pi/opencv/opencv-3.4.3/build/modules/stereo/precomp.hpp:52:0:
    /home/pi/opencv/opencv-3.4.3/modules/calib3d/include/opencv2/calib3d.hpp:2452:1: fatal error: can’t write PCH file: 장치에 남은 공간이 없음
    } //end namespace cv
    ^
    In file included from /home/pi/opencv/opencv-3.4.3/build/modules/structured_light/precomp.hpp:47:0:
    /home/pi/opencv/opencv-3.4.3/modules/core/include/opencv2/core/private.hpp:625:9: fatal error: can’t write PCH file: 장치에 남은 공간이 없음
    CvStatus;
    ^
    compilation terminated.
    compilation terminated.
    /home/pi/opencv/opencv-3.4.3/build/modules/videostab/precomp.hpp:65:1: fatal error: can’t write PCH file: 장치에 남은 공간이 없음
    }
    ^
    compilation terminated.
    modules/structured_light/CMakeFiles/pch_Generate_opencv_structured_light.dir/build.make:62: 'modules/structured_light/precomp.hpp.gch/opencv_structured_light_RELEASE.gch' 타겟에 대한 명령이 실패했습니다
    modules/stereo/CMakeFiles/pch_Generate_opencv_stereo.dir/build.make:62: 'modules/stereo/precomp.hpp.gch/opencv_stereo_RELEASE.gch' 타겟에 대한 명령이 실패했습니다
    make[2]: *** [modules/structured_light/precomp.hpp.gch/opencv_structured_light_RELEASE.gch] 오류 1
    make[2]: *** [modules/stereo/precomp.hpp.gch/opencv_stereo_RELEASE.gch] 오류 1
    modules/videostab/CMakeFiles/pch_Generate_opencv_videostab.dir/build.make:62: 'modules/videostab/precomp.hpp.gch/opencv_videostab_RELEASE.gch' 타겟에 대한 명령이 실패했습니다
    make[2]: *** [modules/videostab/precomp.hpp.gch/opencv_videostab_RELEASE.gch] 오류 1
    CMakeFiles/Makefile2:6884: 'modules/stereo/CMakeFiles/pch_Generate_opencv_stereo.dir/all' 타겟에 대한 명령이 실패했습니다
    make[1]: *** [modules/stereo/CMakeFiles/pch_Generate_opencv_stereo.dir/all] 오류 2
    make[1]: *** 끝나지 않은 작업을 기다리고 있습니다....
    CMakeFiles/Makefile2:7020: 'modules/structured_light/CMakeFiles/pch_Generate_opencv_structured_light.dir/all' 타겟에 대한 명령이 실패했습니다
    make[1]: *** [modules/structured_light/CMakeFiles/pch_Generate_opencv_structured_light.dir/all] 오류 2
    CMakeFiles/Makefile2:7346: 'modules/videostab/CMakeFiles/pch_Generate_opencv_videostab.dir/all' 타겟에 대한 명령이 실패했습니다
    make[1]: *** [modules/videostab/CMakeFiles/pch_Generate_opencv_videostab.dir/all] 오류 2
    [ 39%] Built target pch_Generate_opencv_tracking
    Makefile:160: 'all' 타겟에 대한 명령이 실패했습니다
    make: *** [all] 오류 2

    real 0m54.826s
    user 1m46.896s
    sys 0m10.276s


    이런 오류가 발생하는데 어떻게 해결할수있나요..???

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.11.11 22:13 신고

      저장 공간.부족 에러가 난듯합니다.

      OpenCV를 컴파일하려면 최소 16기가짜리 SD카드를 사용해야 합니다.

  10. CHAEMIN 2018.11.18 04:05 신고

    [ 65%] Linking CXX shared library ../../lib/libopencv_dnn.so
    [ 65%] Built target opencv_dnn
    Makefile:160: 'all' 타겟에 대한 명령이 실패했습니다
    make: *** [all] 오류 2

    cmake -j4
    를 실행했을 때 이와 같은 오류가 뜹니다
    무슨 이유인지 알수 있을까요??

    • CHAEMIN 2018.11.18 05:42 신고

      /home/pi/opencv/opencv_contrib-3.4.3/modules/freetype/src/freetype.cpp:50:22: fatal error: ft2build.h: 그런 파일이나 디렉터리가 없습니다
      #include <ft2build.h>
      ^
      compilation terminated.
      modules/freetype/CMakeFiles/opencv_freetype.dir/build.make:62: 'modules/freetype/CMakeFiles/opencv_freetype.dir/src/freetype.cpp.o' 타겟에 대한 명령이 실패했습니다
      make[2]: *** [modules/freetype/CMakeFiles/opencv_freetype.dir/src/freetype.cpp.o] 오류 1
      CMakeFiles/Makefile2:4118: 'modules/freetype/CMakeFiles/opencv_freetype.dir/all' 타겟에 대한 명령이 실패했습니다
      make[1]: *** [modules/freetype/CMakeFiles/opencv_freetype.dir/all] 오류 2
      make[1]: *** 끝나지 않은 작업을 기다리고 있습니다....
      [ 57%] Building CXX object modules/img_hash/CMakeFiles/opencv_img_hash.dir/src/block_mean_hash.cpp.o
      [ 57%] Building CXX object modules/shape/CMakeFiles/opencv_shape.dir/src/aff_trans.cpp.o
      [ 57%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/loadsave.cpp.o
      [ 57%] Building CXX object modules/shape/CMakeFiles/opencv_shape.dir/src/emdL1.cpp.o
      [ 57%] Building CXX object modules/img_hash/CMakeFiles/opencv_img_hash.dir/src/color_moment_hash.cpp.o
      [ 57%] Building CXX object modules/img_hash/CMakeFiles/opencv_img_hash.dir/src/img_hash_base.cpp.o
      [ 57%] Building CXX object modules/img_hash/CMakeFiles/opencv_img_hash.dir/src/marr_hildreth_hash.cpp.o
      [ 57%] Building CXX object modules/img_hash/CMakeFiles/opencv_img_hash.dir/src/radial_variance_hash.cpp.o
      [ 57%] Building CXX object modules/img_hash/CMakeFiles/opencv_img_hash.dir/src/phash.cpp.o
      [ 57%] Building CXX object modules/shape/CMakeFiles/opencv_shape.dir/src/haus_dis.cpp.o
      [ 57%] Building CXX object modules/shape/CMakeFiles/opencv_shape.dir/src/hist_cost.cpp.o
      [ 57%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/utils.cpp.o
      [ 57%] Linking CXX shared library ../../lib/libopencv_img_hash.so
      [ 57%] Built target opencv_img_hash
      [ 57%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/grfmt_base.cpp.o
      [ 57%] Building CXX object modules/shape/CMakeFiles/opencv_shape.dir/src/sc_dis.cpp.o
      [ 57%] Building CXX object modules/shape/CMakeFiles/opencv_shape.dir/src/tps_trans.cpp.o
      [ 57%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/grfmt_bmp.cpp.o
      [ 57%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/grfmt_exr.cpp.o
      [ 57%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/grfmt_gdal.cpp.o
      [ 57%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/grfmt_gdcm.cpp.o
      [ 57%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/grfmt_hdr.cpp.o
      [ 57%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/grfmt_jpeg.cpp.o
      [ 57%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/grfmt_jpeg2000.cpp.o
      [ 57%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/grfmt_pam.cpp.o
      [ 57%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/grfmt_png.cpp.o
      [ 57%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/grfmt_pxm.cpp.o
      [ 57%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/grfmt_sunras.cpp.o
      [ 57%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/grfmt_tiff.cpp.o
      [ 57%] Linking CXX shared library ../../lib/libopencv_shape.so
      [ 57%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/grfmt_webp.cpp.o
      [ 57%] Built target opencv_shape
      [ 57%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/bitstrm.cpp.o
      [ 57%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/rgbe.cpp.o
      [ 57%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/exif.cpp.o
      [ 57%] Linking CXX shared library ../../lib/libopencv_imgcodecs.so
      [ 57%] Built target opencv_imgcodecs
      Makefile:160: 'all' 타겟에 대한 명령이 실패했습니다
      make: *** [all] 오류 2

      real 1m0.664s
      user 2m48.938s
      sys 0m12.239s

      라즈베리파이 리부트 이후에
      다시 cmake -j4 를 실행하니
      위와 같이 나오네요ㅠ

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.11.18 09:01 신고

      다음처럼 freetype를 설치해보세요.

      sudo apt-get install libfreetype6-dev


      해결되지 않으면 다음처럼 하면 된다고 합니다.
      DFREETYPE_INCLUDE_DIRS는 해당 경로가 맞는지 확인이 필요한 듯합니다.

      cmake . -DCMAKE_CXX_COMPILER=g++-4.7 -DFREETYPE_INCLUDE_DIRS=/usr/include/freetype2/

  11. aya02245 2018.11.18 09:46 신고

    가이드가 참 깔끔한 거 같습니다.
    항상 보면서 도움받고 있습니다.
    감사합니다.

  12. raspiBerry 2018.11.25 17:19 신고

    글이 3.4.3버전에서 4.0.0버전으로 바뀌었네요.. 마지막에 파일 실행하는 부분에서 예전에는 g++ -o 000 000.cpp (pkg-config~~~~)이런거였던거 같은데 이 실행문장 다시 알 수 있을까요.. 그리고 뒤에 괄호부분을 넣는 이유도 궁금합니다.

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.11.25 17:30 신고

      g++ -o example example.cpp $(pkg-config opencv --libs --cflags)

      또는

      g++ -o example example.cpp `pkg-config opencv --libs --cflags`

      로 실행하면 됩니다.


      터미널에서 pkg-config opencv --libs --cflags를 실행해보면 출력되는 것들이 있습니다.

      OpenCV 예제 컴파일시 OpenCV 인클루드 위치와 라이브러리 위치 및 -l 플래그로 사용하는 라이브러리 이름을 적어주기 위해 사용됩니다.


      `를 사용하는 것보다는 ( 가 포스팅시 잘보이기 때문에 사용했습니다.

  13. kmj 2018.11.27 08:33 신고

    안녕하세요 덕분에 cv2 를 설치하였습니다 다름아니라 cv2 가 파이썬에서 임포트 하면 python2 에서는 4.0.0 버전이 뜨고
    python3 에서는 cv2 버전이 이전에 설치 했던 3.4.0버전이 뜹니다 과정에 에 있던 cp 하여서
    ~/opencv/opencv-4.0.0/build/lib/python3 $ ls
    cv2.cpython-35m-arm-linux-gnueabihf.so
    가 뜨는것도 확인 하였습니다
    맨첨에 하던 cv2 제거 과정도 거친터라 원인을 알수가 없어 글을 남기게 되었습니다 ㅜ
    도와주세요 ㅜ

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.11.27 12:10 신고

      다음 명령으로 cv2.cpython-35m-arm-linux-gnueabihf.so를 찾아서 해당 위치에 지금 컴파일한것을 복사해주세요.

      find / | grep cv2.cpython-35m-arm-linux-gnueabihf.so

    • kmj 2018.11.27 15:32 신고

      pi@raspberrypi:~ $ find / | grep cv2.cpython-35m-arm-linux-gnueabihf.so
      find: ‘/run/udisks2’: 허가 거부
      find: ‘/run/lightdm’: 허가 거부
      find: ‘/run/systemd/inaccessible’: 허가 거부
      find: ‘/sys/kernel/debug’: 허가 거부
      find: ‘/var/log/lightdm’: 허가 거부
      find: ‘/var/lib/bluetooth’: 허가 거부
      find: ‘/var/lib/udisks2’: 허가 거부
      find: ‘/var/lib/sudo’: 허가 거부
      find: ‘/var/lib/polkit-1’: 허가 거부
      find: ‘/var/lib/lightdm’: 허가 거부
      find: ‘/var/lib/apt/lists/partial’: 허가 거부
      find: ‘/var/cache/lightdm’: 허가 거부
      find: ‘/var/cache/ldconfig’: 허가 거부
      find: ‘/var/cache/apt/archives/partial’: 허가 거부
      find: ‘/var/tmp/systemd-private-921d1bb09ca84b609c88e6dd84480549-systemd-hostnamed.service-quY4wi’: 허가 거부
      find: ‘/var/tmp/systemd-private-6a82dea599774041b47328788ffe1722-systemd-timesyncd.service-oNtMje’: 허가 거부
      find: ‘/var/tmp/systemd-private-921d1bb09ca84b609c88e6dd84480549-systemd-timesyncd.service-iXGFa7’: 허가 거부
      find: ‘/var/tmp/systemd-private-f1f646174e244c5ba05bbb0ec23d45fc-systemd-timesyncd.service-s3utF2’: 허가 거부
      find: ‘/var/tmp/systemd-private-0596e08439e74316a7cfa4c28c6033f4-systemd-timesyncd.service-Oh6p69’: 허가 거부
      find: ‘/var/tmp/systemd-private-e65186a892834655b31b564ff571b97d-systemd-timesyncd.service-AQO1VM’: 허가 거부
      find: ‘/var/tmp/systemd-private-7eafb75eff2e4e6cbce31aafb2fd57e6-systemd-timesyncd.service-MsFXTS’: 허가 거부
      find: ‘/var/tmp/systemd-private-bbd2b92545594732af383598e5425e43-systemd-timesyncd.service-SW4MEG’: 허가 거부
      find: ‘/var/tmp/systemd-private-8bfa2869e269448f92dca90fe38cb3c8-systemd-timesyncd.service-m5f8IU’: 허가 거부
      find: ‘/var/tmp/systemd-private-b31fcab7a48a4765ad8ea76fe7d3ae7a-systemd-timesyncd.service-ygkxmX’: 허가 거부
      find: ‘/var/tmp/systemd-private-0f7de559fb764cdf803987d1e0175332-systemd-timesyncd.service-MWdZ5L’: 허가 거부
      find: ‘/var/spool/rsyslog’: 허가 거부
      find: ‘/var/spool/cron/crontabs’: 허가 거부
      find: ‘/etc/ssl/private’: 허가 거부
      find: ‘/etc/polkit-1/localauthority’: 허가 거부
      find: ‘/lost+found’: 허가 거부
      /home/pi/opencv/opencv-4.0.0/build/lib/python3/cv2.cpython-35m-arm-linux-gnueabi
      .
      .
      find: ‘/proc/1297/map_files’: 허가 거부
      find: ‘/proc/1297/fdinfo’: 허가 거부
      find: ‘/proc/1297/ns’: 허가 거부
      /usr/lib/python3/dist-packages/cv2.cpython-35m-arm-linux-gnueabihf.so
      /usr/local/lib/python3.5/dist-packages/cv2.cpython-35m-arm-linux-gnueabihf.so
      /usr/local/python/cv2/python-3.5/cv2.cpython-35m-arm-linux-gnueabihf.so



      명령어를 쳣는데 이렇게 떳습니다 컴파일 한것의 주소는 /home/pi/opencv/opencv-4.0.0/build/lib/python3/cv2.cpython-35m-arm-linux-gnueabihf.so
      인가요 이걸 어디다 붙여 야 할까요 도움주신 명령어 보니 이미 붙 되어 있는거 같은데 다른 주소 에 넣는건가요

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.11.27 15:38 신고

      기존에 사용하던 파일이 남아있어서 발생한 문제입니다.

      다음처럼 두 곳에 추가로 복사해서 덮어씌우기 해주세요 .

      sudo cp ~/opencv/opencv-4.0.0/build/lib/python3/cv2.cpython-35m-arm-linux-gnueabihf.so /usr/local/lib/python3.5/dist-packages
      sudo cp ~/opencv/opencv-4.0.0/build/lib/python3/cv2.cpython-35m-arm-linux-gnueabihf.so /usr/local/python/cv2/python-3.5

    • kmj 2018.11.27 15:54 신고

      파이썬 3.5 경로에 넣으니 됬습니다 정말 감사합니다 감사합니다

  14. philoDev 2018.11.27 15:49 신고

    늘 올려주신 자료들 참고하면서 라즈베리파이 개발을 하고 있는 학생입니다.
    현재 테스트 하셨던 라즈베리파이3 B+모델과, 2018 11 13 릴리즈 된 라즈비안을 사용하고 있는데,
    make -j4 후,
    make를 하면 다음 문구가 나온 후 다른 아웃풋을 보이지 않습니다.
    [ 99%] Building CXX object modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2.cpp.o

    약 1시간 정도 대기도 해 봤으나 다른 결과가 없어서 이렇게 글 남깁니다.
    혹시 해결방안이나 참조할 만한 자료 정보를 아신다면 도움 부탁드립니다.

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.11.27 15:51 신고

      ctrl + c를 눌러서 강제 종료시키고 -j4 옵션없이 make 명령으로 진행해야 합니다.

      30분정도 기다리면 완료됩니다

  15. 느그폰없 2018.11.30 11:21 신고

    좋 은자 료감사드립니다. 많 은도움 이되었습니다.

  16. 서현주 2018.12.02 11:31 신고

    cv2.error: OpenCV(4.0.0) /home/pi/opencv/opencv-4.0.0/modules/core/src/persistence.cpp:722: error: (-49:Unknown error code -49) Input file is empty in function 'open'


    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File "/home/pi/face_eyes.py", line 9, in <module>
    face_cascade = cv2.CascadeClassifier('/usr/local/share/opencv4/haarcascades/haarcascade_frontalface_default.xml')
    SystemError: <class 'cv2.CascadeClassifier'> returned a result with an error set

    제가 파이썬을 실행하면 저렇게 뜨는데 이유를 아시는지요?

    # import the necessary packages
    from picamera.array import PiRGBArray
    from picamera import PiCamera
    import numpy
    import time
    import cv2

    #multiple cascades: https://github.com/Itseez/opencv/tree/master/data/haarcascades
    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

    # initialize the camera and grab a reference to the raw camera capture
    camera = PiCamera()
    camera.resolution = (640, 480)
    camera.framerate = 32
    rawCapture = PiRGBArray(camera, size=(640, 480))

    # allow the camera to warmup
    time.sleep(0.1)

    # capture frames from the camera
    for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
    image = frame.array
    gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale (gray, 1.3, 5)

    for (x, y, w, h) in faces:
    cv2.rectangle (image, (x, y), (x + w, y + h), (255, 0, 0), 2)
    roi_gray = gray [y: y + h, x: x + w]
    roi_color = image [y: y + h, x: x + w]

    eyes = eye_cascade.detectMultiScale (roi_gray)
    if len(eyes) > 0:
    camera.start_preview()
    camera.annotate_text = 'WARNING!'
    else:
    for (ex, ey, ew, eh) in eyes:
    cv2. rectangle (roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)



    # show the frame
    cv2.imshow("Frame", image)
    key = cv2.waitKey(1) & 0xFF

    # clear the stream in preparation for the next frame
    rawCapture.truncate(0)

    # if the `q` key was pressed, break from the loop
    if key == ord("q"):
    break

    사용 코드

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.12.02 11:42 신고

      에러 내용은 입력이미지가 넘어오지 않는 다는 겁니다. 간단한 카메라소스코드로 카메라 영상이 들어오는지 테스트 해보셨나요?

  17. 서현주 2018.12.02 11:47 신고

    # import the necessary packages
    from picamera.array import PiRGBArray
    from picamera import PiCamera
    import time
    import cv2

    # initialize the camera and grab a reference to the raw camera capture
    camera = PiCamera()
    camera.resolution = (640, 480)
    camera.framerate = 32
    rawCapture = PiRGBArray(camera, size=(640, 480))

    # allow the camera to warmup
    time.sleep(0.1)

    # capture frames from the camera
    for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
    # grab the raw NumPy array representing the image, then initialize the timestamp
    # and occupied/unoccupied text
    image = frame.array

    # show the frame
    cv2.imshow("Frame", image)
    key = cv2.waitKey(1) & 0xFF

    # clear the stream in preparation for the next frame
    rawCapture.truncate(0)

    # if the `q` key was pressed, break from the loop
    if key == ord("q"):
    break

    이 코드를 사용하면 제대로 동영상이 보입니다.
    그런데
    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
    이 부분을 사용하면 오류가 걸립니다.

    첫 댓글 소스코드 사용시에러
    python
    Traceback (most recent call last):
    File "face_eyes.py", line 13, in <module>
    camera = PiCamera()
    File "/usr/lib/python2.7/dist-packages/picamera/camera.py", line 333, in __init__
    mimetypes.add_type('application/h264', '.h264', False)
    File "/usr/lib/python2.7/mimetypes.py", line 343, in add_type
    init()
    File "/usr/lib/python2.7/mimetypes.py", line 351, in init
    db = MimeTypes()
    File "/usr/lib/python2.7/mimetypes.py", line 71, in __init__
    for (ext, type) in types_map.items():
    cv2.error: OpenCV(4.0.0) /home/pi/opencv/opencv-4.0.0/modules/core/src/persistence.cpp:722: error: (-49:Unknown error code -49) Input file is empty in function 'open'

    python3
    cv2.error: OpenCV(4.0.0) /home/pi/opencv/opencv-4.0.0/modules/core/src/persistence.cpp:722: error: (-49:Unknown error code -49) Input file is empty in function 'open'


    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File "face_eyes.py", line 9, in <module>
    face_cascade = cv2.CascadeClassifier('/usr/local/share/opencv4/haarcascades/haarcascade_frontalface_default.xml')
    SystemError: <class 'cv2.CascadeClassifier'> returned a result with an error set

    • 서현주 2018.12.02 12:02 신고

      하지만.

      # import the necessary packages
      from picamera.array import PiRGBArray
      from picamera import PiCamera
      import time
      import cv2

      def detect(img, cascade):
      rects = cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30),
      flags=cv2.CASCADE_SCALE_IMAGE)

      if len(rects) == 0:
      return []
      rects[:,2:] += rects[:,:2]
      return rects

      def draw_rects(img, rects, color):
      for x1, y1, x2, y2 in rects:
      cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)

      # initialize the camera and grab a reference to the raw camera capture
      camera = PiCamera()
      camera.resolution = (640, 480)
      camera.framerate = 32

      rawCapture = PiRGBArray(camera, size=(640, 480))
      cascade = cv2.CascadeClassifier('/usr/local/share/opencv4/haarcascades/haarcascade_frontalface_alt.xml')

      # allow the camera to warmup
      time.sleep(0.1)

      # capture frames from the camera
      for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
      # grab the raw NumPy array representing the image, then initialize the timestamp
      # and occupied/unoccupied text
      img = frame.array
      gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
      gray = cv2.equalizeHist(gray)
      rects = detect(gray, cascade)
      vis = img.copy()
      draw_rects(vis, rects, (0, 255, 0))

      # show the frame
      cv2.imshow("Frame", vis)
      key = cv2.waitKey(1) & 0xFF

      # clear the stream in preparation for the next frame
      rawCapture.truncate(0)

      # if the `q` key was pressed, break from the loop
      if key == ord("q"):
      break

      이방식의 얼굴인식을 사용하면 정상적으로 작동이 됩니다.

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.12.02 12:04 신고

      아.. 제가 잘못 봤네요..

      카메라 영상을 읽어오지 못하는게 아니라 XML 파일을 불러오는데 문제가 발생한 에러입니다.

      OpenCV 소스코드에 포함되어 있던 파일을 사용하신거 같은데

      에러는 XML 파일을 다운로드 받지 않고 드래그앤 복사해서 사용할 경우 발생하던 에러라서 이상하군요..

  18. 서현주 2018.12.02 12:15 신고

    하아.. 답변감사드립니다.
    처음 올린 소스의 오류를 해결하는 것 보다.
    두번째로 올린 소스를 처음 올린 소스와 비슷하게 만드는게 더 빠를 것 같네요. ㅠㅠ 왜 에러가 날까요?

  19. 서현주 2018.12.02 12:35 신고

    2번째 소스의 xml 경로와 같은 파일을 사용하여 얼굴인식 까지는 해결 되었습니다.
    하지만 eye,xml 같은경우는 경로가 잡히지 않네요. 이 둘의 차이는

    1번째 소스의 같은 경우 github 에서 다운받아
    haarcascade_frontalface_default.xml
    haarcascade_eye.xml
    /usr/local/share/opencv4/haarcascades/ 폴더에 넣었는데 문제가 되는 행동인가요?

    2번째 소스의 같은 경우 그냥 기존에 있던 파일을 사용했고.
    haarcascade_frontalface_alt.xml

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.12.02 12:40 신고

      크롬에서 github에서 다운로드 받은 파일을 선택한 다음 RAW를 클릭하고 Ctrl + S를 눌러서 저장해야 합니다.

      또는 RAW 클릭 후..
      해당 주소를 복사하여 라즈베리파이에서 다음처럼 다운로드 해도 됩니다.

      wget https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_eye.xml

  20. 서현주 2018.12.02 12:51 신고

    와~...
    해결되었습니다. 감사합니다.
    제가 그냥 우클릭 마우링크 저장을 했는데.
    저장하는 방식에 문제가 있었군요. 친절한 답변 감사드립니다.

  21. 안정모 2018.12.03 21:59 신고

    안녕하세요 블로그에 잘 참고하면서 열일하고 있습니다 항상 감사합니다

    그런데 예전까지는 잘 깔았는데, opencv를 올려주신 순서대로 다 설치하고 오류없이 진행했는데

    pkg-config --modversion opencv로 opencv버전을 확인하면 안깔려있는 상태처럼 똑같이 뜹니다...

    그래서 어쩔수 없이 sudo apt-get install libopencv-dev로 2.7버전의 opencv를 사용하고 있는데요...

    블로그 순서대로 잘 따라갔는데도 왜 opencv 의 라이브러리가 설치가 안되어 있을까요??(이부분은 직접 라즈베리파이 내부의 폴더에서 opencv 파일을 일일이 찾아본결과)

    도움좀 부탁드립니다....

    • Favicon of https://webnautes.tistory.com webnautes webnautes 2018.12.03 22:04 신고

      OpenCV 4.0.0에선 pkg-config를 지원하지 않기때문 입니다.

      설치는 완료된 상태가 맞습니다.

      그리고 코드를 컴파일시 cmake를 사용해야합니다.

+ Recent posts

티스토리 툴바