質問編集履歴

1 関数名の変更

hokahomu

hokahomu score 32

2018/11/28 17:32  投稿

pythonで一定時間ごとに動作を行うタイマーを使いたい
### 前提・実現したいこと
赤い丸の物体をカメラを用いてリアルタイムで認識し、音声を鳴らすプログラムを作っているのですが、音声が鳴った後に10秒ほど間をあけてからまた鳴らしたいのですが、実装方法がわからないので教えていただきたいです。
一応現段階では鳴らす前にflgの値を0にし、鳴らした後にflgの値を1にすることで連続でならないようにしています。
### 該当のソースコード
```Python
from mutagen.mp3 import MP3 as mp3
import numpy as np
import cv2
import pygame
import time
import threading
def getCircle(frame, lower_color, upper_color):
 MIN_RADIUS = 25
 # HSVによる画像情報に変換
 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
 # ガウシアンぼかしを適用して、認識精度を上げる
 blur = cv2.GaussianBlur(hsv, (9, 9), 0)
 # 指定した色範囲のみを抽出する
 color = cv2.inRange(blur, lower_color, upper_color)
 # オープニング・クロージングによるノイズ除去
 element8 = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]], np.uint8)
 oc = cv2.morphologyEx(color, cv2.MORPH_OPEN, element8)
 oc = cv2.morphologyEx(oc, cv2.MORPH_CLOSE, element8)
 # 輪郭抽出
 img, contours, hierarchy = cv2.findContours(oc, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
 print("{} contours.".format(len(contours)))
 if len(contours) > 0:
   # 一番大きい赤色領域を指定する
   contours.sort(key=cv2.contourArea, reverse=True)
   cnt = contours[0]
   # 最小外接円を用いて円を検出する
   (x, y), radius = cv2.minEnclosingCircle(cnt)
   center = (int(x), int(y))
   radius = int(radius)
 
   
   # 円が小さすぎたら円を検出していないとみなす
   if radius < MIN_RADIUS:
     return None
   else:
     return center, radius
 else:
   return None
def hello():
def flg():
   flg=flg-1
if __name__ == '__main__':
 # 内蔵カメラを起動(カメラが一つしか繋がっていない場合は、引数に0を渡せば良い)
 cap = cv2.VideoCapture(0)
 flg=0
 while True:
   # 赤色の円を抽出する
   frame = cap.read()[1]
   getframe = getCircle(frame, np.array([130, 80, 80]), np.array([200, 255, 255]))
   if getframe is not None:
     # 見つかった円の上に青い円を描画
     # getframe[0]:中心座標、getframe[1]:半径
     cv2.circle(frame, getframe[0], getframe[1], (255, 0, 0), 2)
     print(getframe[1])
     if flg==0:
         filename = 'D:\ppcon\keikoku .mp3' #再生したいmp3ファイル
         pygame.mixer.init()
         pygame.mixer.music.load(filename) #音源を読み込み
         mp3_length = mp3(filename).info.length #音源の長さ取得
         pygame.mixer.music.play(1) #再生開始。1の部分を変えるとn回再生(その場合は次の行の秒数も×nすること)
         time.sleep(mp3_length + 0.25) #再生開始後、音源の長さだけ待つ(0.25待つのは誤差解消)
         pygame.mixer.music.stop() #音源の長さ待ったら再生停止
         flg = flg+1
       
     if flg==1:
        t=threading.Timer(10,hello)
        t=threading.Timer(10,flg)
        t.start()
   # 検出結果とともに映像を表示
   cv2.imshow('Circle Detect', frame)
   
   if cv2.waitKey(1) & 0xFF == ord('q'):
     break
 # 終了時にカメラを解放
 cap.release()
 cv2.destroyAllWindows()
```
### 試したこと
sleepを使ってみましたがカメラでの検出も止まってしまうため断念
threadingを用いたタイマーを自分なりに使用してみましたが既定の秒数経った後にも反応がないこと
### 補足情報(FW/ツールのバージョンなど)
python3.7
opencv-python(3.4.3.18)
numpy(1.15.1)
pygame(1.9.4)
muatagen(1.41.1)
  • Python

    28890 questions

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

  • Python 3.x

    17135 questions

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

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