출처: http://webnautes.tistory.com/916
OpenCV 3.4.1과 opencv_contrib(extra modules)를 컴파일하여 Raspberry Pi 3에 설치하는 방법을 다룹니다.
2018년 4월 18일에 릴리즈된 Raspbian 이미지를 사용했습니다.
OpenCV를 컴파일하기 위해서는 최소 16G Micro SD 카드를 사용해야 합니다.
제가 라즈비안 초기 이미지부터 진행해서 검증하기 때문에 상황이 다른 경우에는 모두 대처하기가 힘든 점을 감안해주세요.
1. OpenCV 2.4 버전 제거
2. 기존 설치된 패키지 업그레이드
3. OpenCV 컴파일 전 필요한 패키지 설치
4. OpenCV 설정과 컴파일 및 설치
5. OpenCV 설치 결과 확인
5.1. C/C++
5.2. Python
관련 포스팅 Raspberry Pi 3 사용하는 방법(마이크로 SD 카드에 라즈비안 라이팅, ssh 설정 및 접속방법, raspi-config 설정 방법) http://webnautes.tistory.com/899 마이크로 SD 카드에 라즈비안(RASPBIAN) 이미지 파일을 라이팅(writing)하고 SSH 접속을 위해 필요한 작업과 사용하기 전에 꼭 해줘야 하는 설정을 다룹니다. |
최종 업데이트 2018. 6. 25
1. OpenCV 2.4 버전 제거
1-1. OpenCV 2.4대 버전이 설치되어 있으면 새로 설치하는 OpenCV 3.4 버전이 제대로 동작하지 않기 때문에 제거해주어야 합니다.
1-2. 아래처럼 보이면 OpenCV 2.4대 버전이 설치안되어 있는 상태입니다.
다음 단계로 넘어가도 됩니다.
pi@raspberrypi:~ $ pkg-config --modversion opencv |
OpenCV 2.4대 버전이 설치되어 있는 경우에는 OpenCV 2.4 버전이 출력됩니다.
pi@raspberrypi:~ $ pkg-config --modversion opencv |
다음 명령으로 OpenCV 라이브러리 설정 파일을 포함해서 기존에 설치된 OpenCV 패키지를 삭제하고 진행해야 합니다.
pi@raspberrypi:~ $ sudo apt-get purge libopencv* python-opencv |
2. 기존 설치된 패키지 업그레이드
2-1. OpenCV 3.4.1을 설치해주기 전에 기존에 설치된 패키지들을 업그레이드 해주기 위한 작업입니다.
오래 걸리더라도 해주는 것이 좋습니다.
2-2. Raspbian 저장소(repository)로부터 패키지 리스트를 업데이트합니다.
기존에 설치된 패키지들의 새로운 버전이 저장소에 있다면 리스트를 업데이트 하기위해 실행합니다.
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. pkg-config는 프로그램 컴파일 및 링크시 필요한 라이브러리에 대한 정보를 메타파일(확장자가 .pc 인 파일)로부터 가져오는데 사용됩니다.
터미널에서 특정 라이브러리를 사용한 소스코드를 컴파일시 필요한 컴파일러 및 링커 플래그를 추가하는데 도움이 됩니다.
$ sudo apt-get install pkg-config |
3-4. 특정 포맷의 이미지 파일을 불러오거나 기록하기 위해 필요한 패키지들입니다.
$ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev |
3-5. 특정 코덱의 비디오 파일을 읽어오거나 기록하기 위해 필요한 패키지들입니다.
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev |
3-6. Video4Linux 패키지는 리눅스에서 실시간 비디오 캡처를 지원하기 위한 디바이스 드라이버와 API를 포함하고 있습니다.
$ sudo apt-get install libv4l-dev v4l-utils |
3-7. GStreamer는 비디오 스트리밍을 위한 라이브러리입니다.
$ sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev |
3-8. OpenCV에서는 highgui 모듈을 사용하여 자체적으로 윈도우 생성하여 이미지나 비디오들을 보여줄 수 있습니다.
윈도우 생성 등의 GUI를 위해 gtk 또는 qt를 선택해서 사용가능합니다. 여기서는 gtk2를 지정해주었습니다.
$ sudo apt-get install libgtk2.0-dev |
그외 선택 가능한 패키지는 다음과 같습니다.
libgtk-3-dev
libqt4-dev
libqt5-dev
3-9. OpenGL 지원하기 위해 필요한 라이브러리입니다.
$ sudo apt-get install mesa-utils libgl1-mesa-dri libgtkgl2.0-dev libgtkglext1-dev |
3-10. OpenCV 최적화를 위해 사용되는 라이브러리들입니다.
$ sudo apt-get install libatlas-base-dev gfortran libeigen3-dev |
3-11. python2.7-dev와 python3-dev 패키지는 OpenCV-Python 바인딩을 위해 필요한 패키지들입니다.
Numpy는 매트릭스 연산등을 빠르게 처리할 수 있어서 OpenCV에서 사용됩니다.
$ sudo apt-get install python2.7-dev python3-dev python-numpy python3-numpy |
4. OpenCV 설정과 컴파일 및 설치
소스 코드를 저장할 임시 디렉토리를 생성하여 이동 후.. 진행합니다
pi@raspberrypi:~ $ mkdir opencv |
OpenCV 3.4.1 소스코드를 다운로드 받아 압축을 풀어줍니다.
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.1.zip |
opencv_contrib(extra modules) 소스코드를 다운로드 받아 압축을 풀어줍니다.
SIFT, SURF 등을 사용하기 위해 필요합니다.
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/3.4.1.zip |
다음처럼 두 개의 디렉토리가 생성됩니다.
pi@raspberrypi:~/opencv $ ls -d */ opencv-3.4.1 opencv_contrib-3.4.1 |
opencv-3.4.1 디렉토리로 이동하여 build 디렉토리를 생성하고 build 디렉토리로 이동합니다.
컴파일은 build 디렉토리에서 이루어집니다.
pi@raspberrypi:~/opencv $ cd opencv-3.4.1 pi@raspberrypi:~/opencv/opencv-3.4.1 $ mkdir build pi@raspberrypi:~/opencv/opencv-3.4.1 $ cd build pi@raspberrypi:~/opencv/opencv-3.4.1/build $ |
cmake를 사용하여 OpenCV 컴파일 설정을 해줍니다. 복사해서 터미널에 붙여넣기 해주면 됩니다.
cmake -D CMAKE_BUILD_TYPE=RELEASE \ |
다음 처럼 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 |
설정한 결과입니다.
-- General configuration for OpenCV 3.4.1 ===================================== |
다음처럼 Python 2 또는 Python 3 라이브러리 항목이 보이지 않는 경우에는
-- Python 2: |
다음 붉은색 줄처럼 해당 경로들을 직접 적어줘야 합니다.
$ 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=ON \ -D WITH_OPENGL=ON \ -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.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 변수값을 1024로 수정합니다.
# set size to absolute value, leaving empty (default) then uses computed value |
스왑 서비스 재시작하여 변경된 설정을 반영시켜주면 스왑 크기가 대략 10배가 됩니다.
pi@raspberrypi:~/opencv/opencv-3.4.1/build $ free |
이제 make 명령을 사용하여 컴파일을 시작합니다.
pi@raspberrypi:~/opencv/opencv-3.4.1/build $ make -j4 |
이제 컴파일 결과를 설치합니다.
pi@raspberrypi:~/opencv/opencv-3.4.1/build $ sudo make install |
샘플 코드들은 /usr/local/share/OpenCV/samples/ 위치에 복사됩니다.
/etc/ld.so.conf.d/ 디렉토리에 /usr/local/lib를 포함하는 설정파일이 있는지 확인합니다.
pi@raspberrypi:~/opencv/opencv-3.4.1/build $ cat /etc/ld.so.conf.d/* |
/usr/local/lib이 출력되지 않았다면 다음 명령을 수행합니다.
pi@raspberrypi:~/opencv/opencv-3.4.1/build $ sudo sh -c 'echo '/usr/local/lib' > /etc/ld.so.conf.d/opencv.conf' |
/usr/local/lib을 찾은 경우나 못찾아서 추가한 작업을 한 경우 모두 컴파일시 opencv 라이브러리를 찾을 수 있도록 다음 명령을 실행합니다.
pi@raspberrypi:~/opencv/opencv-3.4.1/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 |
스왑 서비스 재시작하여 변경된 설정을 반영시켜주면 스왑 크기가 원래대로 돌아옵니다.
pi@raspberrypi:~/opencv/opencv-3.4.1/build $ sudo /etc/init.d/dphys-swapfile restart |
pi@raspberrypi:~/opencv/opencv-3.4.1/build $ free |
5. OpenCV 설치 결과 확인
5.1. C/C++
C/C++를 위해 OpenCV 라이브러리 사용가능 여부를 확인합니다.
문제 없으면 설치된 OpenCV 라이브러리의 버전이 출력됩니다.
pi@raspberrypi:~/opencv/opencv-3.4.1/build $ pkg-config --modversion opencv |
아래처럼 opencv를 찾을 수 없다고 나오면 추가 작업이 필요합니다.
pi@raspberrypi:~/opencv/opencv-3.4.1/build $ pkg-config --modversion opencv |
pkg-config 명령이 /usr/local/lib/pkgconfig 경로에 있는 opencv.pc 파일을 찾을 수 있도록 해줘야 합니다.
$ sudo sh -c 'echo PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig >> /etc/bash.bashrc' |
로그아웃했다가 로그인하면 적용이됩니다.
다시 확인했을 때, OpenCV 버전이 나와야 합니다.
pi@raspberrypi:~/opencv/opencv-3.4.1/build $ pkg-config --modversion opencv |
pkg-config --libs --cflags opencv 명령을 실행했을 때 다음처럼 나오면 문제없이 설치가 완료된 것입니다.
pi@raspberrypi:~/opencv/opencv-3.4.1/build $ pkg-config --libs --cflags opencv |
.
예제 코드를 하나 가져와서 컴파일 해보겠습니다.
$ cp /usr/local/share/OpenCV/samples/cpp/facedetect.cpp ./ |
테스트를 하기 위해 필요한 웹캠 또는 Raspberry Pi Camera(pi camera)를 Raspberry Pi에 먼저 연결합니다.
대부분의 웹캠은 연결후 dmesg | tail 명령어로 해당 웹캠을 확인시 다음처럼 문제 없이 인식이 됩니다.
인식이 안되면 해당 웹캠을 위한 디바이스 드라이버를 설치해줘야 합니다.
/dev/video0 디바이스 파일이 생성되었는지 확인해봅니다.
파이 카메라의 경우에는 아래 포스팅을 참고하세요.
Raspberry Pi Camera Module( pi camera )를 위해 /dev/video0 생성하는 방법
http://webnautes.tistory.com/1192
이제 컴파일 후, 실행시켜 봅니다.
$ g++ -o facedetect facedetect.cpp $(pkg-config --libs --cflags opencv) $ ./facedetect --cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" --nested-cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_eye_tree_eyeglasses.xml " --scale=1.3 |
터미널 프로그램으로 MobaXterm을 사용하면 SSH 접속 후, 바로 실행 결과를 확인 가능합니다.
(일종의 VNC처럼 동작해서 속도는 느립니다..)
https://mobaxterm.mobatek.net/
검출시간이 표시되면서 카메라 영상에 얼굴이 검출된 결과를 얻을 수 있습니다.
pi@raspberrypi:~/opencv/opencv-3.4.1/build $ ./facedetect --cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" --nested-cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_eye_tree_eyeglasses.xml " --scale=1.3 |
5.2. Python
python 2.x와 python 3x에서 opencv 라이브러리를 사용가능한지는 다음처럼 확인합니다.
각각 OpenCV 버전이 출력되어야 합니다.
pi@raspberrypi:~/opencv/opencv-3.4.0/build $ python
|
예제 코드를 실행해봅니다.
$ 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 $ python3 /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 |
카메라 영상에 얼굴이 검출된 결과를 얻을 수 있습니다.
pi@raspberrypi:~/opencv/opencv-3.4.0/build $ 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 |
이제 필요 없어진 컴파일에 사용했던 opencv 소스코드 디렉토리를 삭제합니다.
pi@raspberrypi:~/opencv/opencv-3.4.1/build $ cd |
'언어 > 라즈베리파이' 카테고리의 다른 글
리눅스에서 폰트설치 (0) | 2018.09.01 |
---|---|
hx711 (0) | 2018.08.30 |
라즈베리파이에 여러개의 시리얼 포트가 필요할 때 (0) | 2018.08.27 |
시리얼통신 관련 TLazSerial (0) | 2018.08.27 |
usb to serial converter (0) | 2018.08.27 |