3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MacOSCatalina+Python3.7.x+OpenCV4.1.x+wxPython4.0.x+USBWebcamの環境構築例

Last updated at Posted at 2019-10-26

# 無 保 証 で す
当方執筆の技術情報に関するライセンス、免責事項、禁止事項

#総合もくじ
Python3.7.x+OpenCV4.1.x+wxPython4.0.x+USBWebcamのクロスプラットフォームな環境構築事例集

想定する運用スタイル

  • OpenCV を利用する GUI アプリケーションを wxPython により構築する。
  • Webcam を USB 接続し OpenCV から利用する。
  • Python 向けパッケージは pip + venv で管理する。
  • 異なるプラットフォームにおける作業手順を出来るだけ統一化する。1

※ インストール済みの Python パッケージ全てのアップグレードについては以下を参照下さい。
How to upgrade all Python packages with pip? - Stack Overflow

環境構築スクリプト記述例

MacOS 向け環境構築スクリプト
#!/bin/sh
# variables
VENV_DIR="$HOME/testenv"

# activate Python3's virtual environment
test -d $VENV_DIR || mkdir $VENV_DIR
cd $VENV_DIR || exit 1
test -d $VENV_DIR/py3env || python3 -m venv ./py3env
. ./py3env/bin/activate || exit 2
pip install --upgrade pip setuptools || exit 3

# install opencv-python and wxPython
pip install opencv-python wxPython || exit 4

# deactivate python3's virtual environment
deactivate || exit 5
cd || exit 6
exit 0

※ 終了ステータスの使い方が少し変則的かもしれません。

※ Catalina 付属 Python3.7.3 の venv モジュールで pip が使えました。

事前準備:Xcode / Xcode Command Line Tools の導入

https://developer.apple.com/jp/xcode/
https://apps.apple.com/jp/app/xcode/

※ Xcode Command Line Tools の導入は、ターミナルからは xcode-select --install で。
※ Homebrew をインストールする場合、Command Line Tools 未導入であれば自動でインストールされるはず。

参考とした文献

参考とした文献

XcodeとHomebrewについて - しゃちの備忘録
http://teru0rc4.hatenablog.com/entry/2017/01/08/215633

xcode-select --installに失敗した - yn2011's blog
http://pokuwagata.hatenablog.com/entry/2018/11/04/210256

Technical Note TN2339: Building from the Command Line with Xcode FAQ
https://developer.apple.com/library/archive/technotes/tn2339/_index.html

Xcode - Wikipedia
https://ja.wikipedia.org/wiki/Xcode

事前準備:パッケージマネジメントシステムの導入

※ 本稿では Homebrew の使用を想定しています。「cask」による MacOS 向けアプリの管理が便利です。

※ MacPorts を導入すると BSD ライクな使い勝手を得られます。こちらは FreeBSD の Ports や Gentoo の Portage, Arch の AUR, Slackware の SlackBuilds のようなビルドスクリプトによるソフトウェア管理に慣れた人向け。なお Homebrew でも、brew create でビルドスクリプトやパッケージの自作が可能であるようです。

※ 管理の破綻を防ぐために、複数のパッケージマネジメントシステムの併用はおすすめしません。

Homebrew

MacPorts

参考とした文献

参考とした文献

【Tips】HomebrewとMacPortsを共存させる方法 | ソフトアンテナブログ
https://www.softantenna.com/wp/tips/homebrew-macports-coexists/

Homebrew (パッケージ管理システム) - Wikipedia
https://ja.wikipedia.org/wiki/Homebrew_(パッケージ管理システム)

MacPorts - Wikipedia
https://ja.wikipedia.org/wiki/MacPorts

事前準備:brew 及びパッケージの更新

brew update # brew 自身の更新
brew upgrade # /usr/local 以下にインストールしたソフトウェアの更新
brew cask upgrade # cask でインストールしたソフトウェアの更新

参考とした文献

参考とした文献

brew のマニュアルページ
https://docs.brew.sh/Manpage

brew cask のヘルプ
$ brew cask
Homebrew Cask provides a friendly CLI workflow for the administration
of macOS applications distributed as binaries.

Commands:

    --cache    display the file used to cache the Cask
    audit      verifies installability of Casks
    cat        dump raw source of the given Cask to the standard output
    create     creates the given Cask and opens it in an editor
    doctor     checks for configuration issues
    edit       edits the given Cask
    fetch      downloads remote application files to local cache
    home       opens the homepage of the given Cask
    info       displays information about the given Cask
    install    installs the given Cask
    list       with no args, lists installed Casks; given installed Casks, lists staged files
    outdated   list the outdated installed Casks
    reinstall  reinstalls the given Cask
    style      checks Cask style using RuboCop
    uninstall  uninstalls the given Cask
    upgrade    upgrades all outdated casks
    zap        zaps all files associated with the given Cask

See also "man brew-cask"

事前準備:cmake の導入

brew cask install cmake

※ Mojave(OSX 10.14) において、wxWidgets ビルド時に -D CMAKE_OSX_DEPLOYMENT_TARGET=10.14 を設定しなかったところ、ビルドに失敗しました。OpenCV の場合は指定せずとも問題なくビルドが通りました。

※ コンパイラとして明示的に clang を指定する場合、CMAKE_<LANG>_COMPILER(-D CMAKE_C_COMPILER="/usr/bin/clang"-D CMAKE_CXX_COMPILER="/usr/bin/clang++")を設定します。システム標準の c/c++ コンパイラの種別は端末エミュレータから cc --versionc++ --version で確認出来ます。

参考とした文献

参考とした文献

macOS Mojaveでlibuiを動かす - Qiita
https://qiita.com/KaiShoya/items/b3a353246478942b7a28

macOS Mojave - Apple
https://www.apple.com/macos/mojave/

CMAKE_OSX_DEPLOYMENT_TARGET — CMake Documentation
https://cmake.org/cmake/help/latest/variable/CMAKE_OSX_DEPLOYMENT_TARGET.html

GCC, the GNU Compiler Collection - GNU Project - Free Software Foundation (FSF)
https://gcc.gnu.org/

Clang C Language Family Frontend for LLVM
https://clang.llvm.org/

CMAKE_<LANG>_COMPILER — CMake Documentation
https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER.html

事前準備:ccache の導入(必要に応じて)

brew install ccache

※ ビルドを繰り返す場合、ccache が役に立ちます。cmake のオプションで明示的に指定する場合は CMAKE_<LANG>_COMPILER_LAUNCHER(-D CMAKE_C_COMPILER_LAUNCHER="/usr/local/bin/ccache"-D CMAKE_CXX_COMPILER_LAUNCHER="/usr/local/bin/ccache")を設定します。

参考とした文献

参考とした文献

c++ - How to Use CCache with CMake? - Stack Overflow
https://stackoverflow.com/questions/1815688/how-to-use-ccache-with-cmake

ccache — Compiler cache
https://ccache.dev/

CMAKE_<LANG>_COMPILER_LAUNCHER — CMake Documentation
https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_LAUNCHER.html

事前準備:Homebrew 版 python3 の導入(必要に応じて)

brew install python

※ python2 を導入する場合のパッケージ名は python@2 です。

※ 手元の環境では Catalina 付属の Python3.7.3 で venv モジュールが使えました。仮想環境内では pip も使用可能です。

事前準備:venv による仮想環境の構築

cd || exit
test -d $HOME/testenv || mkdir $HOME/testenv
cd $HOME/testenv || exit
python3 -m venv ./py3env
. ./py3env/bin/activate
pip install --upgrade pip setuptools
deactivate

※ fish の場合は . ./py3env/bin/activate.fish でアクティベートします。

direnv を用いることで、対象ディレクトリに移動するだけで仮想環境が開始されるよう設定出来るそうです。

BuildWxPythonOnRaspberryPi - wxPyWiki より引用

If your lazy like most programmers. Check out https://direnv.net/ and https://github.com/direnv/direnv/wiki/Python with some fussing the virtenv will load automagically when you enter a directory.

参考とした文献

参考とした文献

仮想環境 - python.jp
https://www.python.jp/install/macos/virtualenv.html

venv --- 仮想環境の作成 — Python 3.7.4 ドキュメント
https://docs.python.org/ja/3/library/venv.html

opencv-python と wxPython の導入:pip を利用する場合

OpenCV 4.1.x のインストール

cd $HOME/testenv || exit
. ./py3env/bin/activate || exit
pip install opencv-python
pip show opencv-python
deactivate
cd || exit

wxPython(4.0.x)のインストール

cd $HOME/testenv || exit
. ./py3env/bin/activate || exit
pip install wxPython
pip show wxPython
deactivate
cd || exit

opencv-python と wxPython の導入:ソースコードからビルド&インストールする場合

※ 手元の環境では Catalina 付属の Python3.7.3 ではビルドした opencv モジュールが上手く動作しなかった為、Brew 版の 3.7.4 を利用しました

OpenCV 4.1.2 のビルド&インストール

OpenCV をソースコードからビルドする利点と問題点と Lena

  • 利点:

  • 最新版を手軽に試すことが出来る。

  • ビルドオプションを細かく指定してのビルド&インストールが可能である。

  • Qt のバージョンが揃うので UI のアイコン表示等が崩れない。
    スクリーンショット 2019-10-26 18.28.12.png

  • 問題点:

    • pip list に現れない。
  • Lena:

  • 画像サンプル「レナ」の正体は… - GIGAZINE

###構築依存のインストール(必要に応じて)

qt5のインストール
brew install qt

※ qt5 をインストールしておくことで、cmake でオプション -D WITH_QT=ON 及び -D WITH_OPENGL=ON が利用可能となります。その際、環境変数 Qt5_DIR で、brew でインストールした qt5 のパスを指定しておく必要があります。

パス指定例(brewのprefixが/usr/localの場合)
export Qt5_DIR=/usr/local/opt/qt5
libdc1394及びffmpeg対応版バイナリをビルドする場合
brew install pkg-config libdc1394 ffmpeg

※ pkg-config をインストールしておかないと cmake の段階で configure プロセスが libdc1394 及び ffmpeg を見つけられませんでした。

※ brew から eigen や vtk をインストールすることで、対応バイナリを生成可能です。

※ Java モジュールを有効化する場合は ant 及び Java が必要です。

※ Catalina で cask 由来の adoptopenjdk の Java を実行する場合にアラートが表示される場合、「システム環境設定>セキュリティとプライバシー」で実行許可を与えます。以下はターミナルで OpenJDK 13 の java コマンドを実行した場合。

cask からの OpenJDK インストール例
caskによるOpenJDKのインストール
brew cask install adoptopenjdk
初回時、ターミナルからJavaコマンドを実行(OpenJDK13の場合)
/Library/Java/JavaVirtualMachines/adoptopenjdk-13.jdk/Contents/Home/bin/java -version

ダイアログウィンドウの「キャンセル」をクリック。

スクリーンショット 2019-10-11 19.06.31.png

システム環境設定>セキュリティとプライバシーで「このまま許可」をクリック。

スクリーンショット 2019-10-11 19.06.40.png

「このまま許可」クリック後ターミナルで再度Javaコマンドを実行
/Library/Java/JavaVirtualMachines/adoptopenjdk-13.jdk/Contents/Home/bin/java -version

ダイアログウィンドウの「開く」をクリック。

スクリーンショット 2019-10-11 19.07.19.png

※ JavaScript モジュールは Emscripten の導入後、Python2.7 から build_js.py を実行することで生成可能でした。ドキュメント 2 によると、Docker を用いても JavaScript モジュールを生成可能であるとのことです。

OpenCV JavaScript モジュールの構築例
Emscriptenのダウンロード&セットアップ
# cmake 及び Java をインストールする
brew cask install cmake adoptopenjdk

# 作業環境を準備する
cd $HOME/testenv || exit

test -d Downloads || mkdir Downloads
cd Downloads || exit

test -d Emscripten && rm -r "Emscripten"
mkdir Emscripten
cd Emscripten || exit

# Get the emsdk repo
git clone https://github.com/emscripten-core/emsdk.git

# Enter that directory
cd emsdk || exit

# Fetch the latest version of the emsdk (not needed the first time you clone)
git pull

# Download and install the latest SDK tools.
./emsdk install latest

# Make the "latest" SDK "active" for the current user. (writes ~/.emscripten file)
./emsdk activate latest

※ 出典:Download and install — Emscripten 1.39.0 documentation

OpenCV4.1.2でのビルド例
export JAVA_HOME="/Library/Java/JavaVirtualMachines/adoptopenjdk-13.jdk/Contents/Home" # Java Virtual Machine を指定する
source $HOME/testenv/Downloads/Emscripten/emsdk/emsdk_env.sh # Activate PATH and other environment variables in the current terminal
export $(cat $EM_CONFIG | grep EMSCRIPTEN_ROOT | sed -e s/EMSCRIPTEN_ROOT/EMSCRIPTEN/ -e s/\ //g -e s/\'//g) # ./emsdk activate latest で指定した EMSCRIPTEN_ROOT の値を EMSCRIPTEN に代入する

OPENCV_VERSION=4.1.2
cd $HOME/testenv/Downloads || exit
curl -LO https://github.com/opencv/opencv/archive/$OPENCV_VERSION.tar.gz
tar zxf $OPENCV_VERSION.tar.gz

cd $HOME/testenv/Downloads/opencv-$OPENCV_VERSION/platforms/js # カレントディレクトリを展開した OpenCV のソースの platforms/js に移動する
python2.7 build_js.py build_js # $HOME/testenv/Downloads/opencv-4.1.2/platforms/js/build_js 以下に JavaScript モジュールを構築する

※ fish の場合は source $HOME/testenv/Downloads/Emscripten/emsdk/emsdk_env.fish 及び export (cat $EM_CONFIG | grep EMSCRIPTEN_ROOT | sed -e s/EMSCRIPTEN_ROOT/EMSCRIPTEN/ -e s/\ //g -e s/\'//g) 等とします。

参考とした文献
Download and install — Emscripten 1.39.0 documentation
https://emscripten.org/docs/getting_started/downloads.html

OpenCV: Build OpenCV.js
https://docs.opencv.org/master/d4/da1/tutorial_js_setup.html

###venv 仮想環境への OpenCV の構築と導入

venv仮想環境へのOpenCV4.1.2の構築
cd $HOME/testenv || exit
. ./py3env/bin/activate || exit # 仮想環境を開始する
OPENCV_VERSION=4.1.2
pip uninstall opencv-python # pipから導入した opencv-python があれば削除しておく
pip install numpy # opencv-python が構築時、及び導入時に依存する numpy をインストールする
test -d Downloads || mkdir Downloads
cd Downloads || exit
curl -LO https://github.com/opencv/opencv/archive/$OPENCV_VERSION.tar.gz # GitHub から OpenCV のソースコードをダウンロードする
tar zxf $OPENCV_VERSION.tar.gz
cd opencv-$OPENCV_VERSION || exit
mkdir build && cd build || exit
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_C_COMPILER="clang" -D CMAKE_CXX_COMPILER="clang++" -D CMAKE_INSTALL_PREFIX=$HOME/testenv/py3env/ ..
make -j$(sysctl -n hw.ncpu)
make install # ホームディレクトリ内、仮想環境内部にインストールするのでスーパーユーザー権限は必要ない
python3 -c "import cv2; print(cv2.__version__)" # 導入した opencv-python のバージョンを確認する
python3 -c "import cv2; print(cv2.getBuildInformation())" # 導入した opencv のビルドオプションを確認する
python3 $HOME/testenv/Downloads/opencv-$OPENCV_VERSION/samples/python/video.py # Webcam からの映像を確認、ESC キーでサンプルプログラムは終了する
unset OPENCV_VERSION
deactivate # 仮想環境を終了する
cd || exit

※ マルチコアCPUなら例えば make -j$(sysctl -n hw.ncpu)-j$(sysctl -n hw.logicalcpu) などとオプションをわたすことで構築時間の短縮が期待出来ます。3 4 5

※ fish の場合、コマンド置換を $() ではなく () で行います。変数の代入に関しても書式の差異があります。

qt5及びOpenGL対応版OpenCVをビルドする場合のcmake実行例
brew install qt
export Qt5_DIR=/usr/local/opt/qt5
cmake -D WITH_QT=ON -D WITH_OPENGL=ON -D CMAKE_BUILD_TYPE=Release -D CMAKE_C_COMPILER="clang" -D CMAKE_CXX_COMPILER="clang++" -D CMAKE_INSTALL_PREFIX=$HOME/testenv/py3env/ ..

※ CMAKE_INSTALL_PREFIX は環境に応じて適宜読み替えて下さい。

###参考とした文献

参考とした文献

OpenCV: Installation in Linux
https://docs.opencv.org/4.1.2/d7/d9f/tutorial_linux_install.html

OpenCVのビルド情報を確認するgetBuildInformation() | note.nkmk.me
https://note.nkmk.me/python-opencv-getbuildinformation/

Python Tips:ワンライナーが書きたい - Life with Python
https://www.lifewithpython.com/2015/01/python-use-command-one-liner.html

wxPython 4.0.6 のビルド&インストール

wxPython をソースコードからビルドする利点と問題点

  • 利点:
  • ビルドオプションを柔軟に指定出来る。
  • 問題点:
  • python3 build.py clean を行う際に誤って python3 build.py cleanall とすると sip 配下のファイルやフォルダが一掃されてしまう。

wxPython の venv 仮想環境への構築と導入

自分の環境では 10.14 Mojave では問題なくビルド出来ていましたが、10.15 Catalina にアップグレードしてからビルドが通りません。

10.15におけるビルドエラー
[855/875] Compiling sip/cpp/sip_webkitwxWebKitBeforeLoadEvent.cpp
../../../sip/cpp/sip_webkitwxWebKitNewWindowEvent.cpp:21:45: error: unknown class name 'wxWebKitNewWindowEvent'; did you mean 'sipwxWebKitNewWindowEvent'?
wxWidgetsのインストール
brew install wxmac
OSX10.14におけるvenv仮想環境へのwxPython4.0.6の構築
cd $HOME/testenv || exit
. ./py3env/bin/activate || exit # 仮想環境を開始する
WXPYTHON_VERSION=4.0.6
pip uninstall wxPython # pipから導入した wxPython があれば削除しておく
test -d Downloads || mkdir Downloads
cd Downloads || exit
pip download wxPython==$WXPYTHON_VERSION --no-deps --no-binary :all: # PyPI から wxPython のソースコードをダウンロードする
tar zxf wxPython-$WXPYTHON_VERSION.tar.gz
cd wxPython-$WXPYTHON_VERSION || exit
pip install -r requirements.txt # 構築時依存及び導入時依存 python パッケージのインストールを行う
python3 build.py build bdist_wheel --release --use_syswx --jobs=$(sysctl -n hw.ncpu) # wxPython のビルドを行う
pip install dist/wxPython-$WXPYTHON_VERSION-*.whl #wxPython のインストールを行う
pip show wxPython # インストールされた wxPython パッケージの情報を表示する
python3 $HOME/testenv/Downloads/wxPython-$WXPYTHON_VERSION/demo/demo.py # wxPython のデモを実行する
unset WXPYTHON_VERSION
deactivate # 仮想環境を終了する
cd || exit

※ 10.14 Mojave の時も wxPython ソース付属の build.py からの wxWidgets のビルドには失敗しており、回避策として brew で wxmac をインストールし、build.py に --use_syswx オプションを渡すことをしていました。

※ マルチコア CPU なら例えば build.py に --jobs=$(sysctl -n hw.ncpu)--jobs=$(sysctl -n hw.logicalcpu) などとオプションをわたすことで構築時間の短縮が期待出来ます。3 4 5

※ fish の場合、コマンド置換を $() ではなく () で行います。変数の代入に関しても書式の差異があります。

参考とした文献

参考とした文献

How to install wxPython - wxPyWiki
https://wiki.wxpython.org/How%20to%20install%20wxPython

BuildWxPythonOnRaspberryPi - wxPyWiki
https://wiki.wxpython.org/BuildWxPythonOnRaspberryPi

Cannot build Phoenix from github master - wxpython-dev@lists.wxwidgets.org
https://wxpython-dev.wxwidgets.narkive.com/Sdn1NNA8/cannot-build-phoenix-from-github-master

おまけ:Catalina への wxWidgets のビルド&インストール

OSX10.15へのwxWidgets3.1.2のビルド&インストール例
cd $HOME/testenv || exit
test -d Downloads || mkdir Downloads
cd Downloads || exit
brew uninstall wxmac
curl -LO https://github.com/wxWidgets/wxWidgets/releases/download/v3.1.2/wxWidgets-3.1.2.tar.bz2 || exit
tar jxf wxWidgets-3.1.2.tar.bz2
cd wxWidgets-3.1.2
mkdir build_osx && cd build_osx
../configure --prefix=/usr/local --with-macosx-version-min=10.15
make -j$(sysctl -n hw.ncpu)
sudo make install

※ 自分の環境では 10.14 Mojave では cmake でビルドが通っていました。10.15 Catalina へアップグレード後、cmake ではビルドがコケるようになってしまいました。

OSX10.14へのwxWidgets3.1.2のビルド&インストール例
cd $HOME/testenv || exit
test -d Downloads || mkdir Downloads
cd Downloads || exit
brew uninstall wxmac
curl -LO https://github.com/wxWidgets/wxWidgets/releases/download/v3.1.2/wxWidgets-3.1.2.tar.bz2 || exit
tar jxf wxWidgets-3.1.2.tar.bz2
cd wxWidgets-3.1.2
mkdir build_osx && cd build_osx
cmake -D CMAKE_BUILD_TYPE=Release  -D CMAKE_OSX_DEPLOYMENT_TARGET="10.14" -D CMAKE_C_COMPILER="clang" -D CMAKE_CXX_COMPILER="clang++" -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j$(sysctl -n hw.ncpu)
sudo make install

おまけ Xcode Command Line Tools のアンインストール

Command Line Tools のみのインストールの場合、/Library/Developer/CommandLineTools ディレクトリを削除するだけで良さそう。

https://developer.apple.com/library/archive/technotes/tn2339/_index.html より引用

How can I uninstall the command-line tools?

  • Xcode includes all of the command-line tools. If it is installed on your system, remove it to uninstall the command-line tools.
  • If the /Library/Developer/CommandLineTools directory exists on your system, remove it to uninstall the command-line tools.

以前は sudo /Library/Developer/Shared/uninstall-devtools --mode=all などとしていたそうな。

How to uninstall "Command Line Tools" in Xcode 4.3? - Apple Community
https://discussions.apple.com/thread/3741223

  1. 構築予定の環境の構成によっては Ansible Homebrew moduleAnsible Homebrew cask module 及び Ansible MacPorts module 等も有用と思われる。

  2. https://docs.opencv.org/master/d4/da1/tutorial_js_setup.html

  3. Mac OS Xには/procが無いのでsysctl使う - $ cat /var/log/shin 2

  4. macos — Mac OS Xで*論理*コアの数を見つける方法は? 2

  5. sysctl(8) - FreeBSD Manual Pages 2

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?