前編:私の好きなジブリ絵は顔が中心なのか。python初心者(Ep18)
おはようございます!前回に顔検出が出来た事の喜びで、燃え尽きかけていました。笑。
今回から、タイトルで今回の記事が何か。を分かる様に記載しようと思います。 というのが、自分で書く記事に対しての友好的な使い方としては、
記事を振り返り、どの様なプロセスで実施できたか振り返ること
を目標にしていました。しかし、何という事でしょう。タイトルがすべて一緒で結局中身を見ないと気づかない と気づきました。笑。その為、これからはタイトルと表紙画像は変更を使用と思いますので、宜しくお願い致します。それでは本日も行ってきましょう!
準備1:画像の連続読み出し
今回、私が保存している映画の種類は、「ハウルの動く城」「風立ちぬ」「もののけ姫」の三本になります。それぞれの画像が50個ありまして、それぞれの画像を読み込みができる状態にしたいと思います。
※注意:下のプログラムでは、3種類x1枚ずつでトライをしているコードですので、実際に活用する時は画像枚数に合わせて記載下さい。
#映画名のリスト
mo_names=["howl","kazetachinu","mononoke"]
#映画名毎に実施
for name in mo_names:
for num in range(1,2):
#活用するリンク先の確保
pick_file = "original_photo/{}{}.jpg".format(name,str(num).zfill(3))
print (pick_file)
#活用する画像の読み込み
pick_img = cv.imread('./{}'.format(pick_file))
#画像をグレーに変換
#読み込んだときの画像をグレーに変換
gray_t = cv.cvtColor(pick_img, cv.COLOR_BGR2GRAY)
#閾値処理を実施
#type:しきい値threshより大きい値がmaxvalに、それ以外の値が0に置き換えられる
# cv.threshold(img, thresh , maxval , type)
ret, thresh = cv.threshold(gray_t,80,255,cv.THRESH_BINARY)
#画像表示
thresh_display = cv.cvtColor(thresh,cv.COLOR_BGR2RGB)
fig = plt.figure(1,(10,10))
plt.imshow(thresh_display)
※出力結果
お~~~。いい感じ!
これで、リンク先の画像を抽出し、抽出した画像に対して、今回ではグレーに画像変換。を行う事はできましたね。
※最後のピックアップした画像に対してのみ、画像表示がされていますので、ご注意ください!これでループする文章の中で、画像の抽出、画像の変換ができましたので、輪郭抽出を行っていきたいと思います。
準備2:検出した輪郭座標をリストで検出(ステップ1)
前回の記事で記載した様に、輪郭を検出した場合は、座標情報が入手できることが分かりました。その為、
その輪郭画像情報をリスト化して保存
することを考えたいと思います。しかし、やりながらである事もあり、ステップを踏みます。ご了承下さい。まずは下記をトライしました。
#映画名のリスト
mo_names=["howl","kazetachinu","mononoke"]
# カスケード型識別器の読み込み
cascade = cv.CascadeClassifier("./lbpcascade_animeface-master/lbpcascade_animeface.xml")
#映画名毎に実施
for name in mo_names:
for num in range(1,2):
#活用するリンク先の確保
pick_file = "original_photo/{}{}.jpg".format(name,str(num).zfill(3))
print (pick_file)
#活用する画像の読み込み
pick_img = cv.imread('./{}'.format(pick_file))
#画像をグレーに変換
#読み込んだときの画像をグレーに変換
gray_t = cv.cvtColor(pick_img, cv.COLOR_BGR2GRAY)
# 顔領域の探索
face = cascade.detectMultiScale(gray_t, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))
print(face)
print(type(face))
# 顔領域を赤色の矩形で囲む
for (x, y, w, h) in face:
cv.rectangle(pick_img, (x, y), (x + w, y+h), (0, 0, 200), 3)
#画像表示
img_face_display = cv.cvtColor(pick_img,cv.COLOR_BGR2RGB)
fig = plt.figure(1,(10,10))
plt.imshow(img_face_display)
出力結果はこちら。(レンジを映画毎に1枚のみでトライにしていますので、活用時は修正下さい)
ここで、二つの事を理解することができました。
①輪郭を抽出できていない場合は、タプル型(要素無し)になっている
②輪郭は複数抽出されることがある
これは大きな1歩です。その為、要素が何個あるか。によって、判断を分ける必要がありそうですね。また、変なところに顔認証が!笑。これまた、発見ですね。
準備3:輪郭を何個検出されるのか抽出
輪郭の個数が何個検出されたのか。この情報をファイル名に合わせて追加したいと思います。
#映画名のリスト
mo_names=["howl","kazetachinu","mononoke"]
# カスケード型識別器の読み込み
cascade = cv.CascadeClassifier("./lbpcascade_animeface-master/lbpcascade_animeface.xml")
#顔の抽出した個数は何個か
pick_num =[]
#検出したすべてのリスト
pick_name_all =[]
#映画名毎に実施
for name in mo_names:
for num in range(1,51):
#活用するリンク先の確保
pick_file = "original_photo/{}{}.jpg".format(name,str(num).zfill(3))
print (pick_file)
#活用する画像の読み込み
pick_img = cv.imread('./{}'.format(pick_file))
#画像をグレーに変換
#読み込んだときの画像をグレーに変換
gray_t = cv.cvtColor(pick_img, cv.COLOR_BGR2GRAY)
# 顔領域の探索
face = cascade.detectMultiScale(gray_t, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))
# 顔領域を赤色の矩形で囲む
for (x, y, w, h) in face:
cv.rectangle(pick_img, (x, y), (x + w, y+h), (0, 0, 200), 3)
#案1
#何のファイルにどの数だけの検出ができているのか
pick_num = "{}{}_pick{}".format(name,num,len(face))
#検出した名前をリスト化
pick_name_all.append(pick_num)
#案2
#検出した名前をリスト化
#pick_name_all.append(len(face))
#画像表示
img_face_display = cv.cvtColor(pick_img,cv.COLOR_BGR2RGB)
fig = plt.figure(1,(10,10))
plt.imshow(img_face_display)
print(pick_name_all)
出力結果(一部抜粋):
思ったよりも検出が少ない・・。
コードの補足:
案1は、抽出したファイル名に合わせて、記録をとる方法と、案2はピックアップした輪郭件数のみ を集める方法にしています。のちのち、データセットの中に追加することも考えて、案1を私は選択して活用します。
※のちのち「本当に抽出したファイルに対してできているのか。」を確認することを考えると、よいかと思いますので。
これで輪郭の検出数は分かりましたね。それでは次回は、
後編:私の好きなジブリ絵は顔が中心なのか。python初心者
を実施したいと思います。宜しくお願い致します。