PythonでOpenCV 2.0以降の新しいインターフェースを使い顔認識を行う

Python経由でOpenCVの顔認識を行う実例が、OpenCVを使った顔認識を試してみるというエントリにあります。

上記のスクリプトは、このエントリを書いた当時のバージョンであるOpenCV 2.1とそれに附属するPythonバインディングで動作します。

しかし、version 2.1のPythonバインディングリファレンスによると、上記エントリで使っている関数群の説明が見当たりません。どうやら、version 2.0から、古いSWIGベースのPythonバインディングに加え、新しい形式のバインディングが追加されているようです。

  • 基本的には、import cvでほとんど事足りるようになっている。highguiも統合されたようだ。opencv.cv.cvFuncName()や、opencv.highgui.cvFuncname()は、cv.FuncName()となる。各種定数もすべてcv直下で参照できるようだ。
  • cvRect/cvPoint/cvSize/cvScalarなどの代わりに、単なるtupleを使うようになっている。
  • SWIGを用いた旧バインディングも、version 2.1現在では利用できる。
「旧バインディングが使えるのであれば、そのままでいいじゃーん」と思いました。しかし、cvSetImageROIに対応する関数呼び出しは、どうやら新形式でないとサポートされていないようです。

というわけで、上記エントリのコードを新形式に移植してみました。これから新規でPython + OpenCVのスクリプトを書く場合は、新形式を使うのがよいでしょう。

!/usr/bin/env python

-- coding: utf-8 --

import cv import sys

def faceDetect(imgfile): # 画像を読み込む srcimg = cv.LoadImage(imgfile, cv.CVLOADIMAGECOLOR) srcgray = cv.CreateImage(cv.GetSize(srcimg), cv.IPLDEPTH8U, 1)

# ブーストされた分類器のカスケードを読み込む cascadename = "haarcascadefrontalfacedefault.xml" cascade = cv.Load(cascadename)

# メモリを確保し,読み込んだ画像のグレースケール化,ヒストグラムの均一化を行う storage = cv.CreateMemStorage() cv.CvtColor(srcimg, srcgray, cv.CVBGR2GRAY) cv.EqualizeHist(srcgray, src_gray)

# 顔検出 faces = cv.HaarDetectObjects(src_gray, cascade, storage, 1.11, 4, 0, (40, 40))

# 検出された全ての顔位置に枠を描画する for c, facetuple in enumerate(faces): facex, facey, facewidth, faceheight = facetuple[0] cv.Rectangle( srcimg, (facex, facey), (facex + facewidth, facey + faceheight), cv.CVRGB(255, 0, 0), 3, 8, 0 )

return src_img

if name == 'main': if len(sys.argv) < 2: print "Usage: facedetect \n" ; sys.exit(-1) img = faceDetect(sys.argv[1])

# 画像を出力 cv.SaveImage("output.jpg", img)