OpenCVで物体認識

物体検出が可能なOpenCVとは

OpenCVは、Open source Computer Vision libraryの略で、アメリカにおいてロボット関連のハードウェアやオープンソフトウェアの研究開発を行っている私企業であるWillow Garage社によって開発されました。2015年から現在まではIntel社によって買収されたItseezがOpenCVのメンテナンスをおこなっています。

さて今回はOpenCVを使って、画像から物体検出を行うとはどいうことなのか、実験を踏まえて体験していきたいと思います。

実験する環境は以下の通りです。

  • CentOS7.2(64bit)
  • Python3.6.2
  • OpenCV3.4.1

OpenCVの物体検出にはいくつかの方法がありますが、今回は「カスケード分類器」を使って人物の顔を検出してみます。

画像から人物の顔を検出する

OpenCVの「カスケード分類器」を使って人物の顔を検出します。OpenCVをpipでインストールします。

pip3 install opencv-python

インストール完了後は、以下のようにしてOpenCVのバージョンを確認することができます。

$ python3.6
Python 3.6.2 (default, Jul 18 2017, 22:59:34)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.4.1'
>>>

では、早速次の画像から顔を検出させてみましょう。

この画像は、画像検出界のマドンナとも称される有名なレナさん(Lena又はLenna)の上半身の画像です。オリジナルの写真は全身画像なのですが、顔を検出する実験に使用されるため、上半身の画像に加工されています。

pythonコードは以下のようになります。

import cv2
import sys

#入力ファイルの設定
imagefile="./lena.png"

#カスケードファイルのパス設定
cascade_file = "/usr/lib64/python3.6/site-packages/cv2/data/haarcascade_frontalface_default.xml"

#画像を読み込む
image = cv2.imread(imagefile)

#読み込んだ画像をグレースケールに変換する
image_gs = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)

#カスケードファイルを読み込む
cascade = cv2.CascadeClassifier(cascade_file)

#顔認識処理
face_list = cascade.detectMultiScale(image_gs, scaleFactor=1.1, minNeighbors=1, minSize=(150,150))

if len(face_list) > 0:
  #検出部分に囲みを付ける
  print(face_list)
  color = (255,255,255)
  for face in face_list:
    x,y,w,h = face
    cv2.rectangle(image, (x,y), (x+w, y+h), color, thickness=8)
  #検出結果の画像ファイルを出力する。
  cv2.imwrite("facedetect-output.png", image)
else:
  print("No face")

では、スクリプトを実行してみましょう。

$ python3 opencv1.py
[ INFO:0] Initialize OpenCL runtime...
[[199 195 204 204]]

facedetect-output.pngが出力されますので、画像を開いて確認します。

顔の部分が白い矩形で囲まれています。画像から顔の部分を検出することができましたね。

今回は、OpenCVのチュートリアルで紹介されている画像物体検出の基本的な使い方について試してみました。