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」を実行すると次のように認識した顔を四角形で囲まれます。

顔認識