#0. はじめに
諸事情により動画の顔部分を別の顔に差し替える必要が出来たのですが、ググってもそれらしいソフトウェアが見つからないので、pythonの勉強がてら作成してみます。
ざっくりと方針としては
・動画内の顔を各フレームで認識する
・認識した顔の上に指定した画像を上書きする
ということをしたいと思います。
python3.5 + OpenCV3 を利用します。
#1. 環境構築
以下のサイトを参考にeclipse + Anacondaで環境を構築しました。
特に特筆すべきことはしてないのでこれだけで
eclipse + pydevインストール
EclipseとPydevでpython開発環境を整えてみる
Anaconda + OpenCVインストール
Python 環境のインストール
#2. 顔認識
まずははじめの一歩として単一の画像ファイルを読み込み、画像内の顔を認識し、矩形で囲んで出力します。
基本的には以下の記事を参考にPython3.5+OpenCV3用に書きなおしただけです。
python+OpenCVで顔認識をやってみる
流れとしては
・画像の読み込み
・顔認識のためにグレースケールに変換
・顔を認識
・認識した画像を矩形で囲む
・結果画像をファイル出力
という感じです。
認識対象はよく使われるというLennaの画像データを用います。
#coding=utf-8
import cv2
# 認識対象ファイルの指定
image_path = "target/Lenna.png"
# 認識対象ファイルの読み込み
image = cv2.imread(image_path)
# グレースケールに変換
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 顔認識用特徴量のファイル指定
cascade_path = "haarcascades/haarcascade_frontalface_alt.xml"
# カスケード分類器の特徴量を取得する
cascade = cv2.CascadeClassifier(cascade_path)
# 顔認識の実行
facerecog = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))
# 認識した顔を囲む矩形の色を指定。ここでは白。
color = (255, 255, 255)
if len(facerecog) > 0:
# 認識した顔全てを矩形で囲む
for rect in facerecog:
# 認識結果を表示
print ("認識結果")
print ("(x,y)=(" + str(rect[0]) + "," + str(rect[1])+ ")" + \
" 高さ:"+str(rect[2]) + \
" 幅:"+str(rect[3]))
cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2)
# 認識結果の出力
cv2.imwrite("result/Lenna_result.png", image)
#3. 結果
コンソール出力
認識結果
(x,y)=(215,201) 高さ:175 幅:175
うまくいきました。
認識結果の座標は認識した部分の左上の角になるようです。
#4. 最後に
とりあえずPython3.5 + OpenCV3の動作確認と、顔の認識ができることを確認できました。
続きは次回に。
Python + OpenCV で雑コラ動画を作成する② 静止画コラ作成