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

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

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

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

Python 3.x

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

Q&A

1回答

4191閲覧

cv2.cornerSubPix関数からcv2.goodFeaturesToTrack関数に変更したい

kiraaa

総合スコア12

OpenCV

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

Python 3.x

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

0グッド

0クリップ

投稿2018/12/25 05:07

現在anacondaのspyder(OpenCV3.6)にて2撮影した動画をcv2.calcOpticalFlowPyrLK()関数を用いて移動体の追跡の可視化を行っています。
下記のサイトのプログラムを参考にしているのですが
https://qiita.com/hitomatagi/items/3d8973f855e963c9d999
ここでは特徴点検出の方法をcv2.cornerSubPix関数で行っています・
しかし調べているとcv2.goodFeaturesToTrack関数のほうが精度が良いという事を知ったので変更したのですが特徴点を付与するためにマウスを左クリックする度に以下のようなエラーが出てしまいました。
解決方法をご教授頂けると幸いです。

---エラー文
Traceback (most recent call last):
File "LK2.py", line 110, in onMouse
self.addFeature(x, y)
File "LK2.py", line 165, in addFeature
cv2.goodFeaturesToTrack(self.gray_next, self.features, (10, 10), (-1, -1), CRITERIA)
TypeError: only size-1 arrays can be converted to Python scalars

python

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

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

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

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

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

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

guest

回答1

0

cv::cornerSubPixcv::goodFeaturesToTrackでは引数が異なります。
適切な引数を渡すように修正が必要です。
具体的にどう修正すべきかは各関数の処理内容を把握する必要があります。

投稿2018/12/25 06:42

can110

総合スコア38266

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

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

kiraaa

2018/12/25 07:27

回答ありがとうございます。 Shi-Tomasiのコーナー検出パラメータを入れて変更してみました。 パラメーター feature_params = dict( maxCorners = 100, qualityLevel = 0.3, minDistance = 7, blockSize = 7 ) 変更点 cv2.goodFeaturesToTrack(self.gray_next, self.features, **feature_params) このようなエラーになってしまいました Traceback (most recent call last): File "LK2.py", line 116, in onMouse self.addFeature(x, y) File "LK2.py", line 171, in addFeature cv2.goodFeaturesToTrack(self.gray_next, self.features, **feature_params) TypeError: Argument given by name ('maxCorners') and position (2)
kiraaa

2018/12/25 07:30

名前を変更したところ先ほどのエラーは消えましたが 結局TypeError: only size-1 arrays can be converted to Python scalarsと変わらずエラーが出てしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問