【OpenCV/Raspberry Pi】 Raspberry PiにOpenCVをインストールしてみる。

Raspberry Pi

OpenCVをRaspberry Pi入れてみることにしたが、なかなか手が込みそうなことが書かれていた。特段最新機能ではなければならないと思っているわけではないが、やはり古いバージョンを使うのはそれはそれで今後のためになるかという話なので、何とか、OpenCV4をインストールする。

参考にしたサイト:

Raspberry Pi + Python 3 に OpenCV 3 をなるべく簡単にインストールする - Qiita
はじめにRaspberry Pi で Python から OpenCV を使えるようにする方法をググると山のようにヒットする。それらをよく読むと、大体は次のどちらかになっている。Python …
ラズパイでpython3にopencvを入れたらエラーが出た【対処法】 - Qiita
opencvをインストールもアンインストールも上手く出来ず困っていたところなんとかインストールすることが出来たので,経緯を書きます。エラー状況pi@raspberrypi:~ $ python3…

上記サイトをほぼそのままである。

$ sudo apt-get install libhdf5-dev libhdf5-serial-dev
$ sudo apt-get install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
$ sudo apt-get install libatlas-base-dev
$ sudo apt-get install libjasper-dev

参考サイトで、「libhdf5-100」に関してパッケージをインストールするようになっていたが、これをそのまま実行するとそのパッケージはないと言われてしまうので、エラーになる。

ただ、「libhdf5-dev」での依存パッケージにもなっているためか、インストール自体は「libhdf5-103」がインストールされていたので、問題はなさそうであるので、上記コードでは除いている。

$ sudo pip3 --default-timeout=1000 install opencv-python

インストールが完了したら、利用できるか確認しますが、ここで、一つ目のリンク先の通りに実施しても以下のようなエラーが出た。

$ 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/cv2/__init__.py", line 3, in <module>
    from .cv2 import *
ImportError: /home/pi/cv2/cv2.cpython-37m-arm-linux-gnueabihf.so: undefined symbol: __atomic_fetch_add_8

対策を実施。(二つ目のリンク)

以下を実施

$ LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1

次にvimで編集

$ vim .bashrc

** <.bashrcファイル内> **

# -- 省略 --

export LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1 #この一文を追加

保存して以下を実施して

source .bashrc

対策は終了。

それでは、改めて、一つ目のリンクを確認して、OpenCVが動作するか確認。

$ 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'
>>> # ctrl+D で抜けられる。

カレントディレクトリに test.jpg を置いておき、以下の通り実行してcanny.jpg ができたら一応動作している。

$ python3
>>> import cv2
>>> bgr = cv2.imread('./test.jpg', cv2.IMREAD_COLOR)
>>> gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
>>> canny = cv2.Canny(gray, 200, 50)
>>> cv2.imwrite('./canny.jpg', canny)
True
>>> # ctrl+D で抜けられる。