tomatoaiu の Tech Blog

プログラミングやツールについてのまとめブログ

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/Offmepg から 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で、ffmepgNOまたはそもそも表示されていなければ環境構築成功!

  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!

videotestsrc
videotestsrc

まとめ

opencv-pythonVideo I/O を利用することで、GStreamer との連携がとても楽なことが分かった。しかし、環境を構築することが難しい。特に、Video I/O のオプションを設定する方法が一応は書いてあるが、具体的にどうしたら良いのか分からなかった。だから、今回のことで理解することができた気がする。他にも、cmake を利用した方法を試してみたが、私の環境だと合わないでビルドできないことがあったので、そちらにもいつか再挑戦してみたい。最後に、ライブラリの製作者様に感謝。

参考文献