MacbookAirのカメラで顔が写ったら顔のエッジ抽出(Python3+OpenCV3+PIL)
シリーズ:
MacbookAirのカメラで顔が写ったらモザイク加工(Python3+OpenCV3+PIL)
MacbookAirのカメラで顔が写ったら顔をエッジ抽出(Python3+OpenCV3+PIL)
MacbookAirのカメラで顔が写ったら顔をネガポジ変換(Python3+OpenCV3+PIL)
MacbookAirのカメラで顔が写ったら顔を笑い男マーク(Python3+OpenCV3+PIL)
前提
MacbookAirのカメラで顔が写ったらモザイク加工(Python3+OpenCV3+PIL)で作ったFaceクラスを作成しておく。
github のfaces.py
Faceクラスにget_edge_faceメソッドを実装
Faceクラスに顔が移ったらエッジ化するget_edge_faceメソッドを実装した。
def get_edge_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) # 2次微分オペレータを使って画像のエッジを検出 img_tmp = cv2.Laplacian(cut_face, cv2.CV_32F, 8) cut_face = cv2.convertScaleAbs(img_tmp) # 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
実行してみる。
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) # qを押したら終了。 k = cv2.waitKey(1) if k == ord('q'): break cap.release() cv2.destroyAllWindows()
(opencv_python)$ python faces.py
エッジ化!