質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

385閲覧

openCVを用いた顔検出について

taka-ken

総合スコア17

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/08/10 10:16

openCVを用いて顔検出するコードを書いたのですが、ディレクトリ(今回はarimura-faceというディレクトリ)は作られるのですが、肝心の顔を検出した画像がそのディレクトリ内に出力されません。実行時にエラーはありませんでした。
*ちなみにcasacade xmlはhaarcascade_frontalface_alt2.xmlをインストールしました。

実行したコード

import cv2 import numpy as np import glob import os cascade_file_face = "face.xml" cascade_face = cv2.CascadeClassifier(cascade_file_face) files = glob.glob("/Users/User/Desktop/pythonAtom/face-detection/arimurakasumi/*") #ただし、Userには私の名前が入ります。 #pythonAtomは私が作ったディレクトリです。 for fname in files: dir_name = "./{0}".format("arimura-face") if not os.path.exists(dir_name): os.makedirs(dir_name) filepath = dir_name + "/{0}.jpg".format(fname) img = cv2.imread(fname,cv2.IMREAD_COLOR) #↑ fnameをデフォルト(カラーモード)で読み込んでimgに渡す。 img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #↑ imgをグレイスケールに変換してimg_grayに渡す。 face_list = cascade_face.detectMultiScale(img_gray,minSize=(20,20)) #↑ GS画像に対して顔検出を適用します。→detectMultiScale(顔を探して見つけた顔のリストをface_listに返す関数。) #↑ minSize=どのぐらい小さい領域まで検索するか。 if len(face_list) > 0: #↑ GS化した画像が入ったface_listリストの要素をlenght関数で数える→0より大きい場合を考える。 for (x,y,w,h) in face_list: color = (0,0,225) pen_w = 2 cv2.rectangle(img, (x,y), (x+w,y+h), color, thickness = pen_w) cv2.imwrite(filepath,img) #↑ 変換後の画像の保存(imwrite) ”保存名、保存するもの” #↑ 今回はfnameを保存名としているので上書き保存している。(別名で保存する場合は"out.jpg"などと指定する。) cv2.destroyAllWindows() #↑ 全てのウィンドウを閉じる関数。

*コード内に説明が多く書かれており見づらいかと思いますが、ご了承ください。

私は、恐らくどこかのパス指定が間違っていると考えていますが、お手上げ状態です。以下にディレクトリとファイルの構造をお示しします。

Desktop/pythonAtom/face-detection
→このface-detection(ディレクトリ)の中に
①arimurakasumiというディレクトリ(この中に顔検出したい元画像100枚あり)
②face-detection2.pyという上記でお示ししたコードファイル
③face.xml
の3つが入っております。

今回は、このface-detection(ディレクトリ)に④arimura-faceというディレクトリを作ろうと思い、それ自体は正常に作れました。しかし、このarimura-face内に顔検出した画像が全く出力されていませんでした。

プログラミングを学び始めて半年ほど経ちますが、未だ、コードを書くお作法が身についておりません。
ぜひご教授いただければ幸いです。よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2019/08/10 10:26

if len(face_list) > 0:の中にprint(face_list)なりを入れてみて if文の中に処理が入っているかを確認した結果を追記ください。
taka-ken

2019/08/10 10:31

can110さん、ご回答ありがとう御座います。 if len(face_list) > 0:の中にprint(face_list)を追加してみたところ以下のような出力となりました。 [[49 55 87 87]] [[94 66 76 76]] [[119 33 63 63]] [[81 38 72 72]] [[151 26 43 43]] [[82 44 60 60]] [[100 36 101 101]] [[ 75 10 119 119]] [[52 33 65 65]] [[115 36 68 68]] [[58 60 93 93]] [[96 45 75 75]] [[115 40 72 72]] [[79 40 73 73]] [[85 32 84 84]] [[68 33 75 75]] [[45 87 81 81]] [[138 65 34 34]] [[41 39 89 89]] [[111 22 47 47]] [[ 62 45 109 109]] [[ 81 12 121 121]] [[95 43 78 78]] [[196 41 72 72]] [[93 19 89 89]] [[ 31 60 105 105]] [[103 69 63 63]] [[76 55 47 47]] [[ 65 52 109 109]] [[ 64 58 105 105]] [[100 41 90 90]] [[108 33 51 51]] [[75 58 88 88]] [[ 91 10 113 113]] [[88 54 72 72]] [[131 20 37 37]] [[ 53 44 124 124]] [[ 44 57 111 111]] [[80 19 84 84]] [[53 63 76 76]] [[112 30 57 57]] [[92 37 93 93]] [[68 42 75 75]] [[ 51 43 106 106]] [[64 55 99 99]] [[117 39 71 71]] [[63 39 84 84]] [[95 57 62 62]] [[105 44 95 95]] [[69 47 76 76]] [[99 17 73 73]] [[84 44 83 83]] [[ 46 56 87 87] [ 66 121 56 56]] [[75 47 70 70]] [[ 81 49 91 91] [ 96 121 63 63]] [[70 58 31 31] [27 69 39 39]] [[118 24 50 50]] [[106 30 76 76]] [[ 64 44 103 103]] [[86 27 90 90]] [[ 20 68 133 133]] [[99 15 78 78]] [[110 31 96 96]] [[105 28 73 73]] [[72 40 75 75]] [[12 79 98 98]] [[110 50 56 56]] [[ 37 54 118 118]] [[102 50 78 78]] [[111 33 74 74]] [[ 40 46 114 114]] [[74 47 59 59]] [[99 31 79 79]] [[35 76 83 83]] [[70 58 31 31] [27 69 39 39]] [[ 53 17 100 100]] [[112 18 96 96]] [[65 66 72 72]] [[31 47 90 90]] [[52 58 79 79]] [[ 70 43 124 124]] [[95 38 78 78]] [[ 88 43 101 101]] [[ 62 46 134 134]] [[61 36 57 57]] [[168 20 44 44]] [[ 2 67 116 116]] [[ 47 59 123 123]] [[93 35 72 72]] [[101 37 65 65]] [[ 85 5 134 134]] [[ 8 81 82 82]] [[94 34 87 87]]
meg_

2019/08/10 10:46

1.顔検出自体はされているのですね? 2.「arimura-face」ディレクトリには何か保存されていますか?
can110

2019/08/10 10:47

追記ありがとうございます。filepathの問題ですね。
taka-ken

2019/08/10 10:51

@meg_さん 1.何もエラーがないので検出自体は正常に機能していると思われます。 2.arimura-face(ディレクトリ)は正常に作られるのですが、その中には何も保存されておりません。
guest

回答1

0

ベストアンサー

fnameにはフルパスが格納されますので、filepath./arimura-face/Users/User/Desktop/pythonAtom/face-detection/arimurakasumi/hoge.jpgのように意図しないパスになってしまいます。
filepath = dir_name + "/{0}".format(os.path.split(fname)[1])のようにファイル名のみを抽出するように修正ください。

投稿2019/08/10 10:55

can110

総合スコア38234

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taka-ken

2019/08/10 10:59

@can110 素早くて分かりやすいご回答ありがとう御座います。おかげさまで、顔検出した画像が正常にarimura-faceにアウトプットされました。
taka-ken

2019/08/10 11:05

@can110さん ちなみにで恐縮なのですが、先ほど行った、print(face-list)によって出力された数字は何を意味するのでしょうか?
can110

2019/08/10 11:11

後続のcv2.rectangle部分を見れば分かる通り、顔と検出された領域を意味しています。 [[1,2,3,4],[5,6,7,8]]のように複数個検出されることもあり、2重リストになっています。
taka-ken

2019/08/10 11:21

@can110さん 確かに私はxとyで座標を、wとhで検出範囲を定義しましたが、そのことなのですね。 勉強になりました。ありがとう御座いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問