Pythonで顔認識プログラム(OpenCV)

| | Comments (0) | TrackBacks (0)
HDEラボの桜井です。
もう11月、札幌は雪が降ったとか。

さて、今回はPythonの修行がてら、OpenCVを使って顔認識プログラムをやってみました。
OpenCVとは、Intelが開発・公開しているオープンソースのCVライブラリです。

まずは、実際に動作を見てみましょう。
下のテキストボックスにJPEG画像のURLを入力して、「顔認識」ボタンを押します。
※認識できない場合もあるので、結構はっきりとした顔のある写真でやってみてください。



まずは、OpenCVのインストールを。
下記のようにソースを取得してインストールします。自分は、CentOS 5.2にインストールしました。

# wget http://downloads.sourceforge.net/opencvlibrary/opencv-1.1pre1.tar.gz?modtime=1224465510&big_mirror=1
# tar zxvf opencv-1.1pre1.tar.gz
# cd opencv-1.1pre1
# ./configure --prefix=/usr
# make
# make install

で、雑ですけどPythonプログラムを。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import urllib2
import os
import md5
import cgi
from opencv.cv import *
from opencv.highgui import *

def faceDetect(imgfile):
  # 画像を読み込む
  src_img = cvLoadImage(imgfile, CV_LOAD_IMAGE_COLOR)
  src_gray = cvCreateImage(cvSize(src_img.width, src_img.height),
                             IPL_DEPTH_8U, 1)

  # ブーストされた分類器のカスケードを読み込む
  cascade_name = "/var/www/db/haarcascade_frontalface_default.xml"
  cascade = cvLoadHaarClassifierCascade(cascade_name, cvSize(1,1))

  # メモリを確保し,読み込んだ画像のグレースケール化,ヒストグラムの均一化を行う
  storage = cvCreateMemStorage(0)
  cvClearMemStorage(storage)
  cvCvtColor(src_img, src_gray, CV_BGR2GRAY)
  cvEqualizeHist(src_gray, src_gray)

  # 顔検出
  faces = cvHaarDetectObjects(src_gray, cascade, storage, 1.11, 4, 0, cvSize(0, 0))

  # 検出された全ての顔位置に枠を描画する
  for c, i in enumerate(faces):
    pt1 = cvPoint(int(i.x), int(i.y))
    pt2 = cvPoint(int(i.x + i.width), int(i.y + i.height))
    cvRectangle(src_img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0);

  return src_img

def getImageFileFromURL(url, filename):
  f = urllib2.urlopen(url)
  save_image = file(filename, "wb")
  save_image.write(f.read())
  save_image.close()

if __name__ == '__main__':
  # CGIでURLを取得
  f = cgi.FieldStorage()
  url = f.getfirst('image_url', '')
  m = md5.new(url)
  filename = m.hexdigest()
  image_name = '/tmp/' + filename + '.jpg'

  # URLから画像を取得して保存
  getImageFileFromURL(url, image_name)

  # 顔認識処理
  img = faceDetect(image_name)

  new_image_name = '/tmp/new' + filename + '.jpg'

  # 顔認識画像を保存
  cvSaveImage(new_image_name, img)

  os.remove(image_name)

  # 顔認識画像を表示
  print "Content-Type: image/jpeg"
  print ""
  f2 = file(new_image_name)
  print f2.read()
  f2.close()

  os.remove(new_image_name)


2008.01.08追記:rpmでpythonを導入している場合、python-develパッケージが必要です。

0 TrackBacks

Listed below are links to blogs that reference this entry: Pythonで顔認識プログラム(OpenCV).

TrackBack URL for this entry: http://lab.hde.co.jp/blog/mt-tb.cgi/68

Leave a comment

About this Entry

This page contains a single entry by Takeshi SAKURAI published on November 6, 2008 4:26 PM.

インストール済み(ただし未伸張)ファイルが見つかりました orz was the previous entry in this blog.

Twistedでハマった件について(ProtocolクラスとFactoryクラス) is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.