今回はOpenCVとPythonとVisualStudioで顔認識を試してみましたのでその方法についてご紹介します。
ソースはこちらのサイトを参考にさせていただきました。
Python, OpenCVで顔検出と瞳検出(顔認識、瞳認識)
VisualStudioで環境を作りたかったので備忘録も兼ねて記事を書きました。
今回の構成
・Windows10 64bit
・VisualStudio2019
・OpenCV4.1.2.30
・Python
・USBカメラ(リアルタイム顔認識の場合のみ)
静止画を取り込んで顔認識を行う場合
まずは静止画を取り込んで顔認識を行う方法について説明します。
Pythonのプロジェクトを用意
まずはVisualStudioを起動して「新規作成」→「プロジェクト」を選択します。
検索ボックスに「python」と入力し、「pythonアプリケーション」を選択して「次へ」を押下します。
今回のプロジェクト名は「Python_opencv_face_detect」としておきます。よければ「作成」を押下してプロジェクトを作成します。
Python環境設定とOpenCVのインストール
プロジェクトができたらソリューションエクスプローラーの「Python環境」を右クリックして「すべてのPython環境を表示」を選択します。
「Python 3.7」を選択します。パッケージで「PyPi」を選択して「opencv-python」で検索します。今回は「opencv-python(4.1.2.30)」を選択してインストールします。
インストールが完了するとOpenCVの項目が増えたことが確認できます。
Pythonプログラムの作成
以下のソースをコピーして貼り付けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import cv2 face_cascade_path = 'haarcascade_frontalface_default.xml' eye_cascade_path = 'haarcascade_eye.xml' face_cascade = cv2.CascadeClassifier(face_cascade_path) eye_cascade = cv2.CascadeClassifier(eye_cascade_path) src = cv2.imread('data/src/lena.png') src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(src_gray) for x, y, w, h in faces: cv2.rectangle(src, (x, y), (x + w, y + h), (255, 0, 0), 2) face = src[y: y + h, x: x + w] face_gray = src_gray[y: y + h, x: x + w] eyes = eye_cascade.detectMultiScale(face_gray) for (ex, ey, ew, eh) in eyes: cv2.rectangle(face, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2) cv2.imwrite('data/dst/opencv_face_detect_rectangle.jpg', src) |
カスケードXMLの用意
カスケードXMLを取得してきたいので、別途OpenCV4.2.0をインストールしてきます。ダウンロードが完了したらダブルクリックでインストーラーを起動します。
今回は「C:\OpenCV4.2.0\」というパスを指定して展開します。
展開したフォルダから以下のカスケードXMLをコピーし、Pythonのプロジェクトフォルダ内に貼り付けます。
入力ファイルを用意して実行
プロジェクトフォルダ内の「data\src\」に入力ファイル「lena.png」を用意します。
すべての準備が完了したら「開始」ボタンを押下して実行します。
実行が完了すると「data\dst\」に「opencv_face_detect_rectangle.jpg」というファイルが出力されます。
レナさんの顔と目をしっかり認識してくれました。
USBカメラを接続してリアルタイム顔認識を行う場合
次はリアルタイム顔認識を試していきたいと思います。まずはUSBカメラをUSBポートに接続しておきます。
Pythonプログラムを以下のように変更し、USBカメラからの映像で顔認識するようにします。「cv2.VideoCapture(1)」の「1」については、「1」でカメラを認識できない場合は「0」を設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import cv2 face_cascade_path = 'haarcascade_frontalface_default.xml' eye_cascade_path = 'haarcascade_eye.xml' face_cascade = cv2.CascadeClassifier(face_cascade_path) eye_cascade = cv2.CascadeClassifier(eye_cascade_path) cap = cv2.VideoCapture(1) while True: ret, img = cap.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5) for x, y, w, h in faces: cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) face = img[y: y + h, x: x + w] face_gray = gray[y: y + h, x: x + w] eyes = eye_cascade.detectMultiScale(face_gray) for (ex, ey, ew, eh) in eyes: cv2.rectangle(face, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2) cv2.imshow('video image', img) key = cv2.waitKey(10) if key == 27: # ESCキーで終了 break cap.release() cv2.destroyAllWindows() |
USBカメラを人に向けてみると撮影した映像を取り込んで顔認識されることが分かると思います。
以上、今回は「OpenCVとPythonとVisualStudioで顔認識してみる」という内容について紹介させていただきました。