ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【Raspberry Pi】Raspberry Pi 4のRaspberry Pi OSにOpenCV環境を構築する

 今までも何度もOpenCVをラズパイにインストールしてきましたが、今回もまたインストールしていきます。

 Raspberry Pi OSになって初めてインストールするのと、実際にインストールして色々問題が発生したりしたのでその備忘録です。

 ちなみに流れとしては前に書いた記事の通りです。
rikoubou.hatenablog.com

 また今回は「Raspberry Pi OS (32-bit) with desktop and recommended software」という全部入りのOSで行う前提で進めていくので注意してください。

 では始めます。


1:pip3でOpenCVをインストールする
 Raspberry Pi OS (32-bit) with desktop and recommended softwareの場合、最初からpython3とpip3が入っているのでOpenCVをインストールするだけです。

 LXTerminalを立ち上げて以下のコマンドを入力するだけでOpenCVをインストールできます。

$ pip3 install opencv-python

 ちゃんとインストールできているかの確認はpython3を起動させて以下のコマンドを実行します。

$ python3
Python 3.7.3 (default, Dec 20 2019, 18:57:59)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>>
>>>exit()

 これでエラーが出ていなければOpenCVが使えるようになっています。


2:import cv2でエラーが発生したときの対処方法
 以前の記事に書いてあることと同じですが、import cv2で以下のようなエラーが発生する場合があります。

ImportError: libjasper.so.1: cannot open shared object file: No such file or directory

 これはlibjasperというライブラリがないというエラーなのでlibjasperを入れていきます。またその他にも追加で入れないといけないライブラリがあります。環境などで変わることもあるかと思いますが、基本的に以下の3つのコマンドを実行していけば必要なライブラリはすべて揃うはずです。

$ sudo apt-get install libatlas-base-dev
$ sudo apt-get install libjasper-dev
$ sudo apt-get install libqt4-test

 上記のライブラリを入れ終わったらもう一度python3を立ち上げてimport cv2を実行してみてください。


3:import cv2で2とは別のエラーが発生した場合
 ライブラリが足りないではなく、別のエラーが出る場合があります。

$ python3
Python 3.7.3 (default, Dec 20 2019, 18:57:59)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/pi/.local/lib/python3.7/site-packages/cv2/__init__.py", line 3, in <module>
    from .cv2 import *
ImportError: /home/pi/.local/lib/python3.7/site-packages/cv2/cv2.cpython-37m-arm-linux-gnueabihf.so: undefined symbol: __atomic_fetch_add_8

 いまいちよくわからないエラーですが、調べるとpython3を実行する際に以下のコマンドでとあるライブラリを先に読み込んでおくと出なくなります。

$ LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1 python3
Python 3.7.3 (default, Dec 20 2019, 18:57:59)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'4.1.1'
>>>

 単に最新版のOpenCVを使いたい場合はこれで良いですが、起動時に毎回ライブラリを読み込むコマンドを入れるのは面倒です。

 なのでこのエラーが出ないバージョンのOpenCVをインストールすることにします。

 以下のコマンドを実行して現在インストールされているバージョンのOpenCVをアンインストールします。

$ pip3 uninstall opencv-python

 ちなみに2020/06/11現在では、最新版は4.1.1.26でした。このバージョンだと自分の環境ではエラーが出たことになります。

Uninstalling opencv-python-4.1.1.26:
  Would remove:
    /home/pi/.local/lib/python3.7/site-packages/cv2/*
    /home/pi/.local/lib/python3.7/site-packages/opencv_python-4.1.1.26.dist-info/*
Proceed (y/n)? y
  Successfully uninstalled opencv-python-4.1.1.26

 続いてインストールできるOpenCVのバージョンを確認します。pipでインストールできるバージョンを確認するには存在しないバージョン番号を入力すれば確認できます。

 例えば0.0というバージョンはほぼどのライブラリにも存在しないはずなので、以下のコマンドを実行します。

$ pip3 install opencv-python==0.0

 実際に実行すると以下のようになります。番号が存在するバージョンだけインストールできます。

$ pip3 install opencv-python==0.0
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting opencv-python==0.0
  Could not find a version that satisfies the requirement opencv-python==0.0 (from versions: 3.4.2.16, 3.4.2.17, 3.4.3.18, 3.4.4.19, 3.4.6.27, 3.4.7.28, 4.0.1.24, 4.1.0.25, 4.1.1.26)
No matching distribution found for opencv-python==0.0

 最新版の「4.1.1.26」がエラーが出てしまうのでそのひとつ前の「4.1.0.25」を入れてみます。

$ pip3 install opencv-python==4.1.0.25

 実際に実行して「4.1.0.25」をインストールした後、python3でimport cv2を試してみると以下のようにエラーが出なくなりました。

$ pip3 install opencv-python==4.1.0.25
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting opencv-python==4.1.0.25
  Using cached https://www.piwheels.org/simple/opencv-python/opencv_python-4.1.0.25-cp37-cp37m-linux_armv7l.whl
Requirement already satisfied: numpy>=1.16.2 in /usr/lib/python3/dist-packages (from opencv-python==4.1.0.25) (1.16.2)
Installing collected packages: opencv-python
Successfully installed opencv-python-4.1.0.25

$ python3
Python 3.7.3 (default, Dec 20 2019, 18:57:59)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'4.1.0'
>>>

 いくつかのバージョンをインストールして試したところ、自分の環境では以下のような結果になりました。

  • エラー有:3.4.7.28、4.1.1.26
  • エラー無:4.0.1.24、4.1.0.25

 何が原因なのかはわかりませんが、バージョンによってライブラリをあらかじめ読み込んでおかないといけなくなる場合があるので、最新版にこだわりがなければエラーが出ないバージョンを選択するというのも有りかなと思います。


 以上がRaspberry Pi 4のRaspberry Pi OSにOpenCV環境を構築する方法です。

 今までにないエラーが発生したりと色々面倒なところもありますが、とりあえずRaspberry Pi 4にOpenCVの環境ができたので色々遊んでいきたいです。


・参考資料