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

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

詳細はこちら
OpenCV

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

Python

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

Q&A

解決済

1回答

828閲覧

Pythonで1つ目の処理が始まった段階で次の処理を開始したい

Yun123

総合スコア1

OpenCV

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

Python

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

0グッド

0クリップ

投稿2020/11/27 04:15

編集2020/12/01 09:48

前提・実現したいこと

動画再生が始まった段階で次の処理に移行したいです。

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

for文を回し始めた段階で動画も再生したいのですが並列で処理する方法がわかりません。
threadingなどを使用した場合、並列で2つの命令を処理できるのでしょうか?

該当のソースコード

Python

1import cv2 2import numpy as np 3 4path = "1.mp4" 5b = 1 6doga_path = path 7cap = cv2.VideoCapture(doga_path) 8assert cap.isOpened(), 'Failed to open video file.' 9cv2.namedWindow('Frame', cv2.WINDOW_NORMAL) 10cv2.setWindowProperty('Frame', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) 11 12ret, frame = cap.read() 13for b in range(20): 14 print("123123123") 15while ret: 16 17 cv2.imshow('Frame', frame) 18 if cv2.waitKey(1) & 0xFF == ord('q'): 19 break 20 21 ret, frame = cap.read() 22else: 23 print("---動画終了---") 24cap.release() 25cv2.destroyAllWindows()

試したこと

asyncioを使用して処理できるかもということで試しましたが並列にできなかったです。
1つ目の処理の終了してから2つ目の処理の実行になりました。

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

Python3.6
openCV3.4

回答をもらって変更したコード

Python

1import sys 2import time 3import csv 4import cv2 5import numpy as np 6from threading import Thread 7 8 9doga = "1.mp4" 10b = 1 11 12def func2(b): 13 for b in range(100000): 14 print("123123123") 15 print("END") 16 17def func1(doga): 18 doga_path = doga 19 cap = cv2.VideoCapture(doga_path) 20 assert cap.isOpened(), 'Failed to open video file.' 21 cv2.namedWindow('Frame', cv2.WINDOW_NORMAL) 22 cv2.setWindowProperty('Frame', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) 23 24 ret, frame = cap.read() 25 while ret: 26 27 cv2.imshow('Frame', frame) 28 if cv2.waitKey(1) & 0xFF == ord('q'): 29 break 30 31 ret, frame = cap.read() 32 else: 33 print("---動画終了---") 34 cap.release() 35 cv2.destroyAllWindows() 36 37if __name__ == '__main__': 38 39 p2 = Thread(target = func2(b)) 40 p1 = Thread(target = func1(doga)) 41 p2.start() 42 #event.set() 43 p1.start()

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

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

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

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

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

guest

回答1

0

ベストアンサー

たとえばこんなふうにすれば、複数の関数を同時に走らせることができます

python

1import numpy as np 2from threading import Thread 3 4def func_1(num): 5 print('func_1 Start') 6 tmp = np.sum(np.arange(0, num)) 7 print('func_1 End') 8 9def func_2(num): 10 print('func_2 Start') 11 tmp = np.sum(np.arange(0, num)) 12 print('func_2 End') 13 14def func_3(num): 15 print('func_3 Start') 16 tmp = np.sum(np.arange(0, num)) 17 print('func_3 End') 18 19if __name__ == '__main__': 20 p1 = Thread(target=func_1, args=(500000000,)) 21 p2 = Thread(target=func_2, args=(500000000,)) 22 p1.start() # func_1が動き始める 23 p2.start() # func_1の終了を待たずにfunc_2が動き始める 24 func_3(500000000) # func_1, func_2の終了を待たずにfunc_3が動き始める

手抜きで各関数の内容は実質同じですが、もちろん全く異なる内容でも大丈夫です

「回答をもらって変更したコード」の最後を、下記のように変えてください

python

1if __name__ == '__main__': 2 p2 = Thread(target=func2, args=(b,)) 3 p1 = Thread(target=func1, args=(doga,)) 4 p2.start() 5 #event.set() 6 p1.start()

投稿2020/11/27 10:25

編集2020/12/02 05:26
jbpb0

総合スコア7653

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

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

Yun123

2020/12/01 09:55

回答ありがとうございます。 コードにthreadingの処理を追加したのですがうまくいかず入れ替えてもみたのですが変更したコードではfunc2の処理が完全に完了して次のfunc1の動画再生処理になっているようなのですが回答では終了を待たずにfuncが動くとありましたが、これはthreadingの処理ができていないのでしょうか?
jbpb0

2020/12/01 10:21 編集

私が提示したコードをそのまま動かしたら、どうなりますか? 私の環境では、func_1 End が表示される前に func_2 Start, func_3 Start が表示されますので、三つの関数は同時に動いてます 質問者さんの環境では、そうならないのでしょうか? 質問者さんの環境でも三つの関数が同時に動くのなら、質問者さんの環境でもthreadingは正常に使えるはずです
jbpb0

2020/12/02 05:27 編集

if __name__ == '__main__': の次を、こう変えてください (関数名と引数は分けて指定する) p2 = Thread(target=func2, args=(b,)) p1 = Thread(target=func1, args=(doga,)) (行頭にはインデントを入れてください) 同じ内容を、回答にも追記しました
Yun123

2020/12/03 07:02

回答ありがとうございます。 関数名と引数を分けて指定したら動いてくれました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問