山内セミナーⅠ(2022/06/29)

関連サイトと資料

OpenCVライブラリのインストール

  1. 下の図の赤丸をクリックして、コマンドプロンプトを開いてください。


  2. 「conda activate seminar1」と入力して、エンターキーを押してください。 プロンプトの左側のカッコの中の表示が「base」から「seminar1」に変化し、仮想環境「seminar1」に入ったことを示しています。


  3. 仮想環境「seminar1」で、 「pip install opencv-python」と入力して、 エンターキーを押してください。

顔の録画プログラム

recordFaceVideo1.py
import cv2
import datetime
  
# 現在の日時を取得
t_delta = datetime.timedelta(hours=9)
JST = datetime.timezone(t_delta, 'JST')
now = datetime.datetime.now(JST)
s_now = now.strftime('%Y%m%d_%H%M%S')
  
# パラメータ   
record_time = 10 # 録画時間 [s]
fps = 30 # 1秒あたりのフレーム数(仮定の値)
savename = f'face_{s_now}.avi'
  
cameraCapture = cv2.VideoCapture(0)
size = (int(cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter(savename, cv2.VideoWriter_fourcc('I','4','2','0'), fps, size)
  
success, frame = cameraCapture.read()
numFramesRemaining = record_time * fps - 1 # 10 seconds of frames
while success and numFramesRemaining > 0:
    videoWriter.write(frame)
    success, frame = cameraCapture.read()
    numFramesRemaining -= 1
  
videoWriter.release()
cameraCapture.release()
    

Viola-Jones法による顔検出(動画読み込み)

face_detect_haar1.py
import os
import cv2
import numpy as np
  
# キャプチャを開く
capture = cv2.VideoCapture('face_20211201_090824.avi')  # 動画ファイル
if not capture.isOpened():
    raise IOError("can't open capture!")
  
# 分類器を読み込む
cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
if cascade is None:
    raise IOError("can't read cascade!")
    
confidence_th = 0.6
while True:
    # フレームをキャプチャして画像を読み込む
    result, image = capture.read()
    if result is False:
        cv2.waitKey(0)
        break
  
    # グレースケールに変換する
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        
    # 顔を検出する
    height, width = gray_image.shape
    min_size = (int(width / 10), int(height / 10))
    boxes = cascade.detectMultiScale(gray_image, minSize=min_size)
    # 検出した顔のバウンディングボックスを描画する
    for box in boxes:
        color = (0, 0, 255)
        thickness = 2
        cv2.rectangle(image, box, color, thickness, cv2.LINE_AA)
    
    # 画像を表示する
    cv2.imshow("face detection", image)
    key = cv2.waitKey(10)
    if key == ord('q'):
        break
  
cv2.destroyAllWindows()
    

Viola-Jones法による顔検出(カメラからの映像読み込み)

face_detect_haar2.py
import os
import cv2
import numpy as np
  
# キャプチャを開く
capture = cv2.VideoCapture(0)  # カメラ
if not capture.isOpened():
    raise IOError("can't open capture!")
  
# 分類器を読み込む
cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
if cascade is None:
    raise IOError("can't read cascade!")
    
confidence_th = 0.6
while True:
    # フレームをキャプチャして画像を読み込む
    result, image = capture.read()
    if result is False:
        cv2.waitKey(0)
        break
  
    # グレースケールに変換する
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        
    # 顔を検出する
    height, width = gray_image.shape
    min_size = (int(width / 10), int(height / 10))
    boxes = cascade.detectMultiScale(gray_image, minSize=min_size)
    # 検出した顔のバウンディングボックスを描画する
    for box in boxes:
        color = (0, 0, 255)
        thickness = 2
        cv2.rectangle(image, box, color, thickness, cv2.LINE_AA)
    
    # 画像を表示する
    cv2.imshow("face detection", image)
    key = cv2.waitKey(10)
    if key == ord('q'):
        break
  
cv2.destroyAllWindows()
    

DNNによる顔検出(動画読み込み)

face_detect_dnn1.py
import os
import cv2
import numpy as np
  
# キャプチャを開く
capture = cv2.VideoCapture('face_20211201_090824.avi')  # 動画ファイル
if not capture.isOpened():
    raise IOError("can't open capture!")
  
# モデルを読み込む
MODEL_FILE = 'deploy.prototxt'
PARAM_FILE = 'res10_300x300_ssd_iter_140000_fp16.caffemodel'
model = cv2.dnn.readNetFromCaffe(MODEL_FILE, PARAM_FILE)
# モデルの推論に使用するエンジンとデバイスを設定する
model.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
model.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU)
  
# モデルの入力パラメーターを設定する
scale = 1.0                   # スケールファクター
size = (300, 300)             # 入力サイズ
mean = (104.0, 177.0, 123.0)  # 差し引かれる平均値
swap = False                  # チャンネルの順番(True: RGB、False: BGR)
crop = False                  # クロップ
  
confidence_th = 0.6
while True:
    # フレームをキャプチャして画像を読み込む
    result, image = capture.read()
    if result is False:
        cv2.waitKey(0)
        break
  
    # 画像が3チャンネル以外の場合は3チャンネルに変換する
    channels = 1 if len(image.shape) == 2 else image.shape[2]
    if channels == 1:
        image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)
    if channels == 4:
        image = cv2.cvtColor(image, cv2.COLOR_BGRA2BGR)
    
    # 顔を検出する
    blob = cv2.dnn.blobFromImage(image, scale, size, mean, swap, crop)
    model.setInput(blob)
    detections = model.forward()
    h, w = image.shape[:2]
    for i in range(0, detections.shape[2]):
        confidence = detections[0, 0, i, 2]
        if confidence > confidence_th:
            box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
            (x1, y1, x2, y2) = box.astype("int")
            cv2.rectangle(image, (x1, y1), (x2, y2), (0, 0, 255), 3, cv2.LINE_AA)
    
    # 画像を表示する
    cv2.imshow("face detection", image)
    key = cv2.waitKey(10)
    if key == ord('q'):
        break
  
cv2.destroyAllWindows()
    

DNNによる顔検出(カメラからの映像読み込み)

face_detect_dnn2.py
import os
import cv2
import numpy as np
  
# キャプチャを開く
capture = cv2.VideoCapture(0)  # カメラ
if not capture.isOpened():
    raise IOError("can't open capture!")
  
# モデルを読み込む
MODEL_FILE = 'deploy.prototxt'
PARAM_FILE = 'res10_300x300_ssd_iter_140000_fp16.caffemodel'
model = cv2.dnn.readNetFromCaffe(MODEL_FILE, PARAM_FILE)
# モデルの推論に使用するエンジンとデバイスを設定する
model.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
model.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU)
  
# モデルの入力パラメーターを設定する
scale = 1.0                   # スケールファクター
size = (300, 300)             # 入力サイズ
mean = (104.0, 177.0, 123.0)  # 差し引かれる平均値
swap = False                  # チャンネルの順番(True: RGB、False: BGR)
crop = False                  # クロップ
  
confidence_th = 0.6
while True:
    # フレームをキャプチャして画像を読み込む
    result, image = capture.read()
    if result is False:
        cv2.waitKey(0)
        break
  
    # 画像が3チャンネル以外の場合は3チャンネルに変換する
    channels = 1 if len(image.shape) == 2 else image.shape[2]
    if channels == 1:
        image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)
    if channels == 4:
        image = cv2.cvtColor(image, cv2.COLOR_BGRA2BGR)
    
    # 顔を検出する
    blob = cv2.dnn.blobFromImage(image, scale, size, mean, swap, crop)
    model.setInput(blob)
    detections = model.forward()
    h, w = image.shape[:2]
    for i in range(0, detections.shape[2]):
        confidence = detections[0, 0, i, 2]
        if confidence > confidence_th:
            box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
            (x1, y1, x2, y2) = box.astype("int")
            cv2.rectangle(image, (x1, y1), (x2, y2), (0, 0, 255), 3, cv2.LINE_AA)
    
    # 画像を表示する
    cv2.imshow("face detection", image)
    key = cv2.waitKey(10)
    if key == ord('q'):
        break
  
cv2.destroyAllWindows()
    

DNNによる顔検出(静止画像)

face1.jpg

dnn1.py
import os
import cv2
import numpy as np
  
# モデルを読み込む
MODEL_FILE = 'deploy.prototxt'
PARAM_FILE = 'res10_300x300_ssd_iter_140000_fp16.caffemodel'
model = cv2.dnn.readNetFromCaffe(MODEL_FILE, PARAM_FILE)
  
# モデルの推論に使用するエンジンとデバイスを設定する
model.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
model.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU)
  
# モデルの入力パラメーターを設定する
scale = 1.0                   # スケールファクター
size = (300, 300)             # 入力サイズ
mean = (104.0, 177.0, 123.0)  # 差し引かれる平均値
swap = False                  # チャンネルの順番(True: RGB、False: BGR)
crop = False                  # クロップ
  
# 静止画像の読み込み
target = 'face1.jpg'
image = cv2.imread(target, cv2.IMREAD_COLOR)
    
# 顔を検出する
confidence_th = 0.6
blob = cv2.dnn.blobFromImage(image, scale, size, mean, swap, crop)
model.setInput(blob)
detections = model.forward()
h, w = image.shape[:2]
for i in range(0, detections.shape[2]):
    confidence = detections[0, 0, i, 2]
    if confidence > confidence_th:
        box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
        (x1, y1, x2, y2) = box.astype("int")
        cv2.rectangle(image, (x1, y1), (x2, y2), (0, 0, 255), 3, cv2.LINE_AA)
    
# 画像を表示する
cv2.imshow("face detection", image)
cv2.waitKey(0) 
cv2.destroyAllWindows()