HDEラボの桜井です。
もう11月、札幌は雪が降ったとか。
さて、今回はPythonの修行がてら、OpenCVを使って顔認識プログラムをやってみました。
OpenCVとは、Intelが開発・公開しているオープンソースのCVライブラリです。
まずは、実際に動作を見てみましょう。
下のテキストボックスにJPEG画像のURLを入力して、「顔認識」ボタンを押します。
※認識できない場合もあるので、結構はっきりとした顔のある写真でやってみてください。
        
        もう11月、札幌は雪が降ったとか。
さて、今回はPythonの修行がてら、OpenCVを使って顔認識プログラムをやってみました。
OpenCVとは、Intelが開発・公開しているオープンソースのCVライブラリです。
まずは、実際に動作を見てみましょう。
下のテキストボックスにJPEG画像のURLを入力して、「顔認識」ボタンを押します。
※認識できない場合もあるので、結構はっきりとした顔のある写真でやってみてください。
            まずは、OpenCVのインストールを。
下記のようにソースを取得してインストールします。自分は、CentOS 5.2にインストールしました。
で、雑ですけどPythonプログラムを。
2008.01.08追記:rpmでpythonを導入している場合、python-develパッケージが必要です。
    下記のようにソースを取得してインストールします。自分は、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パッケージが必要です。




Leave a comment