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

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

ただいまの
回答率

90.49%

  • Python

    12220questions

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

  • Python 3.x

    10228questions

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

  • OpenCV

    1556questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

  • Raspberry Pi

    1085questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

  • Raspbian

    145questions

カメラからの映像を画像処理した映像が数秒止まる

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 233

snake207

score 7

 起こっている現象

四角形で囲んだところに物体(ボール)の中心座標が来ると、
音を鳴らすというプログラムを作成したのですが、
四角形に物体が入り音がなると映像が数秒止まってしまいます。

 質問内容

音を鳴らすと映像が止まる原因とその解決方法を教えていただきたいです。

 作成したプログラム

import cv2
import sys
import numpy as np
import pygame.mixer
import time

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,(44,287),(489,237),(0,255,0),3) #長方形の描画
    rect = np.array([[44, 287], [43, 248], [489, 237], [494, 275]]) #ボール判定範囲設定

    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)
            pygame.mixer.init()
            pygame.mixer.music.load('sound.mp3')
            pygame.mixer.music.play(1) # loop count

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

    return image

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)  # カメラの映像を読み込む
# fourcc = cv2.VideoWriter_fourcc(*'MJPG')
fourcc = cv2.VideoWriter_fourcc(*'XVID')

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[ymin:ymax,xmin:xmax]

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • tiitoi

    2018/11/01 21:03

    ずっと止まったままなのか、数秒止まるのかどちらでしょうか?

    キャンセル

  • snake207

    2018/11/01 21:16

    数秒止まります。

    キャンセル

回答 1

checkベストアンサー

0

以下の部分に time.sleep(2) を入れているからです。
2秒間ことで処理がストップしてしまうので、映像が止まります。

if cv2.pointPolygonTest(rect,(x,y),False) >= 0:
    # 線の中にボールの中心が入っている赤色で表示。
    cv2.circle(image,(x,y),10,(0,0,255),thickness)
    pygame.mixer.init()
    pygame.mixer.music.load('sound.mp3')
    pygame.mixer.music.play(1) # loop count

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

pygame は使ったことがないのでわからないですが、音を鳴らす部分を別スレッドで実行するようにしましょう。
「Python スレッド」で調べると情報がたくさんでてきます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/01 22:03

    回答、ありがとうございます。
    「Python スレッド」で調べたものを参考に別スレッドで実行してみると、
    映像が止まらず音が鳴りました。

    キャンセル

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

  • Python

    12220questions

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

  • Python 3.x

    10228questions

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

  • OpenCV

    1556questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

  • Raspberry Pi

    1085questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

  • Raspbian

    145questions