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

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

ただいまの
回答率

88.62%

pythonで一定時間ごとに動作を行うタイマーを使いたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,342

hokahomu

score 30

 前提・実現したいこと

赤い丸の物体をカメラを用いてリアルタイムで認識し、音声を鳴らすプログラムを作っているのですが、音声が鳴った後に10秒ほど間をあけてからまた鳴らしたいのですが、実装方法がわからないので教えていただきたいです。
一応現段階では鳴らす前にflgの値を0にし、鳴らした後にflgの値を1にすることで連続でならないようにしています。

 該当のソースコード

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

・音声が鳴ったときに、10秒先の時刻をなんらかの変数に設定、
・while true のループの中で、現在時刻がその変数以降になってるかをチェックし、そうなってるなら音を鳴らす

というのでどうでしょう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/28 17:56

    エポック秒が何かわからないので取得方法教えてほしいです...

    キャンセル

  • 2018/11/28 18:29

    「python エポック秒」でぐぐるとでてきます

    キャンセル

  • 2018/11/29 18:06

    無事に解決することが出来ました!
    回答ありがとうございました!

    キャンセル

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

  • ただいまの回答率 88.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る