OpenCVで視線検出 (虹彩検出編)
2008/10/13 月曜日
せっかく割と高いウェブカメラを買ったので、視線検出でもしてみようと思い立ち、まずは虹彩を検出してみました。
![]()
(モノクロで見にくいですが、虹彩の周りの太い円が検出結果)
処理の流れとしては
- cvQueryFrameでキャプチャ
- 1/8縮小画像にてcvHarrDetectObjectsを用いて顔検出
- 最大の検出領域を顔と推定して、その矩形の左上1/4、右上1/4をそれぞれ左目、右目が含まれると推定
- 各々の目を含む画像でグレースケール化、cvAdaptiveThresholdの後ハフ変換で円を検出。cvHoughCirclesは半径の大きい方から列挙していくので、今回の目的からすれば不適当ですが、まあ実験ということで。
- 列挙された円でそれが完全に元画像に収まるもののうち、もっとも小さいものを虹彩輪郭と推定
パラメタは
cvAdaptiveThreshold(eye1, eye2, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 9, 15)
cvHoughCircles(eye2, storage, CV_HOUGH_GRADIENT, 1, 20, 20, 10, 4, 40)
でまあそこそこ上手く行っている。もちろん本当は顔のサイズから虹彩のあり得るサイズを推定して円のmax, minに入れるべきですが。
しかしこの程度の計算でCPUを60%くらい食う。実用的なアプリケーションは難しそうです。
