###前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/12/15 02:43