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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

OpenCV

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

Python

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

Q&A

1回答

6761閲覧

動体をトラッキングし、その座標をグラフに出力したい

kyo00

総合スコア1

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

OpenCV

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

Python

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

0グッド

0クリップ

投稿2020/12/07 04:34

#前提
プログラミング初心者です。
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

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

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

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

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

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

guest

回答1

0

OpenCVで動体検知するなら、MeanshiftやCamshiftを利用すると
もうすこし簡潔なソースコードが書けますが検討されましたか?

OpenCV-Pythonチュートリアル 動画解析

投稿2020/12/07 13:03

technocore

総合スコア7200

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

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

kyo00

2020/12/07 15:23

教えて頂いたサイトのソースを私のサンプルで試してみたところ、上手く動体を捉えられませんでした。現在のプログラムでトラッキング自体は上手くできており、また先を急いでいる為トラッキングまではこのままで行こうと思います。ありがとうございました。 引き続き、どなたでもプロットについてアドバイス頂けましたら幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問