🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

OpenCV

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

Python

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

Q&A

解決済

2回答

1625閲覧

[python]opencvによるエラーの解決法がわかりません

takahiro_tt

総合スコア9

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

OpenCV

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

Python

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

0グッド

0クリップ

投稿2019/12/18 15:48

編集2019/12/20 06:29

前提・実現したいこと

https://qiita.com/neriai/items/6a662a49054bc544806d
上記サイトに書かれているような顔分類器を作成しようとしています

発生している問題・エラーメッセージ

Traceback (most recent call last): File "C:\Users?????\Anaconda3\envs\opencvtest001\testmain.py", line 198, in <module> img = cv2.resize(img, (IMAGE_SIZE, IMAGE_SIZE)) cv2.error: OpenCV(4.1.2) D:\Build\OpenCV\opencv-4.1.2\modules\imgproc\src\resize.cpp:3720: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'

該当のソースコード

python

1if __name__ == '__main__': 2 # ファイルを開く  3 f = open(FLAGS.train, 'r') 4 # データを入れる配列 5 train_image = [] 6 train_label = [] 7 8 for line in f: 9 # 改行を除いてスペース区切りにする 10 line = line.rstrip() 11 l = line.split() 12 13 # データを読み込んで28x28に縮小 14 # img_path = "C:/Users/hogehoge/Desktop/" 15 img = cv2.imread(l[0]) 16 img = cv2.resize(img, (IMAGE_SIZE, IMAGE_SIZE)) 17 18 # 一列にした後、0-1のfloat値にする 19 train_image.append(img.flatten().astype(np.float32)/255.0) 20 21 # ラベルを1-of-k方式で用意する 22 tmp = np.zeros(NUM_CLASSES) 23 tmp[int(l[1])] = 1 24 train_label.append(tmp) 25 26 # numpy形式に変換 27train_image = np.asarray(train_image) 28train_label = np.asarray(train_label) 29f.close() 30

試したこと

path = os.getcwd()

print(path)
で現在のディレクトリを確認したら、
>>> C:\Users?????\Anaconda3\envs\opencvtest001 
そして画像の置いてあるディレクトリは
C:\Users?????\Anaconda3\envs\opencvtest001\workspace\dir\train\me と
C:\Users?????\Anaconda3\envs\opencvtest001\workspace\dir\train\others
になります

https://teratail.com/questions/169158 同様に
img = cv2.imread(l[0]) のあとに
print(img)
を試してみた結果、none が帰ってきました

###追記(追加)
コメントにもあるように、3箇所でprint()を実行した結果をみると
以下の結果とエラーが出ました

html

1C:\Users?????\Anaconda3\envs\opencvtest001 2C/Users/?????/Anaconda3/envs/opencvtest001/workspace/dir/train/others/001.jpg 3 4Traceback (most recent call last): 5 File "C:\Users?????\Anaconda3\envs\opencvtest001\testmain.py", line 201, in <module> 6 print(img.shape) 7AttributeError: 'NoneType' object has no attribute 'shape'

パス以外が原因となると、画像のサイズか拡張子が考えられますが
拡張子はすべて.jpgで統一しています。
逆にサイズだと、大きくても640480まで、しかもプログラム中で2828に圧縮されるので関係ないと考えられます。

となるとどこが原因なのか、初心者の自分では思いつかず、どなたかわかる方がいたら教えていただきたいです。

###追記2
img = cv2.imread(l[0])の直前に os.path.exists(l[0]) でパスを確認したところ
C:\Users?????\Anaconda3\envs\opencvtest001で、実行ファイルが置いてあるところである。
また、imshowで画像が表示できるか試した結果以下のエラーがでました

html

1 img = cv2.imread(l[0]) 2 cv2.imshow("test",img) 3 cv2.waitKey(0) 4 cv2.destroyAllWindows() 5 6------------------------------- 7 発生したエラー 8Traceback (most recent call last): 9 File "C:\Users??????\Anaconda3\envs\opencvtest001\testmain.py", line 202, in <module> 10 cv2.imshow("test",img) 11cv2.error: OpenCV(4.1.2) D:\Build\OpenCV\opencv-4.1.2\modules\highgui\src\window.cpp:384: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow' 12

補足情報(FW/ツールのバージョンなど)

windows 10
python 3.7.4
opencv 4.1.0
opencv-python 4.1.2
tensorflow 2.0.0

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

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

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

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

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

tiitoi

2019/12/18 16:06

None のなったときに、print(l[0]) して表示されたパスに画像は存在していますか?
takahiro_tt

2019/12/18 17:08

はい print(l[0])を執行したところ C/Users/?????/Anaconda3/envs/opencvtest001/workspace/dir/train/me/263.jpg のように表示されました
takahiro_tt

2019/12/18 17:15

ディレクトリ内は以下のようになっています train |-others |-me |-data.txt (画像ファイルの入っているパスが示されたもの)
tiitoi

2019/12/19 17:30

imread する前にとりあえず os.path.exists(l[0]) の結果を見て、パスが存在するかどうか見てみてはどうでしょうか。 あと画像ファイル名が日本語だと読み込めないことがあるので、全部半角英数かどうか確認してください
takahiro_tt

2019/12/19 17:44

明日の朝以降しか触れないので、パスが存在するかどうか確認するのは遅れますが、画像ファイルはすべて半角英数字なのは確認済みです
takahiro_tt

2019/12/20 06:00

os.path.exists(l[0]) をimreadする前に試したところ C:\Users\?????\Anaconda3\envs\opencvtest001 の結果が帰ってきました。これは実行ファイルが置いてディレクトリと同じです。 画像ファイル(学習画像)はもう少し下の階層に置いてあります
guest

回答2

0

ベストアンサー

C:\Users?????\Anaconda3\envs\opencvtest001 の結果が帰ってきました。これは実行ファイルが置いてディレクトリと同じです。

os.path.exists() はファイルが存在する場合は True、そうでない場合は False を返します。なので、print() した場合の出力結果は True/False のどちらかのはずなので、パスが表示されているのはおかしいと思います。os.path.exists() の返り値を print() しましたか?

以下にパスが存在するかどうかをチェックした関数を用意したので、このcheck_path() を imread() にわたす直前にそのパスを指定して出力結果を教えてください。

python

1import os 2import cv2 3 4def check_path(path): 5 # 指定したパスが指している場所 6 abs_path = os.path.abspath(path) 7 print(f"specified path: {path} ({abs_path})") 8 9 # パスが存在しているかどうか 10 exists = os.path.exists(path) 11 print(f"- file exists: {exists}") 12 13 # OpenCV の imread が成功するかどうか 14 success = cv2.imread(path) is not None 15 print(f"- imread result: {success}") 16 17path = "image/sample.png" 18 19check_path(path)

投稿2019/12/20 06:16

tiitoi

総合スコア21956

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

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

takahiro_tt

2019/12/20 06:25

間違えてコードを入力していました。 正しく print(os.path.exists(l[0])) を入力したところ すべてfalseが帰ってきました。 つまり指定した場所にファイルが存在していない、ということですね。 画像は約1000枚あるので、フォルダにまとめずにそのままディレクトリ内に置くということはあまりしたくないのですが・・・
tiitoi

2019/12/20 06:33

False ということはパスが間違っています。 l[0] はどのような値なのでしょうか? 絶対パスでない (例えばファイル名だけとか) 場合は、画像がおいてあるディレクトリを os.path.join(画像がおいてあるディレクトリ, ファイル名) のように結合してあげる必要があります。 一番簡単なので、ファイル名が最初から絶対パスになっていることでしょう。そうすればこのような処理をする必要もなくなります。
takahiro_tt

2019/12/20 06:39

print8l[0])を実行すると、 C/Users/?????/Anaconda3/envs/opencvtest001/workspace/dir/train/me/261.jpg C/Users/?????/Anaconda3/envs/opencvtest001/workspace/dir/train/me/262.jpg C/Users/?????/Anaconda3/envs/opencvtest001/workspace/dir/train/me/263.jpg のように画像ファイルが置いてある絶対パスになっています
tiitoi

2019/12/20 06:42 編集

ドライブレターのコロン C: はないようですが、転記ミスでしょうか? エクスプローラーのアドレス欄に C/Users/?????/Anaconda3/envs/opencvtest001/workspace/dir/train/me を入力してそのフォルダに飛べますか?
takahiro_tt

2019/12/20 06:58

ありがとうございます。その通りでした。 何かものすごく間抜けでしたが、解決できたので一安心です。
guest

0

画像が見つからないようですね。
こちらと同様のようです。

https://ja.stackoverflow.com/questions/49260/python3-6-6%E3%81%AB%E3%81%A6cv2%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%BE%E3%81%99

l[0] にはちゃんと存在する画像パスが設定されていますか?

投稿2019/12/18 23:56

tashua314

総合スコア145

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

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

takahiro_tt

2019/12/19 05:27

はい print(l[0])を実行してみると、 C/Users/?????/Anaconda3/envs/opencvtest001/workspace/dir/train/me/???.jpg のように(???.jpgは連番)表示されます 参考にしたサイト(https://qiita.com/neriai/items/6a662a49054bc544806d) では,参照している部分がおそらく ''' flags.DEFINE_string('train', 'C:/Users/?????/Anaconda3/envs/opencvtest001/workspace/dir/train/data.txt', 'File name of train data') # 検証用テストデータ flags.DEFINE_string('test', 'C:/Users/?????/Anaconda3/envs/opencvtest001/workspace/dir/test/data.txt', 'File name of train data') # データを置いてあるフォルダ flags.DEFINE_string('train_dir', 'C:/Users/?????/Anaconda3/envs/opencvtest001/workspace/dir/data', 'Directory to put the training data.') ''' の部分です。もしかしてtrainディレクトリ中のdata.txtを読み込んで文字だけ表示してしまっているんですかね?画像が読み込めていない?
takahiro_tt

2019/12/19 05:41

https://ja.stackoverflow.com/questions/49260/python3-6-6%E3%81%AB%E3%81%A6cv2%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%BE%E3%81%99  を参考に3つともprin文を入力してみたら、以下のような結果とエラーが帰ってきました C:\Users?????\Anaconda3\envs\opencvtest001 C/Users/?????/Anaconda3/envs/opencvtest001/workspace/dir/train/others/001.jpg Traceback (most recent call last): File "C:\Users?????\Anaconda3\envs\opencvtest001\testmain.py", line 201, in <module> print(img.shape) AttributeError: 'NoneType' object has no attribute 'shape'
tashua314

2019/12/19 05:59

> 3つともprin文を入力してみたら 具体的には何をprintしましたか?
takahiro_tt

2019/12/19 07:05

参考にしたサイトと同様に f = open() のまえに print(os.getcwd()) cv2.imread() のまえに print(l[0]) cv2.imread() のあとに print(img.shape) です 上二つは問題なくパスが帰ってきますが、3つ目はエラーがでました
tashua314

2019/12/19 07:20

001.jpgは本当に画像なんですよね? あ、 C:\Users????? の?????ってなんですか? 日本語が文字化けしてるとかだったりします? もしそうならそれが原因かもです。
takahiro_tt

2019/12/19 07:41

いえ、自分の名前なので伏せただけです。 紛らわしくてすみません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問