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

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

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

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

Python 3.x

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

Q&A

解決済

3回答

8517閲覧

Pythonで一定時間だけ処理したい

mochisio

総合スコア19

OpenCV

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

Python 3.x

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

1グッド

1クリップ

投稿2018/01/29 05:27

前提・実現したいこと

あらかじめ指定した処理時間で、if name == 'main':の処理を打ち切りたいのですがどうすれば良いですか?

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

エラーメッセージ

該当のソースコード

import

1 2if __name__ == '__main__': 3 # 定数定義 4 ESC_KEY = 27 # Escキー 5 INTERVAL= 33 # 待ち時間 6 FRAME_RATE = 30 # fps 7 r=0 8 #カウンタ用演算子 9 ORG_WINDOW_NAME = "org" 10 11 12 DEVICE_ID = 0 13 14 # 分類器の指定 15 cascade_file = "C:/Users/wakimoto/Anaconda2/Library/etc/haarcascades/haarcascade_frontalface_alt.xml" 16 cascade = cv2.CascadeClassifier(cascade_file) 17 18 19 # カメラ映像取得 20 cap = cv2.VideoCapture(DEVICE_ID) 21 #カメラ映像録画の用意 たぶん2フレーム/秒が限界  22 fourcc = cv2.VideoWriter_fourcc(*'WMV1') 23 out = cv2.VideoWriter('output.wmv',fourcc, 2.0, (640,480)) 24 25 26 # 初期フレームの読込 27 end_flag, c_frame = cap.read() 28 height, width, channels = c_frame.shape 29 30 # ウィンドウの準備 31 cv2.namedWindow(ORG_WINDOW_NAME) 32 33 34 # 変換処理ループ 35 while end_flag == True: 36 37 ret, frame = cap.read() 38 color = (0, 0, 255) 39 40 # 画像の取得と顔の検出 41 img = c_frame 42 img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 43 #検出器の最小サイズを決める 44 face_list = cascade.detectMultiScale(img_gray, minSize=(1, 1) ) 45 46 # フレーム表示 47 cv2.imshow(ORG_WINDOW_NAME, c_frame) 48 49 frame = cv2.flip(frame,0) 50 51 # write the flipped frame 52 53 54 55#物体認識(顔認識)の実行 56#image – CV_8U 型の行列.ここに格納されている画像中から物体が検出されます 57#objects – 矩形を要素とするベクトル.それぞれの矩形は,検出した物体を含みます 58#scaleFactor – 各画像スケールにおける縮小量を表します 59#minNeighbors – 物体候補となる矩形は,最低でもこの数だけの近傍矩形を含む必要があります 60#flags – このパラメータは,新しいカスケードでは利用されません.古いカスケードに対しては,cvHaarDetectObjects 関数の場合と同じ意味を持ちます 61#minSize – 物体が取り得る最小サイズ.これよりも小さい物体は無視されます 62 facerect = cascade.detectMultiScale(img_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1)) 63 64 #facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=3, minSize=(10, 10), flags = cv2.cv.CV_HAAR_SCALE_IMAGE) 65 66 67 68 if len(facerect) > 0: 69 #検出した顔を囲む矩形の作成 70 for rect in facerect: 71 cv2.rectangle(img, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2) 72 #フレームごとに枠の分だけカウントが増える 73 r +=1 74 75 76 # フレーム表示(枠つけた後) 77 cv2.imshow(ORG_WINDOW_NAME, c_frame) 78 79 #フレーム書き込み 80 out.write(c_frame) 81 # Escキーで終了 82 key = cv2.waitKey(INTERVAL) 83 if key == ESC_KEY: 84 break 85 86 # 次のフレーム読み込み 87 end_flag, c_frame = cap.read() 88 89 # 終了処理 90 cv2.destroyAllWindows() 91 out.release() 92 cap.release() 93 94 #全フレーム分の検出数がprintされる 95 print(r) 96

試したこと

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

引用したコードはWebカメラで顔検出した数を数えるコードです。

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答3

0

python

1from os import _exit as exit 2from threading import Timer 3from time import sleep 4 5 6if __name__ == "__main__": 7 Timer(10, exit, args=(1, )).start() # 10秒後にos._exit(1)を呼ぶ 8 9 for i in range(20): 10 print(i, "秒") 11 sleep(1)

python

1from os import getpid 2from os import kill 3from threading import Timer 4from time import sleep 5from signal import SIGTERM 6 7 8if __name__ == "__main__": 9 Timer(10, kill, args=(getpid(), SIGTERM)).start() # 10秒後にos.kill(PID, SIGTERM)を呼ぶ 10 11 for i in range(20): 12 print(i, "秒") 13 sleep(1)

投稿2018/01/29 09:19

編集2018/01/29 09:25
YouheiSakurai

総合スコア6142

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

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

mkgrei

2018/01/29 09:26

これは便利ですね。 勉強になります。
YouheiSakurai

2018/01/29 09:32

ありがとうございます。後者のほうがSIGINTやCTRL_C_EVENTで安全に停止できるかもしれないという点でスマートかもしれません。ご参考までに。
guest

0

ベストアンサー

ちょっと質問の意図(やりたいこと)が把握できていないかもしれませんが、__main__処理というより変換処理ループにて、指定時間が来たらループを抜けるようにしてもよいかと思います。

処理時間のトータルで打ち切りする場合

Python

1import time 2if __name__ == '__main__': 3 # 略 4 MAX_TIME = 100 # 打ち切り時間(トータルで) [sec] 5 6 # 変換処理ループ 7 while end_flag == True: 8 # 変換処理。略 9 10 # Escキーで終了 11 key = cv2.waitKey(INTERVAL) 12 if key == ESC_KEY: 13 break 14 15 # 打ち切り時間が来た 16 if (time.time() - prevTime) >= MAX_TIME: 17 break 18 19 # 次のフレーム読み込み 20 end_flag, c_frame = cap.read() 21 22 # 終了処理

毎処理で打ち切りする場合

Python

1import time 2if __name__ == '__main__': 3 # 略 4 MAX_TIME = 1 # 打ち切り時間(処理毎に) [sec] 5 6 # 変換処理ループ 7 while end_flag == True: 8 9 prevTime = time.time() # 処理開始時間 10 11 # 変換処理。略 12 13 # 打ち切り時間までに終わらなかった 14 if (time.time() - prevTime) >= MAX_TIME: 15 break 16 17 # Escキーで終了 18 key = cv2.waitKey(INTERVAL) 19 if key == ESC_KEY: 20 break 21 22 # 次のフレーム読み込み 23 end_flag, c_frame = cap.read() 24 25 # 終了処理

投稿2018/01/29 06:23

can110

総合スコア38256

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

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

0

subprocessを許せば、他に制御用スクリプトを作って時間を計るのが一番楽です。

python

1import subprocess 2import time 3 4max_time = 1000 5 6st = time.time() 7 8cmd = 'python my_script.py' 9run = subprocess.Popen(cmd, shell=True) 10 11while True: 12 time.sleep(1) 13 return_code = run.poll() 14 if return_code == 0: 15 break 16 if time.time() - st > max_time: 17 run.terminate() 18 break

普通にやるなら。

python

1import time 2 3max_time = 1000 4 5st = time.time() 6 7time_per_loop = -999 8 9while True: 10 st0 = time.time() 11 12 # 13 # processing 14 # 15 16 time_per_loop = max(time_per_loop, time.time()-st0) 17 18 remain_time = max_time - (time.time() - st) 19 20 if remain_time < time_per_loop: 21 break

投稿2018/01/29 05:45

編集2018/01/29 06:16
mkgrei

総合スコア8560

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

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

mochisio

2018/01/29 06:07 編集

別のスクリプトを作って、本物と制御用プログラムを2つ同時に動かすという意味ですか?
mkgrei

2018/01/29 06:09

おっしゃるとおりです。 基本的にwhile文を使って時間の経過を管理しますが、本編の中の場合、どのコールでどれほど時間がかかるのかといった解析が必要となります。 Pythonは同時に1つのコールしか実行できませんので、例えば画像の処理に数分かかってしまうのであれば、数分間は制御ができなくなります。 それでも予定時間を推定できれば、次のループに入るべきかどうかを判定できますが、いろいろとコードが入り乱れて面倒です。 制御用のコードを1つ書けば、本編でどんな処理をしているのかにかかわらず途中で処理を打ち止めることができます。
mkgrei

2018/01/29 06:20

一応本編コードにダイレクトに時間を計るものを追記しました。 時間を計るルーチンと普通の処理が入り混じって保守しにくいです。 オブジェクト化してもよいのですが、コードが増えます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問