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

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

ただいまの
回答率

88.58%

指定した時間内だけプログラムを実行したい

解決済

回答 2

投稿 編集

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

snake207

score 13

 質問内容

指定した間だけプログラムを実行させるにはどうしたらいいですか。
例:5分間プログラムを実行させ、5分経つとプログラムを終了する。
下記のプログラムに加えたいです。

 作成したプログラム

import cv2
import sys
import numpy as np
import pygame.mixer
import time
from concurrent.futures import ThreadPoolExecutor

xmin,xmax = 112, 483  # 左上,右下のX座標
ymin,ymax = 172, 408  # 左上,右下のy座標

def dilation(dilationSize, kernelSize, img):  # 膨張した画像にして返す
    kernel = np.ones((kernelSize, kernelSize), np.uint8)
    element = cv2.getStructuringElement(cv2.MORPH_RECT, (2 * dilationSize + 1, 2 * dilationSize + 1), (dilationSize, dilationSize))
    dilation_img = cv2.dilate(img, kernel, element)
    return dilation_img


def detect(gray_diff, thresh_diff=100, dilationSize=9, kernelSize=20):  # 一定面積以上の物体を検出
    retval, black_diff = cv2.threshold(gray_diff, thresh_diff, 255, cv2.THRESH_BINARY)  # 2値化
    dilation_img = dilation(dilationSize, kernelSize, black_diff)  # 膨張処理
    img = dilation_img.copy()
    image, contours, hierarchy = cv2.findContours(dilation_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE,offset=(xmin,ymin))  # 境界線検出

    ball_pos = []

    for cnt in contours:  # 重心位置を計算
        M = cv2.moments(cnt, False)
        x, y = int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"])
        ball_pos.append((x, y))

    return ball_pos, img

def displayCircle(image, ballList, thickness=5):
    cv2.rectangle(frame,(52,201),(491,290),(0,255,0),3) #長方形の描画
    rect = np.array([[44, 283], [52, 201], [486, 204], [491, 290]])

    for i in range(len(ballList)):
        x = int(ballList[i][0])
        y = int(ballList[i][1])

        if cv2.pointPolygonTest(rect,(x,y),False) >= 0:
            # 線の中にボールの中心が入っている赤色で表示。
            cv2.circle(image,(x,y),10,(0,0,255),thickness)

            pool = ThreadPoolExecutor(4)
            pool.submit(sound)

    return image

def sound():
    pygame.mixer.init()
    pygame.mixer.music.load('music.mp3')
    pygame.mixer.music.play(1) # loop count

    time.sleep(2)   #2秒再生
    pygame.mixer.music.stop()  #停止

def resizeImage(image, w=2, h=2):
    height = image.shape[0]
    width = image.shape[1]
    resizedImage = cv2.resize(image, (int(width / w), int(height / h)))
    return resizedImage


def blackToColor(bImage):
    colorImage = np.array((bImage, bImage, bImage))
    colorImage = colorImage.transpose(1, 2, 0)
    return colorImage

video = cv2.VideoCapture(0)  # videoファイルを読み込む
# fourcc = cv2.VideoWriter_fourcc(*'MJPG')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
c = time.time()

if not video.isOpened():  # ファイルがオープンできない場合の処理.
    print("Could not open video")
    sys.exit()

vidw = video.get(cv2.CAP_PROP_FRAME_WIDTH)
vidh = video.get(cv2.CAP_PROP_FRAME_HEIGHT)
out = cv2.VideoWriter("tennis.mp4", fourcc, 20.0,(int(vidw), int(vidh)))  # 出力先のファイルを開く


ok, frame = video.read()  # 最初のフレームを読み込む
if not ok:
    print('Cannot read video file')
    sys.exit()

frame_pre = frame.copy()
frame_pre
while True:
    ok, frame = video.read()  # フレームを読み込む
    if not ok:
        break

    frame_next = frame.copy()

    color_diff = cv2.absdiff(frame_next[ymin:ymax, xmin:xmax], frame_pre[ymin:ymax, xmin:xmax])  # フレーム間の差分計算
    gray_diff = cv2.cvtColor(color_diff, cv2.COLOR_BGR2GRAY)  # グレースケール変換
    retval, black_diff = cv2.threshold(gray_diff,30, 255, cv2.THRESH_BINARY)

    ball, dilation_img = detect(gray_diff)

    frame = displayCircle(frame, ball, 2)  #フレーム加工

    cv2.imshow("Tracking", frame)  # フレームを画面表示

    out.write(frame)

    frame_pre = frame_next.copy()  # 次のフレームの読み込み
    frame_pre[ymin:ymax, xmin:xmax]

    k = cv2.waitKey(10) & 0xff  # ESCを押したら中止
    if k == 27:
        break

video.release()
out.release()
cv2.destroyAllWindows()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

だいたい5分後という程度でよければ標準のdatetime使って
提示されたソースのwileの前で
endtime = dt.datetime.now() + timedelta( seconds = 300)
とかしといて、
whileの内側で datetime.now()がendtimeを超えれば抜けるようにすればいかがですか ? (こんな簡単な話ではない ? :)

もし5分が読み込んだ動画?の時間ならフレームレートを取得しといて処理枚数で終わればいいと思う。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/04 00:32

    回答、ありがとうございます!
    datetimeを使うと上手くできました。

    キャンセル

0

そのプログラム内で、定期的に時間を読み出し、チェックして、実行時間外であればそのプログラムを終了する、という処理を入れればいいですね。

# 時間になったらプログラムを実行させる、というのはわかりますよね

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/03 10:51

    はい、それは分かります

    キャンセル

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

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

関連した質問

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