[MAC] 内蔵カメラを使って簡単なリアルタイム動画処理をしてみました


※プログラミング完全超初心者が書いています。インターネット上で調べていることが多いため既視感があるかもしれません。

環境

  • macOS Big Sur 11.2.3
  • opencv 4.1.2
  • Visual Studio Code

処理内容

 カメラから取得した動画に写っている人間の顔(正面)を検出し、モザイク処理をおこないます。

動画処理

 動画を1フレームごとに画像処理し、描画し続けます。
よって、まず、カメラでフレームを読み込むプログラムを作成します。

program1

import cv2

#カメラから動画を読み込む
#このプログラムでは、内蔵カメラを使用するため0
camera = cv2.VideoCapture(0)

while True:
    # フレームを読込み
    ret, frame = camera.read()

    # フレームが読み込めなかった場合
    if not ret: 
        break

    # フレームの描画
    cv2.imshow('camera', frame)

    # loop停止keyの設定(q)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

#キャプチャデバイスの終了
camera.release()
#プログラムの実行により追加されたウィンドウを全て停止
cv2.destroyAllWindows()

ここに顔検出と処理内容のプログラムを書き加えます。

https://github.com/opencv/opencv/tree/master/data/haarcascades
 上記のURLから分類機をダウンロードし、プログラムと同じファイル内に保存しておいてください。

program2

 import cv2

 camera = cv2.VideoCapture(0)

 #分類機を取得
 cascade_path = "haarcascade_frontalface_default.xmlの絶対パス"
 #CascadeClassifier - 分類機の読み込み
 cascade = cv2.CascadeClassifier(cascade_path)

 while True:
    ret, frame = camera.read()

    if not ret: break

 #detectMultiScale -  読み込んだ分類器をしようして顔を検出 
 #scaleFactor - 各画像スケールにおける縮小量
 #minNeighbors - 候補の矩形に含まれる近傍矩形の最低数
 #minSize – 物体の最小サイズ.これよりも小さい物体は無視されます

    facerect = cascade.detectMultiScale(frame, scaleFactor=1.1, minNeighbors=2, minSize=(30,30))

 #検出後の表示される矩形の色の設定(BGRであるため下記の場合は赤)
    rectangle_color = (0,0,255)

 # 検出できた場合
    if len(facerect) > 0:
        for rect in facerect:
        #tuple - 複数の要素を管理するデータ型の一種(要素を追加・削除・変更できない)
        #thickness - 線や円の太さ、-1は塗り潰し
            cv2.rectangle(frame, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), rectangle_color, thickness=2)
        # 顔部分の抽出
            cut_frame = frame[rect[1]:rect[1]+rect[3],rect[0]:rect[0]+rect[2]]
        # cv2.resize - サイズの変更
            cut_frame = cv2.resize(cut_frame,(rect[2]//20, rect[3]//20))
        #cv2.INTER_NEAREST - サイズの変更によるモザイク処理
            cut_frame = cv2.resize(cut_frame,(rect[2], rect[3]),cv2.INTER_NEAREST)

            frame[rect[1]:rect[1]+rect[3],rect[0]:rect[0]+rect[2]]=cut_frame

    cv2.imshow('camera', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

 camera.release()
 cv2.destroyAllWindows()

このようにモザイク処理をすることができました。