8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

OpenCVでWebカメラ画像からリアルタイム顔検出

Posted at

この記事は以前書いたGoogle Colaboratory+OpenCVでWebカメラ画像から顔検出のバリエーションです.
PCに接続されたカメラから__リアルタイムで__顔検出するプログラムについて説明しています.

学習済みモデルの入手

Google Colabの場合はwgetを用いて入手しました.今回も何らかの方法で入手し,任意のフォルダ (典型的にはワーキングフォルダ) に置くことになります.Webブラウザなどから入手することも可能ですが,今回は__かっこいいので__ターミナルからコマンドを叩いて入手します.Macの場合はcurlを使いますので,下記のようになります.

$ curl -O https://raw.githubusercontent.com/opencv/opencv/master/samples/dnn/face_detector/deploy.prototxt
$ curl -O https://raw.githubusercontent.com/opencv/opencv_3rdparty/dnn_samples_face_detector_20170830/res10_300x300_ssd_iter_140000.caffemodel

Linuxの場合はwgetを使います.

プログラム

Google Colaboratory+OpenCVでWebカメラ画像から顔検出とほぼ同内容ですので,説明は省きます.

facedetect_camera.py
# インポート (適宜pipでインストールする)
import imutils
import numpy as np
import cv2

# VideoCaptureをオープン
cap = cv2.VideoCapture(0)

# モデルを読み込む
prototxt = 'deploy.prototxt'
model = 'res10_300x300_ssd_iter_140000.caffemodel'
net = cv2.dnn.readNetFromCaffe(prototxt, model)

# カメラ画像を読み込み,顔検出して表示するループ
while True:
    ret, frame = cap.read()

    # カメラ画像を幅400pxにリサイズ
    img = imutils.resize(frame, width=400)
    (h, w) = img.shape[:2]
    blob = cv2.dnn.blobFromImage(cv2.resize(img, (300, 300)), 1.0, (300, 300), (104.0, 177.0, 123.0))

    # 物体検出器にblobを適用する
    net.setInput(blob)
    detections = net.forward()

    for i in range(0, detections.shape[2]):
        # ネットワークが出力したconfidenceの値を抽出する
        confidence = detections[0, 0, i, 2]
        # confidenceの値が0.5以上の領域のみを検出結果として描画する
        if confidence > 0.5:
            # 対象領域のバウンディングボックスの座標を計算する
            box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
            (startX, startY, endX, endY) = box.astype("int")
            # バウンディングボックスとconfidenceの値を描画する
            text = "{:.2f}%".format(confidence * 100)
            y = startY - 10 if startY - 10 > 10 else startY + 10
            cv2.rectangle(img, (startX, startY), (endX, endY), (0, 0, 255), 2)
            cv2.putText(img, text, (startX, y),
                cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)

    cv2.imshow("Face Detection", img)
    k = cv2.waitKey(1)&0xff
    if k == ord('s'):
        cv2.imwrite("./output.jpg", img) # ファイル保存
    elif k == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

実行結果

Macが早いのか何が早いのか分からないが,すごいフレームレートで動く.サラマンダーより、ずっとはやい!!

facedetection_out

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?