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   Faceクラスにget_edge_faceメソッドを実装 Faceクラスに顔が移ったらエッジ化するget_edge_faceメソッドを実装した。 [python title=”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,…

Python OpenCV3でLaplacianメソッドを使ってエッジ(輪郭)抽出

(1次)微分オペレータだと指定した直線の傾きの方向から得られるエッジしか取得できない。 そこで、2次微分オペレータでエッジを取得してみる。 [amazonjs asin=”4061538225″ locale=”JP” title=”OpenCVによる画像処理入門 (KS情報科学専門書)”]   前提 ディレクトリ構成などはこことかこことか。 &nbsp 元画像 微分オペレータのときと比較するために、同じ蔵の画像(kura.jpg)を使う。   大体の仕組み 以下の画像の通り。 わかりづらいけど、実際に計算してみるとわかる。   Laplacianメソッドの使い方 Laplacianメソッドの使い方は次の通り。 [python title=”Laplacianメソッドの使い方”] cv2.Laplacian(img_src, 出力画像のbit深度, オペレータのサイズ) [/python] 出力画像のbit深度は以下の中から選択できる。 cv2.CV_16S cv2.CV_16UC2 cv2.CV_32FC4 cv2.CV_64FC1 cv2.CV_8SC3 cv2.CV_16SC1 cv2.CV_16UC3 cv2.CV_32S cv2.CV_64FC2 cv2.CV_8SC4 cv2.CV_16SC2 cv2.CV_16UC4 cv2.CV_32SC1 cv2.CV_64FC3 cv2.CV_8U cv2.CV_16SC3 cv2.CV_32F cv2.CV_32SC2 cv2.CV_64FC4 cv2.CV_8UC1 cv2.CV_16SC4 cv2.CV_32FC1 cv2.CV_32SC3 cv2.CV_8S cv2.CV_8UC2 cv2.CV_16U cv2.CV_32FC2 cv2.CV_32SC4 cv2.CV_8SC1 cv2.CV_8UC3 cv2.CV_16UC1 cv2.CV_32FC3 cv2.CV_64F cv2.CV_8SC2 cv2.CV_8UC4 オペレータのサイズは、大体の仕組みのところのオペレータの縦横の大きさを指定する。 5にすれば5×5のオペレータになる。   2次微分のよるエッジ検出 2次微分でエッジ検出をしてみる。 sourceディレクトリにlaplacian.pyを作成する。 [python title=”laplacian.pyの内容”] # -*- coding: utf-8 -*- import cv2 import numpy as np if __name__ == ‘__main__’: # 画像の読み込み img_src = cv2.imread("./image/karasu.jpg", 1) # 2次微分オペレータを使って画像のエッジを検出 img_tmp = cv2.Laplacian(img_src, cv2.CV_32F, 8) img_lap = cv2.convertScaleAbs(img_tmp) # 表示 cv2.imshow("Show LAPLACIAN Image", img_lap) cv2.waitKey(0) cv2.destroyAllWindows() [/python]…

Python OpenCV3でSobelメソッドを使ってエッジ(輪郭)抽出

OpenCV3では微分オペレータでのエッジ検出のメソッドが用意されていない。 (というよりもあまり必要ない) そのため、Sobelメソッドでのエッジ検出を行う。 [amazonjs asin=”4061538225″ locale=”JP” title=”OpenCVによる画像処理入門 (KS情報科学専門書)”]   前提 ディレクトリ構成などはこことかこことか。   元画像 縦横の線がはっきりしているとわかりやすいため、蔵の画像(kura.jpg)を使う。   Sobelメソッドの使い方 Sobelメソッドの使い方は次の通り。 [python title=”Sobelメソッドの使い方”] cv2.Sobel(img_src, 出力画像のbit深度, xに関する微分の次数, yに関する微分の次数) [/python] 出力画像のbit深度は以下の中から選択できる。 cv2.CV_16S cv2.CV_16UC2 cv2.CV_32FC4 cv2.CV_64FC1 cv2.CV_8SC3 cv2.CV_16SC1 cv2.CV_16UC3 cv2.CV_32S cv2.CV_64FC2 cv2.CV_8SC4 cv2.CV_16SC2 cv2.CV_16UC4 cv2.CV_32SC1 cv2.CV_64FC3 cv2.CV_8U cv2.CV_16SC3 cv2.CV_32F cv2.CV_32SC2 cv2.CV_64FC4 cv2.CV_8UC1 cv2.CV_16SC4 cv2.CV_32FC1 cv2.CV_32SC3 cv2.CV_8S cv2.CV_8UC2 cv2.CV_16U cv2.CV_32FC2 cv2.CV_32SC4 cv2.CV_8SC1 cv2.CV_8UC3 cv2.CV_16UC1 cv2.CV_32FC3 cv2.CV_64F cv2.CV_8SC2 cv2.CV_8UC4 xに関する微分の次数, yに関する微分の次数は例えば、(1, 0)だと横方向のエッジ検出、(0, 1)だと縦方向のエッジ検出、(1, 1)だと右斜め45°のエッジ検出となる。   横方向のエッジ検出 横方向のエッジ検出をしてみる。 sourceディレクトリにsobel.pyを作成する。 [python title=”sobel.pyの内容”] # -*- coding: utf-8 -*- import cv2 import numpy as np if __name__ == ‘__main__’: # 画像の読み込み img_src = cv2.imread("./image/kura.jpg", 1) # 横方向のSobelオペレータのエッジ検出 img_tmp = cv2.Sobel(img_src, cv2.CV_32F, 1, 0) img_sobel = cv2.convertScaleAbs(img_tmp) # 表示 cv2.imshow("Show SOBEL Image", img_sobel) cv2.waitKey(0)…