Raspberry Pi 3でC言語のOpenCV3の開発環境は「Raspberry Pi 3にOpenCV 3.1のインストール」で構築しましたが、今回は、Raspberry Pi 3でPython言語を用いて顔認識プログラムを作成します。使用するOpenCVとPythonのバージョンを次に示します。
- OpenCV 3.1
- Python 2.7.9
OpenCV 3のインストール
「Raspberry Pi 3にOpenCV 3.1のインストール」では、C言語で使用する部分のみ依存するライブラリをインストールしたので、python2.7用の依存ライブライリを次のようにインストールし、以降、同じ手順でコンパイルしてインストールします。
$ sudo apt-get install python2.7-dev
コンパイルしてインストールが完了すると、「/usr/local/lib/python2.7/dist-packages」に「cv2.so」、「/usr/local/lib/python3.4/dist-packages」に「cv2.cpython-34m.so」がそれぞれimportファイルが作成されます。
インストールが完了すると次の手順でOpenCVのバージョンを確認します。
$ python Python 2.7.9 (default, Sep 17 2016, 20:26:04) [GCC 4.9.2] on linux2 Type “help”, “copyright”, “credits” or “license” for more information. >>> import cv2 >>> cv2.__version__ ‘3.1.0’ >>>
「ImportError: No module named packaging.version」のエラー
OpenCV3をPython言語で使用するため、pipコマンドでインストールしようとすると、「No module named packaging.version」のインポートエラーが発生しました。pipコマンドで他のプログラムをインストールしようとしても同様のインポートエラーが発生します。どうもインストールしている過程で、pipを書き換えたみたいです。
このインポートエラーが発生した場合は、次のコマンドで、pipを再インストールすれば「No module named packaging.version」のエラーがなくなりました。
$ sudo apt-get purge -y python-pip $ wget https://bootstrap.pypa.io/get-pip.py $ sudo python ./get-pip.py $ sudo apt-get install python-pip
顔認識プログラムの作成
Raspberry Pi 3でPython言語を用いた顔認識プログラム「face.py」は、OpenCVの顔検出用のHAAR分類器の特徴量「haarcascade_frontalface_alt.xml」を用いて顔を検出します。「HAAR分類器の特徴量は、Raspberry Pi 3にOpenCV 3.1のインストール」でインストールされたHAAR分類器を使用します。ディレクトリ「inimg」に顔を検出する画像を保存し、ディレクトリ「outimg」に顔認識を行った結果の画像を保存します。
# -*- coding: utf-8 -*- import cv2 import os def face_detector(img_path, ): img = cv2.imread(img_path, cv2.IMREAD_COLOR) # RGB空間からグレースケール空間 gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) # 顔検出 face = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1)) if len(face) > 0: for rect in face: cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), (255, 255, 255), thickness=2) else: print "no face" cv2.imshow("result", img) cv2.imwrite("outimg/" + os.path.basename(img_path), img); # キーボード入力を受け付ける key = cv2.waitKey(0) # HAAR分類器の顔検出用の特徴量 cascade_path = "/home/pi/opencv-3.1.0/data/haarcascades/haarcascade_frontalface_alt.xml" faceCascade = cv2.CascadeClassifier(cascade_path) img_files = os.listdir('inimg') for img_file in img_files: full_path_name = 'inimg/' + img_file print full_path_name face_detector(full_path_name)
OpenCV 3のサンプルには、顔認識の他に次のHAAR分類器が提供されています。
# 目認識 #cascade_path = “/home/pi/opencv-3.1.0/data/haarcascades/haarcascade_eye.xml” # 体全体認識 cascade_path = “/home/pi/opencv-3.1.0/data/haarcascades/haarcascade_fullbody.xml” # 上半身認識 #cascade_path = “/home/pi/opencv-3.1.0/data/haarcascades/haarcascade_upperbody.xml” # 笑顔認識 #cascade_path = “/home/pi/opencv-3.1.0/data/haarcascades/haarcascade_smile.xml”
gifファイルの処理について
OpenCVはgifファイルをサポートしていません。このため、Pillow(Python Imaging Library)を次のコマンドでインストールし、一度jpgファイル「convertfromgif.jpg」に変換して、gifファイルを読み出し/書き込みします。
$ sudo pip install Pillow
上記のプログラムでは、拡張子を「root, ext = os.path.splitext(path)」で取得し、gifファイルの読み込みは次のように変更し、
im = Image.open(img_path).convert(‘RGB’).save(‘convertfromgif.jpg’) img = cv2.imread(‘convertfromgif.jpg’, cv2.IMREAD_COLOR)
ファイルの書き込みは次のように変更します。
cv2.imwrite(‘convertfromgif.jpg’, img) im = Image.open(‘convertfromgif.jpg’).save(“outimg/” + os.path.basename(img_path))
上記の顔認識プログラム「face.py」を実行すると次のように認識した顔を四角形で囲まれます。