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

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

新規登録して質問してみよう
ただいま回答率
85.48%
dlib

dlibは、機械学習のC++の画像処理ライブラリの一つ。性能の高い顔の器官検出が簡単にでき、Pythonバインドもあります。オープンソースで無料で使用でき、機械学習以外の様々な機能も搭載されています。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

2997閲覧

error: (-215:Assertion failed) src.cols > 0 && src.rows > 0 in function 'cv::warpAffine'

Tetsuya_Kosaka

総合スコア1

dlib

dlibは、機械学習のC++の画像処理ライブラリの一つ。性能の高い顔の器官検出が簡単にでき、Pythonバインドもあります。オープンソースで無料で使用でき、機械学習以外の様々な機能も搭載されています。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/07/27 13:45

編集2020/07/27 14:01

pythonでOpencvやdlibを使って顔を切り取るプログラムを作成しているのですが、下記プログラムの戻り値箇所でエラー起こってしまいます。
自分で調べても見ても解決方法が見つかりませんでした。画像のPathもあっています。

python

1def fitting_rotated_image(img, angle): 2 # 画像の縦、横のサイズを取得する 3 height, width = img.shape[:2] 4 # 画像の中心値を取得 5 center = (int(width/2), int(height/2)) 6 # 度からラジアンに変換(deg to rad) 7 radians = np.deg2rad(angle) 8 # 回転の変換行列 9 M = cv2.getRotationMatrix2D(center, angle, 1.0) 10 11 new_width = int(abs(np.sin(radians) * height) + abs(np.cos(radians) * width)) 12 new_height = int(abs(np.sin(radians) * width) + abs(np.cos(radians) * height)) 13 14 M[0,2] += int((new_width-width)/2) 15 M[1,2] += int((new_height-height)/2) 16 17 # アファイン変換した画像を返す(ここでエラーが発生sa) 18 return cv2.warpAffine(img, M, (new_width, new_height))
Traceback (most recent call last): File "dlib_face_cut.py", line 82, in <module> rotated_im = fitting_rotated_image(face_im, angle) File "dlib_face_cut.py", line 26, in fitting_rotated_image return cv2.warpAffine(img, M, (new_width, new_height)) cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\imgproc\src\imgwarp.cpp:2594: error: (-215:Assertion failed) src.cols > 0 && src.rows > 0 in function 'cv::warpAffine'

ディレクトリ内に10万枚近くの画像が入っているのですが、必ず1270枚目でエラーが出ます。(画像に不備があるのかと思い、1270枚目の画像を取り除き実行してみても結果は同じ)

理由がわかる方、教えていただけたら幸いです。宜しくお願い致します。

追加事項

programの全体を載せます。宜しくお願い致します。

python

1import cv2 2import numpy as np 3import math 4import dlib 5import os 6import glob 7import time 8 9def fitting_rotated_image(img, angle): 10 # 画像の縦、横のサイズを取得する 11 height, width = img.shape[:2] 12 # 画像の中心値を取得 13 center = (int(width/2), int(height/2)) 14 # 度からラジアンに変換(deg to rad) 15 radians = np.deg2rad(angle) 16 # 回転の変換行列 17 M = cv2.getRotationMatrix2D(center, angle, 1.0) 18 19 new_width = int(abs(np.sin(radians) * height) + abs(np.cos(radians) * width)) 20 new_height = int(abs(np.sin(radians) * width) + abs(np.cos(radians) * height)) 21 22 M[0,2] += int((new_width-width)/2) 23 M[1,2] += int((new_height-height)/2) 24 25 # アファイン変換した画像を返す 26 return cv2.warpAffine(img, M, (new_width, new_height)) 27 28start = time.time() 29 30# 顔の位置を取得する 31detector = dlib.get_frontal_face_detector() 32# 顔の68箇所の位置の座標を取得する 33predictor = dlib.shape_predictor('./shape_predictor_68_face_landmarks.dat') 34 35# ディレクトリ内の画像を指定 36image_list = glob.glob('./~/*') 37count = 1 38pro_time = 0 39# 新しいディレクトリを作成 40os.makedirs('~', exist_ok = True) 41# for文で一枚ずつ処理していく 42for image in image_list: 43 pro_start = time.time() 44 pro_time += 1 45 print("Processint Time :", pro_time) 46 # 処理する画像を指定 47 im = cv2.imread(image, cv2.IMREAD_COLOR) 48 49 # 画像が見つからない場合 50 if im is None: 51 print("count:", count, '画像が見つかりません') 52 #exit() 53 continue 54 55 rects = detector(im, 1) 56 57 if len(rects) == 0: 58 print("count:", count, '顔が抽出されませんでした') 59 #exit() 60 continue 61 62 for index, rect in enumerate(rects): 63 64 # 顔だけ切り出す 65 rectWidth = rect.width() 66 rectHeight = rect.height() 67 rectCenter = rect.center() 68 x_start = rectCenter.x - rectWidth 69 x_end = x_start + rectWidth * 2 70 y_start = rectCenter.y - rectHeight 71 y_end = y_start + rectHeight * 2 72 face_im = im[y_start:y_end, x_start:x_end] 73 74 # 顔の角度を修正 75 points = [] 76 for point in predictor(im, rect).parts(): 77 points.append([int(point.x), int(point.y)]) 78 79 x_diff = points[45][0] - points[36][0] 80 y_diff = points[45][1] - points[36][1] 81 angle = math.degrees(math.atan2(y_diff, x_diff)) 82 rotated_im = fitting_rotated_image(face_im, angle) 83 84 # 回転後の画像で顔検出して画像保存 85 rotated_rects = detector(rotated_im, 1) 86 if len(rotated_rects) == 0: 87 print("count:", count, '顔が抽出されませんでした') 88 continue 89 90 else: 91 rotated_rect = rotated_rects[0] 92 x_start = rotated_rect.left() 93 x_end = rotated_rect.right() 94 y_start = rotated_rect.top() 95 y_end = rotated_rect.bottom() 96 cropped_im = rotated_im[y_start:y_end, x_start:x_end] 97 98 cv2.imwrite('./~.jpg'.format(count), cropped_im) 99 pro_finish = time.time() 100 101 print("count", count, "finish.") 102 print("Processing Time:", pro_finish - pro_start, "sec") 103 104 count += 1 105 106 print("\n") 107 108finish = time.time() 109 110print("All Processing Time:", finish - start, "sec") 111print(count, "face")

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

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

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

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

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

yuki23

2020/07/27 13:55

ソースコードの全体を貼ってください
Tetsuya_Kosaka

2020/07/27 14:01

たったいま修正いたしました。宜しくお願い致します。
can110

2020/07/27 23:15

エラーが発生を取り除く際、その画像のファイル名を特定したうえで取り除いたでしょうか? glob.globの返すファイルリストは順不同なので、エラーの発生しないファイルを除外した可能性もありえます。 また、差し支えなければその画像を提示すると再現確認ができるので回答得られやすくなります。
Tetsuya_Kosaka

2020/07/29 11:33

>can100さん コメントありがとうございます。 ファイルはナンバリングしてあります。1270.jpgというファイルを取り除いて実行しても結果は同じです。(こういうことですか?) globについてなのですが、すみません私が理解力がなくて…どういうことでしょうか… 画像は動画フレームを画像化したものです。顔が映っているのでお見せできませんごめんなさい(涙)
can110

2020/07/29 11:46

エラーが発生したのがglob.globした結果のリストから1270番目というわけではなく「1270.jpg」だと特定できていれば、それでよいです。
yuki23

2020/07/29 12:09

ソースコードを見る限り、画像のファイル名を出力させたりはしていないようですが、どうやって 1270.jpg が原因だと判断しましたか? ということです glob の結果はファイル名でソートされているとは限らないので、count = 1270 だからといって 1270.jpg というファイル名とは限りません(そもそも、ファイル名がどのような規則でつけられているかも提示されていませんが)
Tetsuya_Kosaka

2020/07/29 12:16 編集

>yuki23さん すみません。ここには載せていないのですがプログラムの48行目にprint("Processint Time :", pro_time, "File Name :", os.path.basename(image))を追加して試しています。 そして分かったことなのですが、エラーになるのは1269.jpgでした。すみません。 (画像のプロパティを調べてみても他の画像と変わったところはありませんでした。) ちなみに、45行目のfor文をfor image in natsorted(image_list):に変更してやってみましたが、変わりませんでした...。
guest

回答1

0

やるべきことは

  • 1269.jpg を除いて実行してみる

 エラーがでなければ1269.jpgが原因の可能性が高い
1269番目で同じくエラーとなればアルゴリズム側の原因の可能性が高い
別の箇所で同じエラーとなれば蓄積した値がオーバーフローなどのアルゴリズム側の可能性が高い

  • 1269.jpgを別の名前にして(実施順を変えて)例えば

 1269.jpgを1200.jpgに、1200.jpgを1269.jpgで実行してみる

 1200番目で同じエラーとなればやはりその画像が原因の可能性が高い
1269番目で同じエラーとなればアルゴリズム側の原因の可能性が高い

などと絞れると思います。
「画像のプロパティ」だけではわからないと思われます。

投稿2020/08/08 04:34

aokikenichi

総合スコア2218

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問