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

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

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

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

Python 3.x

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

Python

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

Q&A

解決済

1回答

6688閲覧

Pythonによる画像仕分けプログラム

kaitokimura

総合スコア59

OpenCV

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2017/07/18 05:17

編集2017/07/18 05:20

簡単な画像仕分けプログラムを作成したいです。
内容は画像を表示させその画像を人間が黙視し
0、1、2キーを押したら任意のフォルダに画像が移動するプログラムを作成したいです。
動物フォルダの画像を1枚ずつ表示させ
0キーは猫フォルダ
1キーは犬フォルダ
2キーはその他フォルダに移動させ
次の画像を表示させ仕分けるを繰り返すプログラムを作成したいです。
現在このような感じですが動きません。いい方法と何がいけないのかを教えてください。
モジュールはopencvにこだわりません。

lang

1import cv2 2import os 3import shutil 4# def load_lists(list_dir): 5# classes = list_dir.read().split() 6# list_dir.close() 7# return classes 8 9#classes,///list 10IMG_SIZE=150 11link0='/Users/hoge/Downloads/猫' 12link1='/Users/hoge/Downloads/犬' 13link2='/Users/hoge/Downloads/’その他' 14link3='/Users/hoge/Downloads/動物' 15data_list = os.listdir(link3) 16 17for data in data_list: 18 if(os.path.basename(data) == '.DS_Store'): 19 print('Escape') 20 else: 21 img = cv2.imread(data) 22 img = cv2.resize(img,(IMG_SIZE,IMG_SIZE)) 23 img = img/255.0 24 cv2.imgshow(data,img) 25 if cv2.waitKey(48): 26 shutil.move(link3,link0) 27 cv2.destroyAllwindows() 28 elif cv2.waitKey(49): 29 shutil.move(link3,link1) 30 cv2.destroyAllwindows() 31 elif cv2.waitKey(50): 32 shutil.move(link3,link2) 33 cv2.destroyAllwindows() 34

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえず以下の部分はこうした方がいいと思います。
waitKey()の引数は待ち時間[ms]で、返り値が入力キーです。
引数を省略した場合、キー入力があるまで待ってくれます。

Python

1key = cv2.waitKey() 2if key == 48: 3 shutil.move(link3,link0) 4elif key == 49: 5 shutil.move(link3,link1) 6elif key == 50: 7 shutil.move(link3,link2) 8

ファイル名がそもそも正しく得られているか確認するコード

Python

1import os 2 3link3='/Users/hoge/Downloads/動物' 4data_list = os.listdir(link3) 5 6for data in data_list: 7 print(data)

画像を表示、入力キーを判別するまでは出来ましたよ。Windowsですが...

Python

1filenames = os.listdir(src) 2for file in filenames: 3 img = cv2.imread(src+'/'+file) 4 if img is None: 5 print('through') 6 else: 7 cv2.imshow("image", img) 8 key = cv2.waitKey() 9 10 if key == 48: 11 print('0') 12 elif key == 49: 13 print('1') 14 elif key == 50: 15 print('2') 16 else: 17 print('pass', str(key))

投稿2017/07/18 05:23

編集2017/07/18 06:44
LouiS0616

総合スコア35660

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

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

kaitokimura

2017/07/18 05:27

ありがとうございます。笑 ですがデータの渡し方が根本的な問題のようです。 OpenCV Error: Assertion failed (ssize.area() > 0) in resize, file /Users/jenkins/miniconda/1/x64/conda-bld/conda_1486587097465/work/opencv-3.1.0/modules/imgproc/src/imgwarp.cpp, line 3229 これは経験的に意味のない値をリサイズに与えている気がします…。
LouiS0616

2017/07/18 05:30

imreadした直後にimshow, waitkeyをしてみてください。 表示できないのであれば読み取りに問題が、出来るのであればresizeの使い方に問題があることになります。
kaitokimura

2017/07/18 05:33

読み取りに問題があるようです。1枚1枚画像を開きたい場合どのような値の渡し方をするべきでしょうか?
LouiS0616

2017/07/18 05:36

追記のコードを試してみてください。
LouiS0616

2017/07/18 05:36

ファイル名が正しく得られているか確認してから、imreadの可否を考えるべきかと。
kaitokimura

2017/07/18 06:12

ファイル名は正しく得られていました。 openしてからimreadに渡す必要があるようですがまずカレントディレクトリに入れるとopencvがみつかりませんとなりそのためopenにわたすパスを絶対パスにした結果からはディレクトリですみたいな怒られ方をしました。
LouiS0616

2017/07/18 06:14

imread(link3 + '/' + data)のように、 絶対パスで指定してもうまくいきませんか?
LouiS0616

2017/07/18 06:24

ひごろC++でOpenCVを組んでいるので少し調べましたが、imreadより先にopenする必要はないようです。
kaitokimura

2017/07/18 07:12

大変助かりました。絶対パスをjoinで作って見たのですがたぶんまちがっていたようです。Louiさんの教えてくださった通りに指定したら動きました。ただキーボードを2回ずつ押さなければ移動しないのですがこれは仕様でしょうか?実装の仕方が問題でしょうか?
LouiS0616

2017/07/18 07:13

cv2.waitKey()を二回呼び出していませんか?
kaitokimura

2017/07/18 07:14 編集

key = cv2.waitKey() if cv2.waitKey(): if key == 48: shutil.move(link4,link0) elif key == 49: shutil.move(link4,link1) elif key == 50: shutil.move(link4,link2) これしか関連記述はありません。
LouiS0616

2017/07/18 07:15

二行目が不要です。
kaitokimura

2017/07/18 07:19

ありがとうございました。不要だった部分を復習して見たいと思います。 効率が3倍にはなったので本当に助かりましたありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問