2018年8月27日月曜日

画像処理の演習を Python3 用の OpenCV3 / OpenCV4で実行する方法

0. はじめに

Pythonにはバージョン2 (Python2) とバージョン3 (Python3)の2系統があります。本書のプログラムは、原則的に両方のバージョンで実行できるように記述しています。

しかし、画像処理に用いるライブラリOpenCVだけは、Python2での利用に限定していました。2018年8月の時点の Raspbian Stretch で言えば、Python がバージョン2.7.13、OpenCVはバージョン2.4.9.1でした。

これは、2015年の本書執筆時はPython3でOpenCVを用いる簡単な方法が見つからなかったためです。

しかし、Python3でOpenCVを用いる方法が容易になりつつあることから、Python3で本書のOpenCVを用いたプログラムを実行する方法をここで紹介することにしました。

1. 準備

まず、本書でもインストールしたlibopencv-devをあらかじめインストールしておきます。下記の2つの命令を順に実行します。
sudo apt update
sudo apt install libopencv-dev
なお、このlibopencv-devは顔認識に用いるファイルhaarcascade_frontalface_alt.xmlのためだけにインストールします。

このあとは、用いているOSと利用したいOpenCVのバージョンによりコマンドが分かれます。

2. Rasppbian Buster または Bullseye + Python3 + OpenCV3 の場合

Raspbian Buster または Bullseye をお使いの場合、apt コマンドでインストールできるOpenCV3をインストールするのが最も簡単ですのでお勧めです。

下記のようにOpenCVをインストールします。
sudo apt install python3-opencv
以上で、Python3 用の OpenCV のインストールが終わりました。

2019年6月の時点で、Python3はバージョン3.7.3、OpenCV はバージョン3.2.0となりました。

3. Rasppbian Buster + Python3 + OpenCV4 の場合

Raspbian Busterをお使いの場合、pip3 コマンドでインストールするとOpenCV4がインストールされます。インストール中のネットワークトラブルによるエラーが多いので、上級者向けと考えています。

まず、必要なパッケージをインストールします。
sudo apt install libatlas-base-dev libjasper-dev libqtgui4 libqt4-test
最後に、Python3 用の OpenCV4 をインストールします。
sudo pip3 install opencv-python==4.5.1.48
最後に、以下のコマンドを実行します。それが終わったらRaspberry Piを再起動します。
echo "export LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1" >> ~/.bashrc
以上で、Python3 用の OpenCV4 のインストールが終わりました。

なお、OpenCVのバージョンを 4.5.1.48 に指定している理由は、それ以降 (4.5.3 など) では NumPy の新しいバージョン (1.21 など) を要求されるためです。
NumPy 1.20 以降では、機械学習用のライブラリ TensorFlow 2.x の動作に問題が出る場合があるため、Numpy 1.19 で使える OpenCV 4.5.1.48 を指定しているのです。
TensorFlow 2.x を使わない場合は OpenCV のバージョン指定は不要ですが、利用は自己責任でお願いします。

また、Raspberry Piでのpip(pip3)を用いたツールのインストールは、ネットワークのトラブルにより失敗することが多いようです。例えば、pip(pip3)コマンドを実行したときに下記のような40行程度のエラーが出ることがあります。
Exception:
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
(中略)
  File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/util/retry.py", line 315, in increment
    total -= 1
TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'
これは、インストール時のネットワークに問題があるときに出るエラーです。 Raspberry Piがネットワークに接続していないとき、および、ファイルのダウンロード元であるサーバーに問題があるときの両方で上記エラーが出ます。
あるいは、同様のエラーで
THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE.
と出る場合もあります。

Raspberry Piのネットワーク接続に問題がある場合はその改善を試みてください。
一方、先方のサーバーに問題がある場合、時間をあけてからコマンドを再実行すると問題が解消される場合があります。Raspberry Pi上でpipを用いてツールをインストールする場合、サーバー側の問題なのか、何度もインストールを試みて初めてインストールに成功する、ということが多い印象があります。

4. Rasppbian Stretch + Python3 + OpenCV4 の場合

Raspbian Stretch上のPython3でOpenCV4を用いたい場合、以下のようにします。

まず、必要なパッケージをインストールします。
sudo apt install libatlas-base-dev libjasper-dev libqtgui4 python3-pyqt5 libqt4-test
次に、Python3 用の OpenCV4 をインストールします。
sudo pip3 install opencv-python==4.5.1.48
以上で、Python3 用の OpenCV4 のインストールが終わりました。

5. 本書のOpenCVを用いた演習の実行

執筆当時のプログラムではいくつかのプログラムに修正が必要だったので、 2019/6/25にサンプルファイル(raspi2-sample.zip)を更新しました。 それ以前にダウンロードされた方は公式サイトから raspi2-sample.zip をダウンロードしなおしてください。

更新済のプログラムを用いる場合、実行方法は解説ページに記した内容と変わりません。