OpenCV4 + Python3 + GStreamer の環境を Mac に構築する。
やりたいこと
MacOS上に、OpenCVとGStreamerを連携させた映像取得処理をやりたい。それを、Pythonでやりたい。検索してもmacOS上の記事がない、または、記事があるけど現状でうまくいかないこともあったのでここにメモする。
目次
事前に準備しておくもの
- macOS Catalina 10.15.5
- Homebrew 2.4.5
- git version 2.24.3 (Apple Git-128)
- fish, version 3.1.2
- Python 3.7.7
- pip 20.0.2 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
環境構築
OpenCVでGStremaerを利用するために、OpenCV
, GStreamer
, Qt
, opencv-python
を用意する必要がある。この内 Qt
は、いらない気もするが、opencv-python
をマニュアルでビルドするときに Qt
がないことでエラーが出たので用意することにした。
OpenCVのインストール
初めに、Homebrewを利用してOpenCVをインストール。
brew install opencv
インストールできたか確認するために、以下のコマンドを入力。
brew info opencv
上記のコマンドを入力すると、インストールしたopencvの情報をみることができる。
opencv: stable 4.3.0 (bottled) 省略
GStreamerのインストール
Homebrewを利用してGStreamer関連のものをインストール。
brew install gstreamer gst-plugins-base gst-plugins-good \ gst-plugins-bad gst-plugins-ugly gst-libav gst-rtsp-server \ gst-editing-services
以下のコマンドで gstreamer
が正しく導入できたかと、バージョン確認をすることができる。
gst-launch-1.0 --version
Qtのインストール
次に、Homebrewを利用して qt5
をインストール。
brew install qt5
以下のコマンドで、qt5
のバージョンを確認する。私の環境だと qt: stable 5.15.0 (bottled), HEAD [keg-only]
と表示された。
brew info qt5
エディタで fish.config
を開き、qtのバージョンを指定して追記することでパスを通す。私の場合だと以下のようになる。
set -U Qt5_DIR /usr/local/Cellar/qt/5.15.0 $Qt5_DIR
エディタを閉じて、fish.config
を以下のコマンドで保存する。
source ~/.config/fish/config.fish
opencv-pythonのインストール
opencv-pythonのインストールは、オプションを設定する必要があるため、マニュアルでインストールする。git
でインストールしたら、そのリポジトリ内に cd
で移動する。※普通にインストールするだけなら、pip3 install opencv-python
でok。
git clone --recursive https://github.com/skvark/opencv-python.git cd opencv-python
OpenCVの Video I/O
を ffmepg
から gstreamer
に変更するため、fish.config
をエディタで開いて、以下を追記しておく。※CMAKE_FLAGS
を利用することにより、OpenCV
のオプションを変更できる。
set -U CMAKE_FLAGS "-DWITH_GSTREAMER=ON -DWITH_FFMPEG=OFF" $CMAKE_FLAGS
fish.config
閉じて、コマンドラインから保存する。
source ~/.config/fish/config.fish
次に、oencv-python
をビルドする。ビルドの時間はとても長い。それに、失敗することもある。私の場合は、失敗した後に再度同じコマンド打つことでビルドが通った。原因不明。
python3 setup.py bdist_wheel
ビルドが成功するとdistフォルダーが作成され、その中に、opencv-python
モジュールが作成される。そのフォルダーに移動。
cd dist
ls
コマンド実行しておきpip3でインストールするモジュール名をクリップボードにコピーしておく。ls | pbcopy
をするとコピーが楽。
ls
lsを入力したときに表示されたモジュール名。(私の場合)
opencv_python-4.3.0.36-cp37-cp37m-macosx_10_9_x86_64.whl
最後に、dist内にあるモジュールをインストール。私の場合だと以下のようなモジュール名だった。
pip3 install opencv_python-4.3.0.36-cp37-cp37m-macosx_10_9_x86_64.whl
テスト映像を表示する
もろもろがうまく作動するか確認用のファイルを作成。
touch main.py
main.pyに以下を記入して保存。
import cv2 print(cv2.getBuildInformation())
main.pyをコマンドラインから実行する。
python3 main.py
実行すると getBuildInformation()
関数によりビルド情報が出てくる。その中の、Video I/O
を探す。GStreamer
の設定がYES
で、ffmepg
がNO
またはそもそも表示されていなければ環境構築成功!
Video I/O: DC1394: NO GStreamer: YES (1.16.2) AVFoundation: YES
main.pyを以下のように修正して、GStreamer
のテスト動画を表示できるか確認する。コードの大体は、こちらの公式のチュートリアルから利用する。cv2.VideoCapture()
関数の引数に、 GStreamer
のパイプラインを渡すことで映像を取得することができる。
import cv2 cap = cv2.VideoCapture('videotestsrc ! videoconvert ! appsink') while(True): ret, frame = cap.read() cv2.imshow('frame', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
再度、python3 main.py
を実行すると、以下のような画像が表示される。無事に表示できたらOK!
まとめ
opencv-python
の Video I/O
を利用することで、GStreamer
との連携がとても楽なことが分かった。しかし、環境を構築することが難しい。特に、Video I/O
のオプションを設定する方法が一応は書いてあるが、具体的にどうしたら良いのか分からなかった。だから、今回のことで理解することができた気がする。他にも、cmake
を利用した方法を試してみたが、私の環境だと合わないでビルドできないことがあったので、そちらにもいつか再挑戦してみたい。最後に、ライブラリの製作者様に感謝。
参考文献
- opencv-python · PyPI, 入手先 https://pypi.org/project/opencv-python/
- [Kinesis Video Streams] OpenCVのビデオソースにGStreamerを使用してみました。 | Developers.IO, 入手先https://dev.classmethod.jp/articles/gstreamer-opencv/
- Getting Started with Videos — OpenCV-Python Tutorials 1 documentation, 入手先 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html