質問編集履歴

1 回答していただいた方のプログラムを参考にし、プログラムを書き直してみました。

tasuke

tasuke score 49

2018/07/21 01:04  投稿

円が検出されてからその円が消えるまでの時間を測定するプログラムを作製したのですが、あっているかわかりません。
円を検出するプログラムに、Time関数を使用し、円が検出されてから消えるまでの時間を測定するプログラムを作成しました。コードは以下の通りです。
```python
import numpy as np
import cv2
import time
cap = cv2.VideoCapture(0)
while True:
   ret, frame = cap.read()
   gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
   gray = cv2.GaussianBlur(gray, (33,33), 1)
   circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 60, param1=10, param2=85, minRadius=10, maxRadius=80)
   if __name__ == '__main__':
       if circles is not None:
           start = time.time()
           circles = np.uint16(np.around(circles))
           for i in circles[0,:]:
               cv2.circle(frame,(i[0],i[1]),i[2],(0,0,255),2)
               cv2.circle(frame,(i[0],i[1]),2,(0,0,255),3)
               elapsed_time = time.time() - start
               print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")
   
   cv2.imshow('preview', frame)
   key = cv2.waitKey(10)
   if key == ord("q"):
       break
cv2.destroyAllWindows()
```
一応動くのですが、取ることのできた値が謎です・・・
正確には以下の写真のようになってしまいます。
![イメージ説明](caab7347443af4dd079af48171ec2a1e.jpeg)
画面上に円が現れて消えるまでの時間とは別な時間が返されている気がします。
私は上記のプログラムで計測している時間はプログラムが円を検出しその円に栓を書くまでの時間のみを計測し表記してしまっているため謎の数値が返されているのではという考えに至りました。実際の理由は何なのでしょうか。また、そもそも上記のような円検出のプログラムに円が現れ消えるまでの時間を測定する能力を付加することは可能なのでしょうか。
私は上記のプログラムで計測している時間はプログラムが円を検出しその円に栓を書くまでの時間のみを計測し表記してしまっているため謎の数値が返されているのではという考えに至りました。実際の理由は何なのでしょうか。また、そもそも上記のような円検出のプログラムに円が現れ消えるまでの時間を測定する能力を付加することは可能なのでしょうか。
追記
回答していただいた方のプログラムをもとに、コードを書き直してみました。
```python
import numpy as np
import cv2
import time
cap = cv2.VideoCapture(0)
frame = np.zeros((512,512,3), dtype=np.uint8)
frame[:] = tuple((0,0,0))
cur,pre = False,False
start = time.time()
while True:
   ret, frame = cap.read()
   gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
   gray = cv2.GaussianBlur(gray, (33,33), 1)
   circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 60, param1=10, param2=85, minRadius=10, maxRadius=80)
   if circles is not None:
       circles = np.uint16(np.around(circles))
       for i in circles[0,:]:
           cv2.circle(frame,(i[0],i[1]),i[2],(0,0,255),2)
           cv2.circle(frame,(i[0],i[1]),2,(0,0,255),3)   
           cur = not pre
           print('circle:{}->{}'.format(pre,cur))
   
   if not pre and cur:
       start = time.time()
   elif pre and not cur:
       elapsed_time = time.time() - start
       print("elapsed_time:{0}".format(elapsed_time) + "[sec]")
   pre = cur
   cv2.imshow('preview', frame)
   key = cv2.waitKey(10)
   if key == ord("q"):
       break
cv2.destroyAllWindows()
コード
```
起動させた結果、次のような値を取るようになりました。
![イメージ説明](9972b4d32f402008e04e41f28cbecd44.jpeg)
 以前よりは数値的には良いものになったのですが、画面上に円を置き続けていても円が消えたと判断されてしまうようです。ただ、Widowsのパソコンに付属しているカメラで撮影していて画像が荒いためか、円を画面上に置き続けていてもcircleが点滅(?)している状態のため、それが原因でプログラムが円が消えたと判断してしまっている可能性も考えました。しかし、私はまだプログラミングを始めて間もないため、実際の原因が何なのか突き止めることが出来ませんでした。教えていただけると助かります。
 文章が長く、またお見苦しいものとなってしまい申し訳ありません。
 
  • Python 3.x

    19052 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る