#1.はじめに
皆さんこんにちは!今回はpythonとOpenCVを扱って、カメラを起動させてリアルタイムで人の顔にモザイクを書けるプログラムを作成しました。
もしかしたら、すでに他の人が記事を書いているかもしれませんが…多分出ています。
とにかくやってみよう!
#2.手順
プログラムの流れはこちらになります。
1.カメラを起動させる。
2.人の顔を認識する。(Haar-like特徴分類器)
3.人の顔があるところをモザイク処理をする。
以上です。
#3.カメラを起動させる。
OpenCVを用いてカメラを起動させます。
import cv2
cap = cv2.VideoCapture(0)
while True:
ret, img = cap.read()
cv2.imshow('video image', img)#'video image'はカメラのウィンドウの名前
key = cv2.waitKey(10)
if key == 27: # ESCキーで終了
break
cap.release()
cv2.destroyAllWindows()
これでカメラの軌道はできますEscキーを押せばウィンドウが閉じてくれます。
#4.人の顔を認識させる(Haar-like特徴分類器)
OpenCVではHaar-like特徴分類器があらかじめ用意されています。便利です!
しかし、ファイルを保存しないと扱えないです。今回は人の顔を認識したいのでこちらのhaarcascade_frontalface_alt.xmlを扱います。
ちなみに、Haar-like特徴分類器とは画像の特徴をとられる特徴量から明暗差に着目したHaar-like特徴とアダブーストによってHaar-likeフィルタのサイズを変えながら特徴量を抽出し顔を検出しています。
では、カメラを起動して人の顔を認識させてみましょう。
import cv2
#Haar-like特徴分類器を扱えるようにする。
face_cascade_path="haarcascade_frontalface_alt.xml" #pathを指定してください。
face_cascade = cv2.CascadeClassifier(face_cascade_path)
cap = cv2.VideoCapture(0)
while True:
ret, img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)
#人の顔を矩形的に囲む
for x, y, w, h in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
face = img[y: y + h, x: x + w]
face_gray = gray[y: y + h, x: x + w]
cv2.imshow('video image', img)
key = cv2.waitKey(10)
if key == 27: # ESCキーで終了
break
cap.release()
cv2.destroyAllWindows()
これで人の顔を検出できました。
#5.モザイクをかける
モザイク処理は難しいことは考えずに顔画像を一旦縮小してから拡大して顔画像に張り付けます。
import cv2
#Haar-like特徴分類器を扱えるようにする。
face_cascade_path="haarcascade_frontalface_alt.xml"
face_cascade = cv2.CascadeClassifier(face_cascade_path)
ratio = 0.07 #ここの値を変えるとモザイクの粗さが変わる。
cap = cv2.VideoCapture(0)
while True:
ret, img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)
for x, y, w, h in faces:
#モザイクの処理を個々の二行でしている。
small = cv2.resize(img[y: y+h, x: x+w], None,fy=ratio, fx=ratio,interpolation=cv2.INTER_NEAREST)
img[y: y + h, x: x + w] = cv2.resize(small, (w, h), interpolation=cv2.INTER_NEAREST)
cv2.imshow('video image', img)
key = cv2.waitKey(10)
if key == 27: # ESCキーで終了
break
cap.release()
cv2.destroyAllWindows()
完成しました。
#6.まとめ
今回は、リアルタイムで顔認識して顔にモザイク加工を施しました。明暗差で分類しているため、似顔絵でも反応してしまいます。(誤検知も結構ある)ですが、短いコードで顔検出(顔認識)が試せるのでOpenCV楽しいです。
今までブログなどの情報発信をしたことがないためわかりにくい文章になっているかもしれません。
これから、情報発信をしていき文章力をつけていきたいと思います、また技術で遊べる人間になるのが僕の夢なので温かい目で見守っててください。
これから、よろしくお願いします。
それでは!