前提・実現したいこと
ここに質問の内容を詳しく書いてください。
pythonで顔検出のプログラムをコピペして試していました。
実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
OpenCV(4.2.0) /Users/travis/build/skvark/opencv-python/opencv/modules/objdetect/src/cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'detectMultiScale'
該当のソースコード
python
1import cv2, os, argparse, shutil 2 3# 切り抜いた画像の保存先ディレクトリ 4SAVE_PATH = "./outputs/" 5 6# 基本的なモデルパラメータ 7FLAGS = None 8 9# 学習済モデルの種類 10CASCADE = ["default","alt","alt2","tree","profile","nose"] 11 12# 直接実行されている場合に通る(importされて実行時は通らない) 13if __name__ == "__main__": 14 parser = argparse.ArgumentParser() 15 parser.add_argument( 16 "--cascade", 17 type=str, 18 default="alt", 19 choices=CASCADE, 20 help="cascade file." 21 ) 22 parser.add_argument( 23 "--scale", 24 type=float, 25 default=1.3, 26 help="scaleFactor value of detectMultiScale." 27 ) 28 parser.add_argument( 29 "--neighbors", 30 type=int, 31 default=2, 32 help="minNeighbors value of detectMultiScale." 33 ) 34 parser.add_argument( 35 "--min", 36 type=int, 37 default=80, 38 help="minSize value of detectMultiScale." 39 ) 40 parser.add_argument( 41 "--input_dir", 42 type=str, 43 default="./input/", 44 help="The path of input directory." 45 ) 46 parser.add_argument( 47 "--move_dir", 48 type=str, 49 default="/done/", 50 help="The path of moving detected files." 51 ) 52 53# パラメータ取得と実行 54FLAGS, unparsed = parser.parse_known_args() 55 56# 分類器ディレクトリ(以下から取得) 57# https://github.com/opencv/opencv/blob/master/data/haarcascades/ 58# https://github.com/opencv/opencv_contrib/blob/master/modules/face/data/cascades/ 59 60# 学習済モデルファイル 61if FLAGS.cascade == CASCADE[0]:#"default": 62 cascade_path = "./models/haarcascade_frontalface_default.xml" 63elif FLAGS.cascade == CASCADE[1]:#"alt": 64 cascade_path = "./models/haarcascade_frontalface_alt.xml" 65elif FLAGS.cascade == CASCADE[2]:#"alt2": 66 cascade_path = "./models/haarcascade_frontalface_alt2.xml" 67elif FLAGS.cascade == CASCADE[3]:#"tree": 68 cascade_path = "./models/haarcascade_frontalface_alt_tree.xml" 69elif FLAGS.cascade == CASCADE[4]:#"profile": 70 cascade_path = "./models/haarcascade_profileface.xml" 71elif FLAGS.cascade == CASCADE[5]:#"nose": 72 cascade_path = "./models/haarcascade_mcs_nose.xml" 73 74#カスケード分類器の特徴量を取得する 75faceCascade = cv2.CascadeClassifier(cascade_path) 76 77# 顔検知に成功した数(デフォルトで0を指定) 78face_detect_count = 0 79 80# 顔検知に失敗した数(デフォルトで0を指定) 81face_undetected_count = 0 82 83# フォルダ内ファイルを変数に格納(ディレクトリも格納) 84files = os.listdir(FLAGS.input_dir) 85 86# 成功ファイルを移動いない場合は、出力用のディレクトリが存在する場合、削除して再作成 87if FLAGS.move_dir == "": 88 if os.path.exists(SAVE_PATH): 89 shutil.rmtree(SAVE_PATH) 90 os.mkdir(SAVE_PATH) 91 92print(FLAGS) 93 94# 集めた画像データから顔が検知されたら、切り取り、保存する。 95for file_name in files: 96 97 # ファイルの場合(ディレクトリではない場合) 98 if os.path.isfile(FLAGS.input_dir + file_name): 99 100 # 画像ファイル読込 101 img = cv2.imread(FLAGS.input_dir + file_name) 102 103 # 大量に画像があると稀に失敗するファイルがあるのでログ出力してスキップ(原因不明) 104 if img is None: 105 print(file_name + ':Cannot read image file') 106 continue 107 108 # カラーからグレースケールへ変換(カラーで顔検出しないため) 109 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 110 111 # 顔検出 112 face = faceCascade.detectMultiScale(gray, scaleFactor=FLAGS.scale, minNeighbors=FLAGS.neighbors, minSize=(FLAGS.min, FLAGS.min)) 113 114 if len(face) > 0: 115 for rect in face: 116 # 切り取った画像出力 117 cv2.imwrite(SAVE_PATH + str(face_detect_count) + file_name, img[rect[1]:rect[1] + rect[3], rect[0]:rect[0] + rect[2]]) 118 face_detect_count = face_detect_count + 1 119 120 # 検出できたファイルは移動 121 if FLAGS.move_dir != "": 122 shutil.move(FLAGS.input_dir + file_name, FLAGS.input_dir + FLAGS.move_dir) 123 else: 124 print(file_name + ':No Face') 125 face_undetected_count = face_undetected_count + 1 126 127print('Undetected Image Files:%d' % face_undetected_count)
### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/05 06:13