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

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

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

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

Q&A

解決済

1回答

1197閲覧

画面上の円の出現時間を測定できているかについて

tasuke

総合スコア53

Python 3.x

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

0グッド

0クリップ

投稿2018/07/22 13:31

現在、OpenCVを使用して、円を検出しその円が何秒で消えるのか測定するプログラムを製作しています。以下が作成したプログラムです。

python

1 2import numpy as np 3import cv2 4import time 5cap = cv2.VideoCapture(0) 6 7frame = np.zeros((512,512,3), dtype=np.uint8) 8frame[:] = tuple((0,0,0)) 9 10cur,pre = False,False 11start = time.time() 12while True: 13 14 ret, frame = cap.read() 15 gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) 16 gray = cv2.GaussianBlur(gray, (33,33), 1) 17 circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 60, param1=10, param2=85, minRadius=0, maxRadius=85) 18 if circles is not None: 19 circles = np.uint16(np.around(circles)) 20 for i in circles[0,:]: 21 cv2.circle(frame,(i[0],i[1]),i[2],(0,0,255),2) 22 cv2.circle(frame,(i[0],i[1]),2,(0,0,255),3) 23 cur = not pre 24 print('circle:{}->{}'.format(pre,cur)) 25 26 27 if not pre and cur: 28 start = time.time() 29 30 elif pre and not cur: 31 elapsed_time = time.time() - start 32 print("elapsed_time:{0}".format(elapsed_time) + "[sec]") 33 34 pre = cur 35 36 cv2.imshow('preview', frame) 37 key = cv2.waitKey(10) 38 if key == ord("q"): 39 break 40cv2.destroyAllWindows() 41

また、このプログラムを起動させたときの結果が下に示す写真の通りです。
イメージ説明
このように、円を提示し続けていても、値が小さくなってしまいます。
これについて、私には知識がなく、どこに問題があるか突き止めることが出来ませんでした。上記プログラムにどのような不備があるのでしょうか。回答お願いします。

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

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

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

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

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

umyu

2018/07/22 14:20

OpenCVはBGR形式でデータを返します。よってgray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)では。プログラムに不備というより、まず使っているOpenCVの関数に関して一通り公式ドキュメントを読む事をお勧めします。
guest

回答1

0

ベストアンサー

本来追記・修正の依頼に書く予定でしたが、コードを含むのでこっちで。

コードに置いていくつか不明点があるので、その質問です。

①ゼロで初期化しているのに以下では何をしているのでしょうか?

python

1frame = np.zeros((512,512,3), dtype=np.uint8) 2frame[:] = tuple((0,0,0))

②ここのロジックはあっていますか?
円を見つけるたびにフラグをオンオフにしています。

python

1 for i in circles[0,:]: 2 cv2.circle(frame,(i[0],i[1]),i[2],(0,0,255),2) 3 cv2.circle(frame,(i[0],i[1]),2,(0,0,255),3) 4 cur = not pre 5 print('circle:{}->{}'.format(pre,cur))

何をやろうとしているのか不明なのでなんとも言えないのですが。

python

1if circles is not None: 2 cur = True 3else: 4 cur = False

投稿2018/07/22 22:43

mkgrei

総合スコア8560

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

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

tasuke

2018/07/25 02:56

①については、消し忘れで残ってしまっていただけです。混乱させてしまいすみません。 ②についてはmkgrei様が記載した通りで、2つのフラグが変わった時を時間を測定するスタート地点に置き、2つのフラグが同じ値に戻った時までの時間を測定するプログラムを作成したつもりです。
mkgrei

2018/07/25 11:13 編集

うーん、制御部だけ抜き出して自然言語で書いてみますね。 while True: 繰り返します ....if circles is not None: もし円が一つでもあったら ........cur = not pre curをpreの逆にする ....if not pre and cur: preがFalseで、curがTrueならタイマースタート ....elif pre and not cur: preがTrue、curがFalseなら、タイマー止めて時間を出力 ....pre = cur preをcurにする ずっと円が表示されている時の制御を追ってみますか。 はじめ、pre,cur:False,False 円がありました、pre,cur:False,True、ので、タイマースタート 無条件で揃える、pre,cur:True,True 次のループ 円がありました、pre,cur:True,False、タイマーストップして時間を出力 無条件で揃える、pre,cur:False,False はじめに戻る 円を検出する限り、タイマーをスタートして止めるを繰り返すロジックになっています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問