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 |
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, |
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) |