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

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

詳細はこちら
Python

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

Q&A

解決済

2回答

3780閲覧

フォルダ内画像一括処理

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2021/01/15 09:43

https://www.robotech-note.com/entry/2016/12/08/204143
ここを元に、フォルダ内画像一括処理を試みようとしました。

python

1# -*- coding: utf-8 -*- 2import os 3import cv2 4 5def main(): 6 data_dir_path = u"./画像ディレクトリ名/" 7 file_list = os.listdir(r'./画像ディレクトリ名/') 8 9 for file_name in file_list: 10 root, ext = os.path.splitext(file_name) 11 if ext == u'.png' or u'.jpeg' or u'.jpg': 12 abs_name = data_dir_path + '/' + file_name 13 image = cv.imread(abs_name) 14 #以下各画像に対する処理を記載する 15 16if __name__ == '__main__': 17 main()

「#以下各画像に対する処理を記載する」の直下に、ある画像に関する処理を書き込めばよいのだと思うのですが、この「ある画像」のファイル名は何なんでしょうか?
「u」でも「u.png」でも「file_name」でも「file_name.png」でもなかった。

特定の画像を二値化するプログラムを作り、実際に動いたが、複数の画像に対し行う必要があるため、1つ1つやるのは大変であるから今度は一括処理をしたいと思ったのですが、

cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-wvn_it83\opencv\modules\core\src\arithm.cpp:1743: error: (-215:Assertion failed) ! _src.empty() in function 'cv::inRange'

という、ファイル名に起因?するエラーが出ます。

ちなみにとりあえず作ったプログラム(エラーが生じる)は、

python

1import os 2import cv2 3 4os.chdir('C://Users//username//Desktop//cv') 5 6def main(): 7 data_dir_path = u"./ok/" 8 file_list = os.listdir(r'./ok3/') 9 10 for file_name in file_list: 11 root, ext = os.path.splitext(file_name) 12 if ext == u'.png' or u'.jpeg' or u'.jpg': 13 abs_name = data_dir_path + '/' + file_name 14 image = cv.imread(abs_name) 15 #以下各画像に対する処理を記載する 16 17img = cv2.imread('file_name') # 画像の読み出し 18img = cv2.inRange(img, (120, 21, 145), (214,152,204)) 19 20cv2.imwrite('nitikafile_name',img) # 画像の保存 21 22if __name__ == '__main__': 23 main()

になりまう、ごく初歩的なところで引っかかっている気がします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Python

1for file_name in file_list: # ファイル名についてのループ 2 root, ext = os.path.splitext(file_name) # extに拡張子を取り出し 3 if ext == u'.png' or u'.jpeg' or u'.jpg': # 拡張子が画像ならば以下の処理 4 abs_name = data_dir_path + '/' + file_name # ファイルのパスをabs_nameに格納 5 image = cv.imread(abs_name) # abs_nameのファイルをcv.imreadで読み込み 6 #以下各画像に対する処理を記載する 7

となっています。したがって、読み込まれた画像はimageに格納されていると思います。

投稿2021/01/15 09:54

Amakaze

総合スコア313

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

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

退会済みユーザー

退会済みユーザー

2021/01/15 10:40

import os import cv2 os.chdir('C://Users//username//Desktop//cv') def main(): data_dir_path = u"./ok/" file_list = os.listdir(r'./ok3/') for file_name in file_list: root, ext = os.path.splitext(file_name) if ext == u'.png' or u'.jpeg' or u'.jpg': abs_name = data_dir_path + '/' + file_name image = cv.imread(abs_name) #以下各画像に対する処理を記載する img = cv2.inRange(image, (120, 21, 145), (214,152,204)) cv2.imwrite('nitikafile_name',img) # 画像の保存 if __name__ == '__main__': main() こう書いてみたのですが、 >>> img = cv2.inRange(image, (120, 21, 145), (214,152,204)) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'image' is not defined >>> >>> cv2.imwrite('nitikafile_name',img) # 画像の保存 Traceback (most recent call last): File "<stdin>", line 1, in <module> cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-wvn_it83\opencv\modules\imgcodecs\src\loadsave.cpp:753: error: (-215:Assertion failed) !_img.empty() in function 'cv::imwrite' と出ますね。
Amakaze

2021/01/15 10:57

imageに何も格納されていないとすると、forループの中で画像の読み込みができていないように思えます。 image = cv.imread(abs_name)の前後で適当にprintなどしてみて、そもそも、そこの処理に突入できているか確認してみてください。もしできていなければ、フォルダのパスを確認してみてください。
退会済みユーザー

退会済みユーザー

2021/01/15 11:20 編集

import os import cv2 os.chdir('C://Users//username//Desktop//cv') def main(): data_dir_path = u"./ok/" file_list = os.listdir(r'./ok3/') for file_name in file_list: root, ext = os.path.splitext(file_name) if ext == u'.png' or u'.jpeg' or u'.jpg': abs_name = data_dir_path + '/' + file_name print('出力したい文字列') とすると、出力したい文字列が表示されますね。
退会済みユーザー

退会済みユーザー

2021/01/15 11:26

ただなんか無茶苦茶エラー出てますね >>> for file_name in file_list: File "<stdin>", line 1 for file_name in file_list: IndentationError: unexpected indent >>> root, ext = os.path.splitext(file_name) File "<stdin>", line 1 root, ext = os.path.splitext(file_name) IndentationError: unexpected indent >>> if ext == u'.png' or u'.jpeg' or u'.jpg': File "<stdin>", line 1 if ext == u'.png' or u'.jpeg' or u'.jpg': IndentationError: unexpected indent >>> abs_name = data_dir_path + '/' + file_name File "<stdin>", line 1 abs_name = data_dir_path + '/' + file_name IndentationError: unexpected indent
Amakaze

2021/01/15 12:23

data_dir_path = u"./ok/" file_list = os.listdir(r'./ok3/') ここのフォルダ名が異なっているので、画像が正しく読めていないのではないでしょうか。 エラーについてはインデントをちゃんと合わせれば消えると思います。
退会済みユーザー

退会済みユーザー

2021/01/15 12:30

色々変えてみたのですが(作業フォルダは初期フォルダにしました) import os import cv2 def main(): data_dir_path = u"./ok/" file_list = os.listdir(r'./ok/') for file_name in file_list: root, ext = os.path.splitext(file_name) if ext == u'.png' or u'.jpeg' or u'.jpg': abs_name = data_dir_path + '/' + file_name image = cv.imread(abs_name) #以下各画像に対する処理を記載する img = cv2.inRange(image, (120, 21, 145), (214,152,204)) cv2.imwrite('21nitika.png',img) # 画像の保存 if __name__ == '__main__': main() とすると、 >>> img = cv2.inRange(image, (120, 21, 145), (214,152,204)) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'image' is not defined >>> >>> cv2.imwrite('21nitika.png',img) # 画像の保存 Traceback (most recent call last): File "<stdin>", line 1, in <module> cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-wvn_it83\opencv\modules\imgcodecs\src\loadsave.cpp:753: error: (-215:Assertion failed) !_img.empty() in function 'cv::imwrite' というエラーが出ます。
guest

0

処理する対象の場所には、abs_nameと書けば良いのです。

pythonでのいわゆる変数というものを理解してください。

投稿2021/01/15 09:47

ppaul

総合スコア24670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問