#前提
プログラミング初心者です。
https://ensekitt.hatenablog.com/entry/2018/06/13/200000
以上の記事を主な参考とし、追加で動体の座標をプロットする機能(今回は長方形で動体をとらえているので、その長方形の中心をプロットしたい
)を付与しようと思っています。
#問題点
私の作成したプログラムでは一点のみでのプロットになってしまっています。
fps数に応じた点数をプロットしたいです。
アドバイス頂けましたら幸いです。宜しくお願い致します。
python
1import numpy as np 2import cv2 3from matplotlib import pyplot as plt 4 5cap = cv2.VideoCapture('111.mp4') 6 7ok = False 8before = None 9detected_frame = None 10bbox = (0,0,0,0) 11while True: 12 # OpenCVでWebカメラの画像を取り込む 13 ret, frame = cap.read() 14 if not ret: 15 break 16 # スクリーンショットを撮りたい関係で1/2サイズに縮小 17 frame = cv2.resize(frame, (int(frame.shape[1]/2), int(frame.shape[0]/2))) 18 # 加工なし画像を表示する 19 cv2.imshow('Raw Frame', frame) 20 21 # 取り込んだフレームに対して差分をとって動いているところが明るい画像を作る 22 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 23 if before is None: 24 before = gray.copy().astype('float') 25 continue 26 cv2.accumulateWeighted(gray, before, 0.7) 27 mdframe = cv2.absdiff(gray, cv2.convertScaleAbs(before)) 28 # 動いているところが明るい画像を表示する 29 # cv2.imshow('MotionDetected Frame', mdframe) 30 31 # 動いているエリアの面積を計算してちょうどいい検知結果を抽出する 32 thresh = cv2.threshold(mdframe, 3, 255, cv2.THRESH_BINARY)[1] 33 contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 34 max_area = 0 35 target = None 36 for cnt in contours: 37 area = cv2.contourArea(cnt) 38 if max_area < area and area < 40000 and area > 4000: 39 max_area = area; 40 target = cnt 41 42 # 動いているエリアのうちそこそこの大きさのものがあればそれを矩形で表示する 43 # ちょうどいいエリアがなかったら最後の動いているエリアがあるフレームとエリア情報を用いてトラッキングをする 44 # どうしようもない時はどうしようもない旨を表示する 45 if max_area <= 4000: 46 track = False 47 if detected_frame is not None: 48 # インスタンスを作り直さなきゃいけないっぽい 49 tracker = cv2.TrackerKCF_create() 50 ok = tracker.init(detected_frame, bbox) 51 detected_frame = None 52 53 if ok: 54 track, bbox = tracker.update(frame) 55 if track: 56 p1 = (int(bbox[0]), int(bbox[1])) 57 p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3])) 58 cv2.rectangle(frame, p1, p2, (0,255,0), 2, 1) 59 cv2.putText(frame, "tracking", (10,50), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 1, cv2.LINE_AA) 60 else: 61 ok = False 62 cv2.putText(frame, "(^q^)", (10,50), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 1, cv2.LINE_AA) 63 else: 64 #areaframe = cv2.drawContours(frame, [target], 0, (0,255,0), 3) 65 x,y,w,h = cv2.boundingRect(target) 66 bbox = (x,y,w,h) 67 detected_frame = frame.copy() 68 frame = cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2) 69 cv2.putText(frame, "motion detected", (10,50), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 1, cv2.LINE_AA) 70 71 cv2.imshow('MotionDetected Area Frame', frame) 72 # キー入力を1ms待って、k が27(ESC)だったらBreakする 73 k = cv2.waitKey(1) 74 if k == 27: 75 break 76# ここからグラフ描画 77# フォントの種類とサイズを設定する。 78plt.rcParams['font.size'] = 14 79plt.rcParams['font.family'] = 'Times New Roman' 80 81# 目盛を内側にする。 82plt.rcParams['xtick.direction'] = 'in' 83plt.rcParams['ytick.direction'] = 'in' 84 85# グラフの上下左右に目盛線を付ける。 86fig = plt.figure() 87ax1 = fig.add_subplot(111) 88ax1.yaxis.set_ticks_position('both') 89ax1.xaxis.set_ticks_position('both') 90 91# スケール設定 92ax1.set_xlim(0, 800) 93ax1.set_ylim(0, 400) 94 95# 軸のラベルを設定する。 96ax1.set_xlabel('x') 97ax1.set_ylabel('y') 98 99# データプロット 100ax1.scatter(p1, p2, label='Tracking result') 101plt.legend() 102fig.tight_layout() 103 104# グラフを表示する。 105plt.show() 106plt.close() 107# キャプチャをリリースして、ウィンドウをすべて閉じる 108cap.release() 109cv2.destroyAllWindows()
#補足
python3.7.7
openCV4.2
jupyter notebook
Anaconda Navigator
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/07 15:23