USBカメラを使ってリアルタイムで目にモザイクを入れるPythonプログラム
PythonのOpenCVを使ってUSBカメラで撮影した映像に、リアルタイムで目にモザイクを入れるプログラムを紹介します。
USBカメラ以外にパソコンのカメラを使う場合も載せています。
USBカメラを使ってリアルタイムで目にモザイクを入れている様子をYouTubeで投稿しています。
撮影している動画は「Pexels」の動画を使わさせてもらいました。
目次
・USBカメラを使ってリアルタイムで目にモザイクを入れるプログラム
・USBカメラで撮影している映像にリアルタイムで目にモザイクを入れている様子
USBカメラを使ってリアルタイムで目にモザイクを入れるプログラム
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 |
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:# 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: cv2.rectangle(img, (x, y), (x+w, y+h), (0,0,255), 3)#顔を囲む 誤認が多いから目を検出したら本物の顔として、四角で囲む 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(1)#動画の読み込み 0 WEBカメラ 1 USBカメラ while True: 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を使って動画に写る目にモザイクを入れる方法」で作成した”動画に写る目にモザイクを入れるプログラム”から変更した箇所だけ説明します。
26行目の映像の読み込みは cv2.VideoCapture(‘動画名前’)から cv2.VideoCapture(1)に変更しています。
cv2.VideoCapture(1)にすることでUSBカメラを起動し、映像を読み込めるようにしています。
パソコンのカメラを使う場合はcv2.VideoCapture(0)でカメラを起動し撮影が始まります。
ちなみに、ラズパイでUSBカメラを付けて実行する場合はcv2.VideoCapture(0)でカメラを起動します。
27行目から映像を1フレーム(画像)にして取り出す方法はfor文ではなくwhile文で実行し、ESCキーが入力されるまで撮影し続けます。
17行目は11行目でcv2.rectangleを書くと、口もとを顔と認識したときに、赤色の枠で囲んでしまったので、それを防ぐために目を認識した箇所の顔を本物の顔として、赤色の枠で囲むようにしています。
補足
顔を囲んでいる赤い枠を消したい場合は17行目の
cv2.rectangle(img, (x, y), (x+w, y+h), (0,0,255), 3)を消すか
#マークを先頭に入れる(#cv2.rectangle)と四角の赤い枠を消すことができます。
上のプログラムを実行した様子がこちら↓になります。
USBカメラで撮影している映像にリアルタイムで目にモザイクを入れている様子
cv2.VideoCapture(0)にすると、自分の顔の目にモザイクが入ります。
あと、メガネやマスクをしている場合は顔と認識されにくいので、モザイクを入れれないです。