# 無 保 証 で す
当方執筆の技術情報に関するライセンス、免責事項、禁止事項
#総合もくじ
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 --version
や c++ --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
-
利点:
-
最新版を手軽に試すことが出来る。
-
ビルドオプションを細かく指定してのビルド&インストールが可能である。
-
問題点:
- pip list に現れない。
-
Lena:
###構築依存のインストール(必要に応じて)
brew install qt
※ qt5 をインストールしておくことで、cmake でオプション -D WITH_QT=ON
及び -D WITH_OPENGL=ON
が利用可能となります。その際、環境変数 Qt5_DIR
で、brew でインストールした qt5 のパスを指定しておく必要があります。
export Qt5_DIR=/usr/local/opt/qt5
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 インストール例
brew cask install adoptopenjdk
/Library/Java/JavaVirtualMachines/adoptopenjdk-13.jdk/Contents/Home/bin/java -version
ダイアログウィンドウの「キャンセル」をクリック。
システム環境設定>セキュリティとプライバシーで「このまま許可」をクリック。
/Library/Java/JavaVirtualMachines/adoptopenjdk-13.jdk/Contents/Home/bin/java -version
ダイアログウィンドウの「開く」をクリック。
※ JavaScript モジュールは Emscripten の導入後、Python2.7 から build_js.py を実行することで生成可能でした。ドキュメント 2 によると、Docker を用いても JavaScript モジュールを生成可能であるとのことです。
OpenCV JavaScript モジュールの構築例
# 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
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 の構築と導入
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 の場合、コマンド置換を $() ではなく () で行います。変数の代入に関しても書式の差異があります。
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 にアップグレードしてからビルドが通りません。
[855/875] Compiling sip/cpp/sip_webkitwxWebKitBeforeLoadEvent.cpp
../../../sip/cpp/sip_webkitwxWebKitNewWindowEvent.cpp:21:45: error: unknown class name 'wxWebKitNewWindowEvent'; did you mean 'sipwxWebKitNewWindowEvent'?
brew install wxmac
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 のビルド&インストール
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 ではビルドがコケるようになってしまいました。
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
-
構築予定の環境の構成によっては Ansible Homebrew module や Ansible Homebrew cask module 及び Ansible MacPorts module 等も有用と思われる。 ↩
-
https://docs.opencv.org/master/d4/da1/tutorial_js_setup.html ↩