Mac환경에서 Opencv 3.x 를 python3에서 동작하도록 직접 빌드하기

tips
vision
python

#1

OpenCV의 특정 버전을 특정 Python에 Binding 되도록, 컴파일하는 과정은 종종 잘 안되는 부분 중 하나입니다. 꼭 Mac 뿐만이 아니더라도, OpenCV 특정 버전을 특정 Python(예를 들면 Python 3.6)의 라이브러리로 빌드하는 방법을 소개합니다.

Dependencies

주로 필요하다고 판단되는 dependency를 넣어뒀습니다. 경우에 따라 달라질 수 있는 부분입니다만 일반적으로 아래와 같은 수준이면 기본적인 opencv의 기능을 사용할 수 있습니다.

Ubuntu

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install build-essential cmake pkg-config
$ sudo apt-get install libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt-get install libxvidcore-dev libx264-dev
$ sudo apt-get install libgtk-3-dev
$ sudo apt-get install python3.5-dev

Mac

homebrew가 설치되어 있는 환경으로 가정합니다.

$ brew install cmake

Download & Unpack

OpenCV Releases 에서 원하는 버전의 Source를 다운받습니다. 예를 들어 글 작성 기준으로 최신 버전인 3.3.1을 다운받아 압축을 풉니다.

$ wget https://github.com/opencv/opencv/archive/3.3.1.zip
$ unzip 3.3.1.zip

Build

cmake를 이용해서 빌드하기 전에, 몇가지 알아야될 경로가 있습니다. 주로 Python과 관련된 경로입니다. 여기에서는 python 스크립트를 이용해서 몇가지 경로들을 지정해 빌드가 성공적으로 이루어질 수 있도록 도와드리려고 합니다.

1가지 경로만 따로 파악해야하는데,

$ python3 -c "from sysconfig import get_path; print(get_path('stdlib'))"

/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6

위와 같은 경로를 얻은 후 마지막 lib 이후를 변경해야 합니다.

/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/libpython3.6m.dylib

python 버전과 os 종류에 따라 마지막 파일 명이 libpython?.?m.dylib 혹은 libpython?.?m.so 와 같은 형태로 있으니 파일 경로를 확인하여 넣어주면 됩니다. 이렇게 얻은 경로는 아래의 cmake 스크립트에 PYTHON3_LIBRARY 에 넣어주면 됩니다.

$ cd opencv-3.1.0-head
$ mkdir build
$ mkdir release
$ cd build

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=../release/ \
    -D PYTHON_DEFAULT_EXECUTABLE=$(which python3) \
    -D PYTHON3_EXECUTABLE=$(which python3) \
    -D PYTHON3_PACKAGES_PATH=$(python3 -c "import site; print(site.getsitepackages()[0])") \
    -D PYTHON3_NUMPY_INCLUDE_DIRS=$(python3 -c "import numpy, os; print(os.path.join(numpy.__path__[0], 'core/include'))") \
    -D PYTHON3_LIBRARY=... \
    -D PYTHON3_INCLUDE_DIR=$(python3 -c "from sysconfig import get_path; print(get_path('include'))") \
    -D INSTALL_C_EXAMPLES=OFF \
    -D INSTALL_PYTHON_EXAMPLES=OFF \
    -D BUILD_EXAMPLES=OFF \
    -D BUILD_opencv_python3=ON \
    -D WITH_CUDA=OFF \
    -DWITH_QUICKTIME=OFF -DWITH_GSTREAMER=OFF -DWITH_FFMPEG=OFF \
    ..

$ make -j4
$ make install

cmake 결과 창에서 python3를 위해 build되는지 잘 확인하고, 빌드하면 됩니다.

간혹, 위 cmake 커맨드에서 경로를 직접 지정해주지 않아도 되는 경우가 있으니, PYTHON_DEFAULT_EXECUTABLE 만 지정한 뒤 시도해보는 것도 좋습니다.

Verification

아래와 같이 파이썬에서 잘 import 되는지 확인하면 됩니다.

$ python3
Python 3.6.1 (default, Apr  4 2017, 09:40:21)
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.3.0'
>>> cv2.__path__
['/usr/local/lib/python3.6/site-packages/cv2']
>>>

#2

python3 가 설치된 ubuntu에서는 아래와 같이 설치할 수 있음.

apt install -yq build-essential cmake pkg-config
apt install -yq libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev
apt install -yq libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
apt install -yq libxvidcore-dev libx264-dev libgtk-3-dev

cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D PYTHON_DEFAULT_EXECUTABLE=$(which python3) \
    -D PYTHON3_EXECUTABLE=$(which python3) \
    -D PYTHON3_PACKAGES_PATH=$(python3 -c "import site; print(site.getsitepackages()[0])") \
    -D PYTHON3_NUMPY_INCLUDE_DIRS=$(python3 -c "import numpy, os; print(os.path.join(numpy.__path__[0], 'core/include'))") \
    -D PYTHON3_INCLUDE_DIR=$(python3 -c "from sysconfig import get_path; print(get_path('include'))") \
    -D INSTALL_C_EXAMPLES=OFF \
    -D INSTALL_PYTHON_EXAMPLES=OFF \
    -D BUILD_EXAMPLES=OFF \
    -D BUILD_opencv_python3=ON \
    -D WITH_CUDA=OFF \
    -DWITH_QUICKTIME=OFF -DWITH_GSTREAMER=OFF -DWITH_FFMPEG=OFF \
    ..
    
make -j32
make install