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

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

新規登録して質問してみよう
ただいま回答率
85.50%
OpenCV

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

Python

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

Q&A

解決済

1回答

2925閲覧

動画上に検出結果をうまく表示できません

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

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

Python

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

0グッド

0クリップ

投稿2017/12/11 08:19

###前提・実現したいこと
pythonでボールを移動体検出を用いて追うプログラムを組んでいます。
グレースケール化した方の動画上では、円の座標がしっかりボールに乗っているにもかかわらず、本来の動画上では若干ずれて表示してしまいます。
動画のフレームをずらすか、表示する座標をずらすかで、どうにか本来の動画上でもボールの位置に円が乗るようにしたいです。

###発生している問題・エラーメッセージ

エラーなし

###該当のソースコード

# -*- coding: utf-8 -*- """ Created on Mon Dec 11 17:01:17 2017 @author: user4 """ import cv2 import numpy as np kernel = np.ones((5,5),np.uint8) neiborhood4 = np.array([[0, 1, 0], [1, 1, 1], [0, 1, 0]], np.uint8) # フレーム差分の計算 def frame_sub(src1, src2, src3, th): # フレームの絶対差分 d1 = cv2.absdiff(src1, src2) d2 = cv2.absdiff(src2, src3) # 2つの差分画像の論理積 diff = cv2.bitwise_and(d1, d2) # 二値化処理 diff[diff < th] = 0 diff[diff >= th] = 255 # メディアンフィルタ処理(ゴマ塩ノイズ除去) mask = cv2.medianBlur(diff, 3) return mask def main(): # カメラのキャプチャ cap = cv2.VideoCapture("jugg.mp4") cv2.namedWindow("Frame2",cv2.WINDOW_NORMAL) cv2.namedWindow("Douga",cv2.WINDOW_NORMAL) # フレームを3枚取得してグレースケール変換 frame1 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY) frame2 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY) frame3 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY) while True: (grabbed, frame) = cap.read() if not grabbed: break # フレーム間差分を計算 mask = frame_sub(frame1, frame2, frame3, th=30) #太くして面積を広く mask = cv2.dilate(mask,neiborhood4,iterations = 1) #輪郭の取得 image, cnts, hierarchy = cv2.findContours(mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) if len(cnts) > 0: #最大の輪郭 c = max(cnts, key=cv2.contourArea) #最大面積の最小包囲円の座標と半径 ((x, y), radius) = cv2.minEnclosingCircle(c) #円の線画 if 80>radius>10: cv2.circle(frame, (int(x), int(y)), int(radius),(0, 0, 255), 2) cv2.circle(frame2, (int(x), int(y)), int(radius),(0, 0, 255), 2) # 結果を表示 cv2.imshow("Frame2", frame2) cv2.imshow("Douga",frame) # 3枚のフレームを更新 frame1 = frame2 frame2 = frame3 frame3 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY) # qキーが押されたら途中終了 key = cv2.waitKey(50) & 0xFF if key == ord("q"): break cap.release() cv2.destroyAllWindows() if __name__ == '__main__': main()

###補足情報(言語/FW/ツール等のバージョンなど)
windows7/Anaconda3.4.4/Spyder3(Python3.5)/OpenCV 3.1.0

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

フレームがずれているので仕方のないことのように感じますね。
(grabbed, frame) = cap.read()
frame2 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)

遅延していますが、
frame2_rgb = cap.read()[1]
frame2 = cv2.cvtColor(frame2_rgb, cv2.COLOR_RGB2GRAY)
としてframeではなく、frame2_rgbに円を描いて表示してみてはどうでしょう。


表示する場所をずらすには円の中心位置の座標に関する運動方程式を解いてフレームレートに合わせる必要がありますのであまりお手軽ではありませんが、できなくはないと思います。
こちらの方法なら遅延はありませんね。

投稿2017/12/11 09:43

編集2017/12/11 09:47
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/12/15 02:43

元動画の表示がずれて、同時に再生できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問