OpenCVで黒目と目頭を検出してみる(Java)


Pocket

顔画像から黒目の位置と目頭の位置を検出できないか試してみました。

目頭と黒目の位置が検出できれば、その距離から視線の向きを推定できるようになります。(まぁあまり精度は望めないですが)
アイトラッキングや視線推定は、割と多く研究されている分野らしく、論文を検索すると、赤外線カメラを使う手法、ステレオカメラを使う手法、眼電位を使う手法、画像処理でも3Dモデルや学習などで精度を上げる手法など、さまざまな研究がされているようです。

そこで、今回は試しにOpenCVを使って黒目と目頭を検出する方法を試してみました。

 

試したこと

下記の手順で黒目と目頭を検出します。
1.オブジェクト検出で目を含む領域を検出
2.目領域の画像からエッジ画像を検出(Cannyエッジ検出)
3.エッジ画像からハフ変換を用いて円を検出し、中心を黒目の中心とする
4.目領域の画像から目頭(=尖っている箇所)を検出(Haris特徴点検出法)
5.検出した特徴点から最も右(左目の場合)に位置す点を目頭の位置とする
 

結果

ハフーHarris検出画像

できました!
ですが、これはかなり対象画像に合わせてパラメータを調整した結果です。
実際は、写真ごとに、黒目の大きさが違う、輝度が違う、顔の角度、・・・というような様々は要因で、なかなか難しいなといった感想です。

ちなみに上記画像で使用したパラーメタです。

// Cannyエッジ検出-Hough検出
Imgproc.HoughCircles(img, circles, Imgproc.CV_HOUGH_GRADIENT, 2, img.rows()/10, 600, 30, 5, 20);

 

あとがき

スマホを目線で操作できないかなと思っていろいろ試しているのですが、なかなか難しいですね。
いい方法が見つかったらご紹介したいと思います。

ではでは〜。
 
 

Leave a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です