検出した目にモザイクを入れるプログラム Python
PythonのOpenCVを使って検出した目の位置にモザイクを入れるプログラムを紹介します。
顔と目の検出はこちら「OpenCVを使った顔と目の検出方法 Python」の投稿で書いているので、この投稿ではモザイクのプログラムをメインに紹介します。
PythonプログラムはColaboratoryで実行しています。
目次
・顔と目の検出と目にモザイクを入れるプログラム
・モザイクの検証
顔と目の検出と目にモザイクを入れるプログラム
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 43 44 45 46 47 48 49 50 51 52 53 |
import cv2 import matplotlib.pyplot as plt face_cascade = cv2.CascadeClassifier("./drive/My Drive/haarcascade_frontalface_alt2.xml") eye_cascade = cv2.CascadeClassifier("./drive/My Drive/haarcascade_eye.xml") def face_eye(image): #読み込んだ画像の表示 face_show=cv2.cvtColor(image, cv2.COLOR_BGR2RGB) plt.imshow(face_show) plt.show() eyes=[] img_gray=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#グレイ画像 faces = face_cascade.detectMultiScale(img_gray)#顔の検出 if len(faces) != 0:#顔検出できた場合 for (x,y,w,h) in faces: face=image[y:y+h,x:x+w]#読み込んだ画像から検出した顔の座標を使って顔を切り取る face_gray=img_gray[y:y+h,x:x+w]#グレイ画像から顔を切り取る eyes = eye_cascade.detectMultiScale(face_gray)#目の検出 #顔の表示 face_show=cv2.cvtColor(face, cv2.COLOR_BGR2RGB) plt.imshow(face_show) plt.show() face_eye=face.copy()#顔画像をコピー 目を囲むのとモザイクで使う else: print("顔を検出できませんでした。") if len(eyes) != 0:#目を検出できた場合 for (ex,ey,ew,eh) in eyes:#目 #目を四角で囲む cv2.rectangle(face_eye, (ex, ey), (ex+ew, ey+eh), (255,0,0), thickness=3)#四角で囲む #モザイク処理 eye=face[ey:ey+eh,ex:ex+ew]#目を切り取る height,width=eye.shape[:2]#高さと幅を取り出す eye_m = cv2.resize(eye,(7,7))#画像の縮小 eye_m = cv2.resize(eye_m, (width, height),interpolation=cv2.INTER_NEAREST)#元の画像サイズにする face[ey:ey+eh,ex:ex+ew]=eye_m#モザイクにしたデータを埋め込む #目を四角で囲んだ顔を表示 face_show=cv2.cvtColor(face_eye, cv2.COLOR_BGR2RGB) plt.imshow(face_show) plt.show() #目にモザイクを入れた顔を表示 face_show=cv2.cvtColor(face, cv2.COLOR_BGR2RGB)# plt.imshow(face_show) plt.show() else: print("目を検出できませんでした。") frame=cv2.imread("./drive/My Drive/girl_green.jpg")#画像の読み込み face_eye(frame)#自作関数 face_eyeの呼び出し |
モザイク処理の34~38行目のプログラムをメインに説明します。
実行結果は下にあります。
34行目は18行目で切り取った顔画像のデータ(face)から20行目で検出した目の座標を使って目を切り取り、変数eyeに目の画像データを入れています。
35行目は切り取った目の画像データから高さと幅(height,width)のデータを取り出します。
36行目は目を縮小しています。ここの(7,7)の値が小さいほどモザイクが濃くなり、大きいほど薄くなります。
37行目は35行目で取り出した高さと幅(height,width)のデータとcv2.INTER_NEARESTを用いて、元の画像サイズに拡大します。
目の画像を縮小してから、元のサイズに拡大することでモザイクのようになります。
※INTER_NEAREST は最近傍補間という意味です。
最近傍補間の意味 については西住工房さんの「【画像処理】最近傍補間法の原理・計算式 | 西住工房 」 この投稿で紹介されています。
↓実行結果↓


モザイクの検証
cv2.resize(eye,(7,7))の(7,7)の値を小さくすることでモザイクが濃くなり、逆に大きくすることで薄くなるので、その値が(1,1)の場合と(10,10)の場合の比較をします。
●cv2.resize(eye,(1,1))の場合

(1,1)の場合はモザイクではなく、黒い四角を目に貼りつけた画像になります。
●cv2.resize(eye,(10,10))の場合

(10,10)の場合はモザイクが薄くなり、ぼんやりですがどんな形の目をしているのかわかります。