pythonを用いた並列処理のthreadingの手法について勉強しています。
threadingを用いた場合のコードを作成してみたのですが、
以下のようにif文にthread2での動作のコードを格納した場合に、並列で処理されているのかわからないで困っています。
並行で処理されているか確認できる方法はありますでしょうか。
threadingの手法についても使い方が間違っていましたらご指摘、アドバイスいただけますと幸いです。よろしくお願いします。
python
1 2import time 3import threading 4 5#thread処理のテスト 6 7def multi_test(): 8 count=0 9 for i in range(50): 10 print(count) 11 if count%3 ==0 : 12 #並列処理2を行う 13 test2() 14 count = count+1 15 else: 16 count = count+ 1 17 return 18 19def test2(): 20 print("thread2出力") 21 22#出力確認 23if __name__ == "__main__": 24 thread_1 = threading.Thread(target=multi_test()) 25 thread_2 = threading.Thread(target=test2()) 26 27 thread_1.start() 28 thread_2.start() 29コード
以下追記いたしました。どのようなコードにthreading処理を組み込みたいかについてです。
以下のようにcv2を用いてPCにおいて画面表示をしながら、任意のフレーム数をリストに格納し、格納したデータについてthreading処理を並列で処理したいと考えています。その際に画面のカメラ画像を止めずにバックグラウンドで処理したいのですが、今のところ試してはいるのですが、画面表示がやや止まる印象がありますので質問させていただきました。
python
1import numpy as np 2import cv2 3import matplotlib.pyplot as plt 4import time 5#カメラを設定 6cap = cv2.VideoCapture(0) 7frame_width = int(cap.get(3)) 8frame_height = int(cap.get(4)) 9 10#mp4で保存するため、以下を設定 11out = cv2.VideoWriter('test_.mp4',cv2.VideoWriter_fourcc('M','P','4','V'), 30, (frame_width,frame_height)) 12 13 14count=0 15frames_list=[] 16#--------------------------------- 17while(True): 18 ret, frame = cap.read() 19 if ret == True: 20 21 # Write the frame into the file 'output.avi' 22 #out.write(frame) 23 24 # Display the resulting frame 25 cv2.imshow('frame',frame) 26 27 #----------------------------------------------------------------- 28 #50フレーム格納すると処理を行うプログラムを実行する。 29 frames_list.append(frame) 30 count = count + 1 31 if count == 50: 32 33 print("150フレーム分取得,predict開始") 34 time_sta=time.time() #時間を計測する 35 frames_extracted=np.array(frames_list) 36 37 #------------------------------------------ 38 #ここで取得したframe_listに対して並列処理を行いたいです。 39 #------------------------------------------ 40 41 42 #処理が終了したため、frames_listを空にする 43 frames_list=[] 44 print("listを空にしました",len(frames_list)) 45 #countを0に戻す 46 count=0 47 48 # Press Q on keyboard to stop recording 49 if cv2.waitKey(1) & 0xFF == ord('q'): 50 break 51 52 # Break the loop 53 else: 54 break 55 56# When everything done, release the video capture and video write objects 57cap.release() 58out.release() 59 60# Closes all the frames 61cv2.destroyAllWindows() 62
pythonでのスレッド処理がイメージ通り動作するか微妙な感じなので、どのようなことをしたいのかを提示した上で、実現できるか否かを判断する方向で質問した方が適切な回答を得られやすいようにおもわれます。
opencvでカメラを起動ながら、カメラから任意の時間内のイメージ画像を取得した場合に、並列でthreadingで処理したいと考えています。
その際にカメラから取得した画像を流したままにしたいと考えているのですが、threading2が起動した場合にカメラのimshow()が止まった感じになるため、それをthreadingで解決したいと考えています。
ご指摘ありがとうございます。
上記のスレッド処理がイメージ通りに動作しない可能性があるとのアドバイスですが、どのあたりのプログラム処理が微妙になってくるのか教えていただけますと幸いです。
回答2件
あなたの回答
tips
プレビュー