엔지니어스 - Engineeus

[Ubuntu] Python 2, Python 3에 OpenCV 설치하기 (Binding) 본문

Autonomous Tech./Installation

[Ubuntu] Python 2, Python 3에 OpenCV 설치하기 (Binding)

Engineeus 2020. 1. 28. 19:05
728x90

start()

{


본 포스트에서는 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
-- Generating done
-- Build files have been written to: /home/webnautes/opencv/opencv-3.4.0/build

 

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
# libc default configuration
/usr/local/lib

/usr/local/cuda-8.0/lib64

# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/lib/nvidia-384
/usr/lib32/nvidia-384
/usr/lib/nvidia-384
/usr/lib32/nvidia-384
# Legacy biarch compatibility support
/lib32
/usr/lib32

 

※ /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.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found

 

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) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> 

 

예제코드 실행

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) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> 

 

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

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;

}

Comments