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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

3592閲覧

python OpenCV cv2.calcOpticalFlowPyrLK()関数のデータをグラフ化or数値化したい。

kiraaa

総合スコア12

OpenCV

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

Python 3.x

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

0グッド

0クリップ

投稿2018/12/11 04:48

python OpenCV cv2.calcOpticalFlowPyrLK()関数のデータをグラフ化or数値化したい。
現在anacondaのspyder(OpenCV3.6)にて2撮影した動画をcv2.calcOpticalFlowPyrLK()関数を用いて移動体の追跡の可視化を行いました。
そこで次に可視化だけでなく結果をグラフ化または数値して出力したいのですがなんのデータをグラフにすれば良いのかもわかっていないのでそこも踏まえてご教授頂けると幸いです。

python

1import cv2 2import numpy as np 3 4# Esc キー 5ESC_KEY = 0x1b 6# s キー 7S_KEY = 0x73 8# r キー 9R_KEY = 0x72 10# 特徴点の最大数 11MAX_FEATURE_NUM = 500 12# 反復アルゴリズムの終了条件 13CRITERIA = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03) 14# インターバル (1000 / フレームレート) 15INTERVAL = 30 16# ビデオデータ 17VIDEO_DATA = ("rouka/kabe30wo240.avi") 18 19# ランダムに色を100個生成(値0~255の範囲で100行3列のランダムなndarrayを生成) 20color = np.random.randint(0, 255, (100, 3)) 21i=1; 22 23class Motion: 24 # コンストラクタ 25 def __init__(self): 26 # 表示ウィンドウ 27 cv2.namedWindow("motion") 28 # マウスイベントのコールバック登録 29 cv2.setMouseCallback("motion", self.onMouse) 30 # 映像 31 self.video = cv2.VideoCapture(VIDEO_DATA) 32 # インターバル 33 self.interval = INTERVAL 34 # 現在のフレーム(カラー) 35 self.frame = None 36 # 現在のフレーム(グレー) 37 self.gray_next = None 38 # 前回のフレーム(グレー) 39 self.gray_prev = None 40 # 特徴点 41 self.features = None 42 # 特徴点のステータス 43 self.status = None 44 45 # メインループ 46 def run(self): 47 48 # 最初のフレームの処理 49 end_flag, self.frame = self.video.read() 50 self.gray_prev = cv2.cvtColor(self.frame, cv2.COLOR_BGR2GRAY) 51 52 while end_flag: 53 # グレースケールに変換 54 self.gray_next = cv2.cvtColor(self.frame, cv2.COLOR_BGR2GRAY) 55 56 # 特徴点が登録されている場合にOpticalFlowを計算する 57 if self.features is not None: 58 # オプティカルフローの計算 59 features_prev = self.features 60 self.features, self.status, err = cv2.calcOpticalFlowPyrLK( \ 61 self.gray_prev, \ 62 self.gray_next, \ 63 features_prev, \ 64 None, \ 65 winSize = (10, 10), \ 66 maxLevel = 3, \ 67 criteria = CRITERIA, \ 68 flags = 0) 69 70 # 有効な特徴点のみ残す 71 self.refreshFeatures() 72 73 # フレームに有効な特徴点を描画 74 if self.features is not None: 75 for feature in self.features: 76 cv2.circle(self.frame, (feature[0][0], feature[0][1]), 5, (0, 255, 255), 1,100) 77 # 表示 78 cv2.imshow("motion", self.frame) 79 80 # 次のループ処理の準備 81 self.gray_prev = self.gray_next 82 end_flag, self.frame = self.video.read() 83 if end_flag: 84 self.gray_next = cv2.cvtColor(self.frame, cv2.COLOR_BGR2GRAY) 85 86 # インターバル 87 key = cv2.waitKey(self.interval) 88 # "Esc"キー押下で終了 89 if key == ESC_KEY: 90 break 91 # "s"キー押下で一時停止 92 elif key == S_KEY: 93 self.interval = 0 94 elif key == R_KEY: 95 self.interval = INTERVAL 96 97 98 # 終了処理 99 cv2.destroyAllWindows() 100 self.video.release() 101 102 103 # マウスクリックで特徴点を指定する 104 # クリックされた近傍に既存の特徴点がある場合は既存の特徴点を削除する 105 # クリックされた近傍に既存の特徴点がない場合は新規に特徴点を追加する 106 def onMouse(self, event, x, y, flags, param): 107 # 左クリック以外 108 if event != cv2.EVENT_LBUTTONDOWN: 109 return 110 111 # 最初の特徴点追加 112 if self.features is None: 113 self.addFeature(x, y) 114 return 115 116 # 探索半径(pixel) 117 radius = 5 118 # 既存の特徴点が近傍にあるか探索 119 index = self.getFeatureIndex(x, y, radius) 120 121 # クリックされた近傍に既存の特徴点があるので既存の特徴点を削除する 122 if index >= 0: 123 self.features = np.delete(self.features, index, 0) 124 self.status = np.delete(self.status, index, 0) 125 126 # クリックされた近傍に既存の特徴点がないので新規に特徴点を追加する 127 else: 128 self.addFeature(x, y) 129 130 return 131 132 133 # 指定した半径内にある既存の特徴点のインデックスを1つ取得する 134 # 指定した半径内に特徴点がない場合 index = -1 を応答 135 def getFeatureIndex(self, x, y, radius): 136 index = -1 137 138 # 特徴点が1つも登録されていない 139 if self.features is None: 140 return index 141 142 max_r2 = radius ** 2 143 index = 0 144 for point in self.features: 145 dx = x - point[0][0] 146 dy = y - point[0][1] 147 r2 = dx ** 2 + dy ** 2 148 if r2 <= max_r2: 149 # この特徴点は指定された半径内 150 return index 151 else: 152 # この特徴点は指定された半径外 153 index += 1 154 155 # 全ての特徴点が指定された半径の外側にある 156 return -1 157 158 159 # 特徴点を新規に追加する 160 def addFeature(self, x, y): 161 162 # 特徴点が未登録 163 if self.features is None: 164 # ndarrayの作成し特徴点の座標を登録 165 self.features = np.array([[[x, y]]], np.float32) 166 self.status = np.array([1]) 167 # 特徴点を高精度化 168 cv2.goodFeaturesToTrack(self.gray_next, self.features, (10, 10), (-1, -1), CRITERIA) 169 170 # 特徴点の最大登録個数をオーバー 171 elif len(self.features) >= MAX_FEATURE_NUM: 172 print("max feature num over: " + str(MAX_FEATURE_NUM)) 173 174 # 特徴点を追加登録 175 else: 176 # 既存のndarrayの最後に特徴点の座標を追加 177 self.features = np.append(self.features, [[[x, y]]], axis = 0).astype(np.float32) 178 self.status = np.append(self.status, 1) 179 # 特徴点を高精度化 180 cv2.goodFeaturesToTrack(self.gray_next, self.features, (10, 10), (-1, -1), CRITERIA) 181 182 183 # 有効な特徴点のみ残す 184 def refreshFeatures(self): 185 # 特徴点が未登録 186 if self.features is None: 187 return 188 189 # 全statusをチェックする 190 i = 0 191 while i < len(self.features): 192 193 # 特徴点として認識できず 194 if self.status[i] == 0: 195 # 既存のndarrayから削除 196 self.features = np.delete(self.features, i, 0) 197 self.status = np.delete(self.status, i, 0) 198 i -= 1 199 200 i += 1 201 202 203if __name__ == '__main__': 204 Motion().run() 205

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

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

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

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

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

guest

回答1

0

ベストアンサー

表示すべきはself.featuresなのですが、これはある瞬間の動きの大きさを示すベクトルと考えてください。
これが時系列にそって順次移動していくのをトレースしていくのが一般的ですが、単にグラフ化したいとおっしゃられても、何をどう見せたいのか、によって用いるグラフは変わってくると思います。
まずはそこを明らかにした上で、グラフ化の検討をしてみてはいかがでしょうか。

投稿2018/12/11 05:02

kazto

総合スコア7196

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

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

kiraaa

2018/12/11 07:53

回答ありがとうございます。 言葉足らずで申し訳ありません。 現在上記のプログラムを使用して30FPSや240FPSなど各FPS値での特徴点追跡を行なっているのですが、特徴点の追跡の可視化だけでは比較も行い辛く主観での比較は明確なものでは無いと言われたのでグラフ化または数値化して比較を明確に行いたいと思っています。
kiraaa

2018/12/13 04:45

補足ありがとうございます。 出来ればアニメーションではなく静止画を希望なのですがその場合はどうしたら良いでしょう。 何度もすいません
kazto

2018/12/13 05:21

静止画像で表現できるのは3次元までですので、時間軸かX、Y軸、どれかをオミットするか潰してならすかではないでしょうか。
fana

2018/12/13 05:56

異なるFPSによる処理結果の間の「何を」比較する話なのか? 追跡結果の正確性? 追跡処理の失敗(ロスト)の具合? 単に軌跡(形状)の差を見たいだけ? その他?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問