[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()
    

    여기에 얼굴 검출 및 처리 내용의 프로그램을 추가합니다.

    htps : // 기주 b. 코 m / 오렌지 cv / 오페인 cv / t 레에 / 마 s r / data /
    위의 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()
    



    이렇게 모자이크 처리를 할 수 있었습니다.

    좋은 웹페이지 즐겨찾기