OpenCV で画像から目を検出したいです。
目の検出には haarcascade_eye.xml が必要だ。
XMLファイルの入手方法と使い方を解説しよう。
✔️ 本記事のテーマ
OpenCV で目を検出する方法
✔️ 読者さんへの前置きメッセージ
本記事は「OpenCV で 目検出をする方法」について書いています。
この記事を読むことで
「画像から目を検出する方法」について理解できます。
OpenCV を使うことで画像中から目と思われる部分を検出することができます。
OpenCV で目検出をするには「OpenCV が公開しているXMLファイル」が必要となります。
この記事では「目検出の方法」や「XMLファイルの入手方法」を解説します。
それでは、解説していきましょう。
OpenCVの目検出のサンプルコード
OpenCVにより目を検出するサンプルコードは以下のようになります。
この記事ではこのサンプルコードに沿って解説していきます。
import cv2
eye_cascade_path = './haarcascade_eye.xml'
eye_cascade = cv2.CascadeClassifier(eye_cascade_path)
src = cv2.imread('./sample.png')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
eyes = eye_cascade.detectMultiScale(src_gray)
for x, y, w, h in eyes:
cv2.rectangle(src, (x, y), (x + w, y + h), (255, 0, 0), 2)
cv2.imwrite('./sample_after.png', src)
このサンプルコードによって、生成される画像はこちらになります。
画像中から目の部分を検出していることが分かるかと思います。
コードを順番に解説していきましょう。
OpenCVの目検出に必要なXMLファイルの入手方法
まずは 目検出に必要な XML ファイルをダウンロードしましょう。
この XML ファイルがないと話が始まりません。
XMLファイルは OpenCV の公式の RELEASE からダウンロードすることができます。
- 上のリンク先の上の方の「Library」にカーソルを合わせる
- 表示されるリストの「Releases」をクリック
- 「Sources」をクリックするとzipファイルがダウンロードされる
zipファイルを解凍すると data\haarcascades というフォルダの中に
haarcascade_eye.xml があるのでそれを使用します。
ちなみに、この XML ファイルは公式のGit Hubリポジトリからもダウンロードすることができますが、Git Hubリポジトリのファイルを使用すると、場合によっては以下のような Error が発生することがあります。
SystemError: returned a result with an error set
そのため、公式の RELEASE からダウンロードしたファイルを使うようにしています。
XMLファイルを読み込み検出器を定義する
XML ファイルが用意できたら、実際にコードを書いていきます。
まずは OpenCV で目を検出するための検出器を定義します。
eye_cascade_path = './haarcascade_eye.xml'
eye_cascade = cv2.CascadeClassifier(eye_cascade_path)
先ほど OpenCV の公式サイトからダウンロードしてきた haarcascade_eye.xml をPythonファイルと同じ場所において、そのPATHを cv2.CascadeClassifier関数に渡すことでを目検出の検出器を eye_cascade として定義しています。
OpenCVによる目検出の前処理
続いて、OpenCVによる目検出を行うのに必要な前処理を行います。
目検出に必要な前処理は以下の2つです。
- 対象画像を読み込む
- グレースケール化を行う
順番に解説しましょう。
対象画像を読み込む
まず、対象の画像を OpenCV の cv2.imread関数で読み込みましょう。
src = cv2.imread('./sample.png')
これにより、対象の画像データに対して、OpenCVで処理を加えることが可能になります。
なお、cv2.imread関数については
「OpenCVで画像を読み込む方法【Python】」
の記事で解説しています。
グレースケール化を行う
次に、対象の画像を OpenCV の cv2.cvtColor関数 でグレースケール化します。
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
これにより、後続の目を検出する eye_cascade.detectMultiScale関数に
インプットすることができるようになります。
ちなみにですが グレースケール化は実施せずともeye_cascade.detectMultiScale 関数動くのですが、公式のドキュメントには グレースケール化するように書かれているので個人的にはこの処理を入れるようにしています。
なお、cv2.cvtColor関数については
「OpenCVでグレースケール画像を簡単に作成する【Python】」
の記事で解説しています。
OpenCVによる目検出を行う
では、実際に目検出を行っていきましょう。
eyes = eye_cascade.detectMultiScale(src_gray)
ここまでで前処理を行ったグレースケール画像を
eye_cascade.detectMultiScale関数 の引数に渡しています。
なお、eye_cascade.detectMultiScale 関数 の戻り値は以下の形式の Ndarray型 になっています。
[
[左上x座標, 左上y座標, 右下x座標, 右下y座標], [左上x座標, 左上y座標, 右下x座標, 右下y座標] …
]
目と思われる領域( = 四角形 )の数だけ、要素の格納された List になっています。
検出した目の領域を描画する
次は、「OpenCVによる目検出を行う」で検出した「目と思われる領域データ」
を使って画像中に描画を行いましょう。
for x, y, w, h in eyes:
cv2.rectangle(src, (x, y), (x + w, y + h), (255, 0, 0), 2)
やってることはシンプルで、目と思われる領域の数だけループを回しています。
各ループの中では 左上x座標, 左上y座標, 右下x座標, 右下y座標 を取り出して、
cv2.rectangle関数 に渡すことで画像中に目と思われる領域を描画しています。
なお、cv2.rectangle関数については
「【OpenCV】cv2.rectangle関数の使い方【長方形を描画する】」
の記事で解説しています。
目検出処理を加えた画像データを保存する
最後に、ここまで処理を加えてきた画像データを画像ファイルとして保存しましょう。
cv2.imwrite('./sample_after.png', src)
OpenCV の cv2.imwrite関数 を使用することで、
画像データを画像ファイルとして保存することができます。
なお、cv2.imwrite関数については
「OpenCVで画像を保存する方法【Python】」
の記事で解説しています。
画像処理プログラミングを独学で勉強するなら
OpenCVのline関数の使い方と引数について解説しました。
OpenCVは画像処理には欠かすことのできないライブラリです。
もし、OpenCVについて独学でスキルをつけるなら、以下の書籍がオススメです。
この書籍はOpenCVの基礎から応用までを
丁寧にかつ詳細に解説しています。
OpenCVのほぼ全てを網羅しているとも言えるほどの徹底ぶりなので、
関数のリファレンスとしても使用することができます。
本記事で解説したcv2.line関数も掲載されています。
コメント