Edited at

Panasonic製ネットワークカメラの画像を取得して顔検出をしてみる


はじめに

ネットワークカメラの画像を分析する必要がでてきたのですが、試してみた内容がそこそこ面白かったのでまとめてみました。


必要なもの


画像の取込から顔画像の保存

以下のスクリプトを作成。


face_detection.py


import requests
from requests.auth import HTTPDigestAuth

import io
from PIL import Image
import numpy as np
import cv2

# カメラのIPアドレス 192.168.0.10
# 画像データの取得  /cgi-bin/camera
# 解像度の指定    resolution
url = "http://192.168.0.10/cgi-bin/camera?resolution=1280"

# 認証情報
user = "*****"
pswd = "*****"

# 顔を識別するためのファイル
cascade_file = "haarcascade_frontalface_alt2.xml"
cascade = cv2.CascadeClassifier(cascade_file)

while True:

# 画像の取得
rs = requests.get(url, auth=HTTPDigestAuth(user, pswd))

# 取得した画像データをOpenCVで扱う形式に変換
img_bin = io.BytesIO(rs.content)
img_pil = Image.open(img_bin)
img_np = np.asarray(img_pil)
img = cv2.cvtColor(img_np, cv2.COLOR_RGBA2BGR)

# 顔検出のためにグレイスケール画像に変換
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 検出した顔の位置情報を取得
face_list = cascade.detectMultiScale(img_gray, minSize=(100, 100))

# 顔を検出したらループ処理を終了
if len(face_list) != 0:
break

cat = 0
now = "{:%Y%m%d%H%M%S}".format(datetime.datetime.now())

for (pos_x, pos_y, w, h) in face_list:

# 顔の切出
img_face = img[pos_y:pos_y+h, pos_x:pos_x+w]

# 顔画像をリサイズし、サイズを統一
img_face = cv2.resize(img_face, (200, 200))

# 番号を付けて保存
cv2.imwrite("{}_{}.png".format(now, cnt),img_face)



実行

コマンドプロンプトなどで以下のとおり実行。

python face_detection.py

スクリプトと同じフォルダに検出した人の顔があれば成功!

はい、できました。