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

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

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

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

Python

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

Q&A

解決済

1回答

446閲覧

プログラムの中断ができない

python_begin22

総合スコア1

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2022/06/09 05:33

編集2022/06/09 06:47

python初心者です。
画像ファイルを目視し、key操作(1or2or3)でそれぞれclass1,class2,class3に振り分けるプログラムを考えています。

1or2or3以外のkey操作が行われたらそのまま画像表示させ、1or2or3が入力されたら次の画像を表示させたいと思っております。
フォルダの中のファイルがなくなったら、プログラムは終了しますが、途中で中断させようとしたときにCtrl+cを受け付けません。
途中でプログラムを終了させるためにCtrl+zで強制終了しなくてはいけなく、Ctrl+cでプログラムを中断させたいのです。
while Trueが悪さをしているように思いますが、elseのあとにbreakをしてしまうと1or2or3以外のキー操作がされたときでも画像が次のものになってしまいます。

まとめますと
・1or2or3以外のキー操作をされたら、画像表示を維持したい。
・プログラムの途中でCtrl +c を受け付け正常処理させたい。

python

1 2import cv2 3import os 4import glob 5import shutil 6 7sort1='/home/user/Desktop/code.test/class1' 8sort2='/home/user/Desktop/code.test/class2' 9sort3='/home/user/Desktop/code.test/class3' 10target_dir='/home/user/Desktop/code.test' 11 12#保存先ディレクトリがなかったら作成する 13if not os.path.exists(sort1): 14 os.mkdir(sort1) 15if not os.path.exists(sort2): 16 os.mkdir(sort2) 17if not os.path.exists(sort3): 18 os.mkdir(sort3) 19 20 21filenames = os.listdir(target_dir) 22for file in filenames: 23 multiple = 2 24 img = cv2.imread(target_dir+'/'+file) 25 target_file=target_dir+'/'+file 26 27 if img is None: 28 print('through') 29 else: 30 height = img.shape[0] 31 width = img.shape[1] 32 img = cv2.resize(img , (int(width * multiple), int(height * multiple))) 33 cv2.imshow("image", img) 34 while True: 35 key = cv2.waitKey() 36 if key == 49: 37 shutil.move(target_file,sort1) 38 break 39 elif key == 50: 40 shutil.move(target_file,sort2) 41 break 42 elif key == 51: 43 shutil.move(target_file,sort3) 44 break 45 #他のキーが入力されたらそのままにする 46 else: 47 print('pass', str(key))

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

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

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

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

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

can110

2022/06/09 05:50

どのような操作(キー入力)によってどのような動作をさせたいのかが明確でないように思います。 「~したら~したい」を具体的に記載ください。
guest

回答1

0

ベストアンサー

「プログラムの途中でCtrl +c を受け付け正常処理させたい」

「プログラムを正常終了」なのか「何もせず次の画像へ移行」なのかがいまいち不明ですが、基本的な処理の流れのコードを提示します。
このコードでは

  • is_exitフラグを用いて途中で終了できるように
  • waitKeyは入力待ちする(無駄にループを回さない)ように

しています。その結果

キー処理
1,2,3振り分けて次の画像へ
n何もせず次の画像へ
e何もせずプログラム終了
それ以外再入力(今の画像表示を維持)

という動作をします。

Python

1import cv2 2import numpy as np 3 4is_exit = False 5for i in range(10): 6 if is_exit: 7 break 8 9 print(f'i={i}') 10 img = np.ones((64,48,3), np.uint8) * i * 25 11 cv2.imshow("image", img) 12 13 while True: 14 # OpenCV Python: How to detect if a window is closed? 15 # https://stackoverflow.com/questions/35003476/opencv-python-how-to-detect-if-a-window-is-closed 16 if cv2.getWindowProperty('image', cv2.WND_PROP_VISIBLE) < 1: 17 print('ユーザーがウインドウを閉じたので終了') 18 is_exit = True 19 break 20 21 key = cv2.waitKey(1000) # 1秒待つ 22 23 if key in [49,50,51]: 24 print(f'{chr(key)}の処理をして次の画像へ') 25 break 26 elif key == ord('n'): 27 print('何もせず次の画像へ') 28 break 29 elif key == ord('e'): 30 print('何もせず終了') 31 is_exit = True 32 break 33 else: 34 print('未入力or無効な入力なので再入力') 35 36cv2.destroyAllWindows()

投稿2022/06/09 06:56

編集2022/06/09 08:33
can110

総合スコア38262

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

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

python_begin22

2022/06/09 07:37

ご連絡ありがとうございます。 こちらのコードを試させていただきました。 「e」が入力されたら、フラクで終了するといったこと参考にさせていただきます。 こちらのコードでも同様ですが、実行中にCtrl + cを受け付けないのですが、こちらの原因をご教示いただければ幸いです。 初心者で申し訳ございません。
can110

2022/06/09 08:04

画像ウインドウを表示しているので、GUI上でのキー処理が優先実行されるようです。 当方Windows環境では「Ctrl+C」にて画像がクリップボードにコピーされます。 なお、回答コードにてユーザーが画像ウインドウを×ボタンなどで閉じた場合にキー入力ループが抜けられなくなっていたので修正しました。
python_begin22

2022/06/09 08:13

回答ありがとうございます。 私はubuntu環境ですが、画像ウインドウを☓ボタンで閉じても終了処理されず操作を受け付けない状態になりました。 Windows環境と実行結果が異なるのでしょうか?
can110

2022/06/09 08:21

OpenCVがバックエンドで使っているGUIはOSなど環境により異なるので、その結果、挙動が異なっていると思います。
python_begin22

2022/06/09 08:36

承知いたしました。 ありがとうございます。
can110

2022/06/09 08:36

ウインドウが閉じられているかを明示的にチェックするように回答コードを修正しました。 ubuntu環境での動作は未確認ですが、ユーザーがウインドウ閉じた後、遅くとも1秒後にはプログラム終了すると思います。
python_begin22

2022/06/09 08:39

ubnutuでも試して見ましたが完璧に動作しました。 大変助かりました。 canさんのようにコードすらすらかけるようになりたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問