- Today
- Total
엔지니어스 - Engineeus
[Ubuntu] Python 2, Python 3에 OpenCV 설치하기 (Binding) 본문
[Ubuntu] Python 2, Python 3에 OpenCV 설치하기 (Binding)
Engineeus 2020. 1. 28. 19:05start()
{
본 포스트에서는 Python 2와 Python 3에 같은 OpenCV를 묶어주는 설명을 다루겠습니다.
Python 2와 Python 3을 각각 설치 하게 되면 OpenCV도 둘다 환경설정을 해 줘야 합니다.
Installation
Build 전 필요한 파일들 설치 하기.
1. OpenCV를 컴파일하는데 사용하는 것들이 포함된 패키지들을 설치합니다.
build-essential 패키지에는 C/C++ 컴파일러와 관련 라이브러리, make 같은 도구들이 포함되어 있습니다.
cmake는 컴파일 옵션이나 빌드된 라이브러리에 포함시킬 OpenCV 모듈 설정등을 위해 필요합니다.
sudo apt-get install build-essential cmake
2. pkg-config는 프로그램 컴파일 및 링크시 필요한 라이브러리에 대한 정보를 메타파일(확장자가 .pc 인 파일)로부터 가져오는데 사용됩니다.
터미널에서 특정 라이브러리를 사용한 소스코드를 컴파일시 필요한 컴파일러 및 링커 플래그를 추가하는데 도움이 됩니다.
sudo apt-get install pkg-config
3. 특정 포맷의 이미지 파일을 불러오거나 기록하기 위해 필요한 패키지들입니다.
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev libjpeg8-dev
4. 특정 코덱의 비디오 파일을 읽어오거나 기록하기 위해 필요한 패키지들입니다.
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev
5. Video4Linux 패키지는 리눅스에서 실시간 비디오 캡처를 지원하기 위한 디바이스 드라이버와 API를 포함하고 있습니다.
sudo apt-get install libv4l-dev v4l-utils
6. 기본 OpenCV 세팅보다 더 많은 GUI 기능이 있는 GTK 라이브러리 입니다.
sudo apt-get install libgtk-3-dev
7. OpenCV의 계산 최적화 라이브러리 입니다.
sudo apt-get install libatlas-base-dev gfortran
8. GStreamer는 비디오 스트리밍을 위한 라이브러리입니다.
sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
9. OpenCV에서는 highgui 모듈을 사용하여 자체적으로 윈도우 생성하여 이미지나 비디오들을 보여줄 수 있습니다.
윈도우 생성 등의 GUI를 위해 gtk 또는 qt를 선택해서 사용가능합니다.
여기서는 qt4를 지정해주었습니다. QImage와 Mat 간의 변환에는 영향을 주지 않습니다.
sudo apt-get install libqt4-dev
그외 선택 가능한 패키지는 다음과 같습니다.
libgtk2.0-dev
libgtk-3-dev
libqt5-dev
10. OpenGL 지원하기 위해 필요한 라이브러리입니다.
sudo apt-get install mesa-utils libgl1-mesa-dri libqt4-opengl-dev
11. python2.7-dev와 python3.6-dev 패키지는 OpenCV-Python 바인딩을 위해 필요한 패키지들입니다. Numpy는 매트릭스 연산등을 빠르게 처리할 수 있어서 OpenCV에서 사용됩니다.
sudo apt-get install python2.7-dev python3.5-dev python-numpy python3-numpy
sudo apt-get install python2.7 python3.5 python-numpy python3-numpy
※ 위에 패키지들을 설치 하다가 symbolic linc 문제 발생 시
cd /usr/local/cuda-8.0/lib64
sudo ln -sf [문제 발생 파일.x] [문제 발생 파일]
이해가 안간다면 아래 예시 입니다.
cd /usr/local/cuda-8.0/lib64
sudo ln -sf /usr/local/cuda-8.0/targets/x86_64-linux/lib/libcudnn.so.7.0.5 /usr/local/cuda-9.0/targets/x86_64-linux/lib/libcudnn.so.7
폴더 구성
1. opencv 폴더 생성
opencv 파일들을 다운로드 받고, 빌드를 실행 하기 위한 작업 공간으로 갑니다. 그 후에 opencv 폴더를 생성 합니다.
mkdir opencv
cd opecv
2. opencv 라이브러리를 다운 받습니다.
wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.0.zip
unzip opencv.zip
3. opencv_contrib(extra modules) 소스코드를 다운로드 받아 압축을 풀어줍니다.
SIFT, SURF 등을 사용하기 위해 필요합니다.
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/3.4.0.zip
unzip opencv_contrib.zip
다음처럼 두 개의 디렉토리가 생성됩니다.
opencv-3.4.0/ opencv_contrib-3.4.0/ |
4. opencv-3.4.0 디렉토리로 이동하여 build 디렉토리를 생성하고 build 디렉토리로 이동합니다.
컴파일은 build 디렉토리에서 이루어집니다.
cd opencv-3.4.0
mkdir build
cd build
Build
1. 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 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 \
../
다음과 같은 메시지가 보이면 정상적으로 된 것입니다.
-- Configuring done |
cmake 실행 결과 중 아래를 확인 해야 합니다.
-- Python 2: -- Interpreter: /usr/bin/python2.7 (ver 2.7.12) -- Libraries: /usr/lib/x86_64-linux-gnu/libpython2.7.so (ver 2.7.12) -- numpy: /home/kmg/.local/lib/python2.7/site-packages/numpy/core/include (ver 1.15.1) -- packages path: lib/python2.7/dist-packages -- -- Python 3: -- Interpreter: /usr/bin/python3 (ver 3.5.2) -- Libraries: /usr/lib/x86_64-linux-gnu/libpython3.5m.so (ver 3.5.2) -- numpy: /usr/local/lib/python3.5/dist-packages/numpy/core/include (ver 1.15.2) -- packages path: lib/python3.5/dist-packages -- -- Python (for build): /usr/bin/python2.7 |
위와 같이 Python 2와 Python 3이 같이 보여지게 됩니다. 안보인다면 아래와 같이 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 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/x86_64-linux-gnu/libpython2.7.so \
-D PYTHON3_INCLUDE_DIR=/usr/include/python3.5 \
-D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include/ \
-D PYTHON3_PACKAGES_PATH=/usr/lib/python3/dist-packages \
-D PYTHON3_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so \
../
2. 컴파일을 시작하기 전에 사용 중인 컴퓨터의 CPU 코어수를 확인합니다.
cat /proc/cpuinfo | grep processor | wc -l
위 글자 중 '|'는 키보드에서 엔터 위에 있는 글자이며, 맨 마지막은 영문자 'l(엘)' 입니다.
저는 cpu 코어수가 8로 나오니 아래와 같이 8개를 사용하여 더 빠르게 컴파일을 합니다.
3. make 명령을 사용하여 컴파일을 시작합니다.
-j 다음에 위에서 확인한 숫자를 붙여서 실행해줍니다.
make -j8
4. 컴파일 결과물을 설치합니다.
sudo make install
5. /etc/ld.so.conf.d/ 디렉토리에 /usr/local/lib를 포함하는 설정파일이 있는지 확인합니다.
cat /etc/ld.so.conf.d/*
/usr/lib/x86_64-linux-gnu/libfakeroot |
※ /usr/local/lib이 출력되지 않았다면 다음 명령을 추가로 실행해야합니다.
sudo sh -c 'echo '/usr/local/lib' > /etc/ld.so.conf.d/opencv.conf'
/usr/local/lib을 찾은 경우나 못찾아서 추가한 작업을 한 경우 모두 컴파일시 opencv 라이브러리를 찾을 수 있도록 다음 명령을 실행합니다.
sudo ldconfig
6. OpenCV 설치 결과 확인
C/C++를 위해 OpenCV 라이브러리 사용가능 여부를 확인합니다.
문제 없으면 설치된 OpenCV 라이브러리의 버전이 출력됩니다.
pkg-config --modversion opencv
아래처럼 버전이 나오면 성공
3.4.0 |
※ 아래처럼 opencv를 찾을 수 없다고 나오면 추가 작업이 필요합니다.
Package opencv was not found in the pkg-config search path. |
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'
sudo sh -c 'echo export PKG_CONFIG_PATH >> /etc/bash.bashrc'
로그아웃했다가 로그인하면 적용이됩니다.
다시 확인했을 때, OpenCV 버전이 출력되야 합니다.
pkg-config --modversion opencv
3.4.0 |
※ 문제가 생기면
sudo make install export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
※ ROS랑 충돌나면
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type
위와 같은 문제가 발생 합니다. 구글링을 통해 아래 블로그로 해결 했습니다.
http://e3jake.tistory.com/38
결론적으로 아래처럼 구성 하면 됩니다.
cd /usr/local/lib/python3.5/dist-packages
sudo mv /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so.old
ls -al /opt/ros/kinetic/lib/python2.7/dist-packages
sudo ln -s `pwd`/cv2.cpython-35m-x86_64-linux-gnu.so `pwd`/cv2.so
ls -al
※ 넘파이 문제생기면
sudo apt-get install python3-pip
python3 -m pip install numpy
※ apt 임포트 문제시
sudo apt-get remove python3-apt
and then reinstalled the package using
sudo apt-get install python3-apt
※ tk 문제시
sudo apt-get install python3-tk
7. 설치 확인
pkg-config --libs --cflags opencv 명령을 실행했을 때 다음처럼 나오면 문제 없이 설치가 완료된 것입니다.
8. 예제 코드 실행 (건너 뛰어도 됨)
/usr/local/share/OpenCV/samples/ 경로에 OpenCV 예제코드들이 설치됩니다.
예제 코드를 하나 가져와서 컴파일 해보겠습니다.
cp /usr/local/share/OpenCV/samples/cpp/facedetect.cpp ./
컴파일 후, 실행시켜 봅니다.
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
다음처럼 검출시간이 표시되면서 카메라 영상에 얼굴이 검출된 결과를 얻을 수 있습니다.
※본인은 안되서 그냥 넘어갔습니다. 넘어가도 문제 될건 없습니다.
Python과 연동 확인
python 2.x와 python 3x에서 opencv 라이브러리를 사용가능한지는 다음처럼 확인합니다.
각각 OpenCV 버전이 출력되어야 합니다.
1. Python 2 확인
python
아래와 같이 빨간색이 잘 동작 해야 합니다.
Python 2.7.12 (default, Oct 8 2019, 14:14:10) |
예제코드 실행
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
다음처럼 터미널에 표시되면서 카메라 영상에 얼굴이 검출된 결과를 얻을 수 있습니다.
2. Python 3 확인
python3
Python 3.5.2 (default, Oct 8 2019, 13:06:37) |
예제 코드를 실행해봅니다.
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
끝~
References
1. https://pythoncv.com/install-opencv-3-3-and-python2-7-3-5-bindings-on-ubuntu-16-04/
2. http://webnautes.tistory.com/1030
3. https://www.pytorials.com/how-to-install-opencv340-on-ubuntu1604/
4. https://e3jake.tistory.com/38
return 0;
}
'Autonomous Tech. > Installation' 카테고리의 다른 글
[Windows] Jupyter Notebook 설치 및 사용 (0) | 2020.03.08 |
---|---|
[Windows] 텐서플로우(TensorFlow) 1.15.2 버전 설치 (2) | 2020.03.08 |
[Ubuntu] Python 2, Python3 설치 (0) | 2020.01.28 |
[Ubuntu] pip으로 PyTorch 설치하기 - Linux (0) | 2020.01.28 |
[Windows] 가상머신(Virtual Box)에 우분투 16.04 설치 (0) | 2020.01.24 |