MacbookAirのカメラで顔が写ったら顔を笑い男マーク(Python3+OpenCV3+PIL)

シリーズ:
MacbookAirのカメラで顔が写ったらモザイク加工(Python3+OpenCV3+PIL)
MacbookAirのカメラで顔が写ったら顔をエッジ抽出(Python3+OpenCV3+PIL)
MacbookAirのカメラで顔が写ったら顔をネガポジ変換(Python3+OpenCV3+PIL)
MacbookAirのカメラで顔が写ったら顔を笑い男マーク(Python3+OpenCV3+PIL)

[amazonjs asin="4061538225″ locale="JP" title="OpenCVによる画像処理入門 (KS情報科学専門書)"]

前提

MacbookAirのカメラで顔が写ったらモザイク加工(Python3+OpenCV3+PIL)で作ったFaceクラスを作成しておく。

github のfaces.py

 

笑い男マーク(smileman.jpg)を準備

笑い男マークを検索し、source/image配下にsmileman.jpgを設置しておく。

 

Faceクラスにget_smileman_faceメソッドを実装

Faceクラスに顔が移ったらエッジ化するget_smileman_faceメソッドを実装した。

[python title="get_smileman_faceメソッドの内容"]
def get_smileman_faces(self, image, min_size=(100, 100)):
"""
顔を笑い男マークにするメソッド。
image: cv2.imreadで読み取った変数
min_size: 顔判定する最小サイズの指定。
"""

# イメージをpillowで扱うことのできる形式に変換しておく。
img_edit = Image.fromarray(image)

# 笑い男マーク呼び出し
img_smileman = Image.open("./image/smileman.jpg")

# OpenCV用のデータに変換
img_smileman = np.asarray(img_smileman)

# pillowではRGB、OpenCVではGBRのため、色の順番を並べ替え。
img_bgr = cv2.split(img_smileman)
img_smileman = cv2.merge((img_bgr[2], img_bgr[1], img_bgr[0]))

# pillow用のデータに変換
img_smileman = Image.fromarray(img_smileman)

# 顔認識
faces = self.get_faces(image, min_size)

# 顔があった場合。
if len(faces) > 0:

# 複数の顔があった場合、1つずつ四角で囲っていく。
for face in faces:

# 顔の部分の左上のx,y座標(微調整)
face_x = face[0] -50
face_y = face[1]
# 顔の部分の横の長さと縦の長さ(微調整)
face_height = face[1]+face[3] – 50

tmp_smileman = img_smileman.resize((face_height, face_height), Image.LINEAR)

# 元の画像に加工した顔画像を貼り付ける。
img_edit.paste(tmp_smileman, tuple((face_x, face_y)))

#pillow用のデータをOpenCVデータに変換
img_opencv = np.asarray(img_edit)

return img_opencv
[/python]

実行してみる。

[python title="faces.pyの実行部分"]
if __name__ == '__main__’:

face = Face()

"""
image = cv2.imread("./image/physicists.jpg", 1)
mosaic_faces = face.get_mosaic_faces(image, min_size=(10, 10))

# 表示
cv2.imshow("Show MOSAIC Image", mosaic_faces)
cv2.waitKey(0)
cv2.destroyAllWindows()
"""

# カメラからキャプチャー
cap = cv2.VideoCapture(0)

while(True):

# 動画ストリームからフレームを取得
ret, frame = cap.read()

# モザイク処理
# frame = face.get_mosaic_faces(frame, ratio=40)
# cv2.imshow('MOSAIC FACE’, frame)

# エッジ
# frame = face.get_edge_faces(frame)
# cv2.imshow('EDGE FACE’, frame)

# ネガポジ変換
# frame = face.get_negaposi_faces(frame)
# cv2.imshow("NEGAPOSI FACE", frame)

# 笑い男
frame = face.get_smileman_faces(frame)
cv2.imshow("SMILEMAN FACE", frame)

# qを押したら終了。
k = cv2.waitKey(1)
if k == ord('q’):
break

cap.release()
cv2.destroyAllWindows()

[/python]

[shell]
(opencv_python)$ python faces.py
[/shell]

スクリーンショット 2015-07-11 12.33.56

 

笑い男マーク!
ちなみに攻殻はみたことありません。