MacbookAirのカメラで顔が写ったら顔をネガポジ変換(Python3+OpenCV3+PIL)

2015年7月16日

シリーズ:
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

 

ネガポジ変換

ネガポジ変換に関してはネガポジ変換の章で。

Python OpenCV3でネガポジ変換(濃淡値を反転する)
Python OpenCV3でもっと簡単なネガポジ変換(濃淡の変換)

&ngsp;

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

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

[python title="get_negaposi_faceメソッドの内容"]
def get_negaposi_faces(self, image, min_size=(100, 100)):
"""
顔をネガポジ変換するメソッド。
image: cv2.imreadで読み取った変数
min_size: 顔判定する最小サイズの指定。
"""

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

# 顔認識
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] – 100
# 顔の部分の横の長さと縦の長さ(微調整)
face_width = face[0]+face[2] + 50
face_height = face[1]+face[3] + 100

# 顔を切り抜く
cut_face = img_edit.crop((face_x,
face_y,
face_width,
face_height))

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

cut_face = 255 – cut_face

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

# 元の画像に加工した顔画像を貼り付ける。
img_edit.paste(cut_face, 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)

# 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.16.36

 

ネガポジ変換!