PythonのOpenCVを使って動画に写る目にモザイクを入れる方法
PythonのOpenCVを使って動画に写る目にモザイクを入れる方法を紹介します。
読み込んで表示した動画は「Pexels」の動画を使わさせてもらいました。
静止画で写る目にモザイクを入れるプログラムはこちら「検出した目にモザイクを入れるプログラム Python」の投稿で紹介しています。PythonプログラムはColaboratoryで実行しています。
顔と目を検出するときに使うhaarcascadeファイルのダウンロード方法はこちら「OpenCVを使った顔と目の検出方法 Python」の投稿で紹介しています。
目次
・動画に写る目にモザイクを入れるプログラム
・目にモザイクを入れている様子
動画に写る目にモザイクを入れるプログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
import cv2 face_cascade=cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")#顔を検出するカスケードファイル eye_cascade = cv2.CascadeClassifier("haarcascade_eye.xml")#目を検出するカスケードファイル def detectface(img):# img_gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#グレイ画像 images = face_cascade.detectMultiScale(img_gray)#顔の検出 for x,y,w,h in images:# cv2.rectangle(img, (x, y), (x+w, y+h), (0,0,255), 3)#顔を囲む face=img[y:y+h,x:x+w]#顔切り取る face_gray=img_gray[y:y+h,x:x+w]#顔のグレイ画像 eyes = eye_cascade.detectMultiScale(face_gray)#目の検出 half_face=face.shape[0]//2#顔の高さを半分にした値を求める for ex,ey,ew,eh in eyes: if ey <= half_face:#half_faceの値以下の高さの位置で目を検出した場合 #モザイク処理 eye=face[ey:ey+eh,ex:ex+ew]#目を切り取る height,width=eye.shape[:2]#高さと幅を取り出す eye_m = cv2.resize(eye,(4,4))#画像の縮小 eye_m = cv2.resize(eye_m, (width, height),interpolation=cv2.INTER_NEAREST)#元の画像サイズにする face[ey:ey+eh,ex:ex+ew]=eye_m#モザイクにしたデータを埋め込む mv= cv2.VideoCapture('pexels-anastasia-shuraeva-6014532.mp4')#動画の読み込み frame_count =int(mv.get(cv2.CAP_PROP_FRAME_COUNT))#動画を画像にしたときの総枚数 for i in range(frame_count):#総枚数繰り返す ch,frame=mv.read()#動画から1フレーム(画像)を取り出す if ch==True:#取り出せたか確認 size=(640,480) frame=cv2.resize(frame,size)#サイズ調整 detectface(frame)#自作関数の呼び出し cv2.imshow('movie', frame)#表示 k=cv2.waitKey(1)#1ミリ秒wait if k==27:#ESCキーを押したとき break mv.release() cv2.destroyAllWindows() |
このプログラムは「PythonのOpenCVを使った目の検出で鼻を囲まないようにする方法」の”鼻を囲まないようにするプログラム”から20~24行目を変更したプログラムになるので、その部分のプログラムを説明します。
20行目は顔画像のデータ(face)から14行目で検出した目の座標を使って目を切り取り、変数eyeに目の画像データを入れています。
21行目は切り取った目の画像データから高さと幅のデータを取り出して、変数height,widthに入れています。
22行目は目を縮小しています。ここの(4,4)の値が小さいほどモザイクが濃くなり、大きいほど薄くなります。
23行目は21行目で取り出した高さと幅(height,width)のデータとcv2.INTER_NEARESTを用いて、元の画像サイズに拡大します。
目の画像を縮小してから、元のサイズに拡大することでモザイクのようになります。
※INTER_NEAREST は最近傍補間という意味です。
最近傍補間の意味 については西住工房さんのこちら↓の投稿で紹介しています。
動画に写る目にモザイクを入れるプログラムを実行した様子がこちら↓になります。