🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenCV

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

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

Q&A

1回答

2600閲覧

Python,Opencv,オプティカルフローで右と左を判別したい

kiiiinooookooo

総合スコア0

OpenCV

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

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

0グッド

0クリップ

投稿2020/12/24 06:52

前提・実現したいこと

オプティカルフローを用いて対象物が右に動いたのか左に動いたのかを判別したい。
判別したあとロボットをその方向に進めたい。

発生している問題・エラーメッセージ

オプティカルフローを表示することはできましたが右に進んでいるか左に進んでいるかを判断したいです。
エラーメッセージ

### 該当のソースコード ```python import cv2 import numpy as np # ビデオキャプチャー cap = cv2.VideoCapture("/home/pi/swim/br.mp4") #/home/pi/swim/side.mp4 # Shi-Tomasi法のパラメータ(コーナー:物体の角を特徴点として検出) ft_params = dict(maxCorners=100, # 特徴点の最大数 qualityLevel=0.1, # 特徴点を選択するしきい値で、高いほど特徴点数は厳選されて減る。 minDistance=7, # 特徴点間の最小距離 (特徴点から近い点は、特徴点としない) blockSize=7) # 特徴点の計算に使うブロック(周辺領域)サイズ # Lucas-Kanade法のパラメータ(追跡用) lk_params = dict(winSize=(30, 30), # オプティカルフローの推定の計算に使う周辺領域サイズ maxLevel=0, # ピラミッド数 (デフォルト0:2なら1/4画像まで使用) criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 20, 0.1)) # 探索アルゴリズムの終了条件 # 最初のフレームを取得してレースケール変換 ret, frame = cap.read() gray1 = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) ft1 = cv2.goodFeaturesToTrack( gray1, mask=None, **ft_params) # mask用の配列を生成 mask = np.zeros_like(frame) # 動画終了まで繰り返し while(cap.isOpened()): # 次のフレームを取得し、グレースケールに変換 ret, frame = cap.read() gray2 = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # Lucas-Kanade法でフレーム間の特徴点のオプティカルフローwp計算 ft2, status, err = cv2.calcOpticalFlowPyrLK( gray1, gray2, ft1, None, **lk_params) # オプティカルフローを検出した特徴点を取得(1なら検出) good1 = ft1[status == 1] # 1フレーム目 good2 = ft2[status == 1] # 2フレーム目 # 特徴点とオプティカルフローをフレーム・マスクに描画 for i, (pt2, pt1) in enumerate(zip(good2, good1)): x1, y1 = pt1.ravel() # 1フレーム目の特徴点座標 x2, y2 = pt2.ravel() # 2フレーム目の特徴点座標 # 軌跡を描画(過去の軌跡も残すためにmaskに描く) mask = cv2.line(mask, (x2, y2), (x1, y1), [0, 0, 200], 2) # 現フレームにオプティカルフローを描画 frame = cv2.circle(frame, (x2, y2), 5, [0, 0, 200], -1) # フレームとマスクの論理積(合成) img = cv2.add(frame, mask) # ウィンドウに表示 cv2.imshow('mask', img) # 次のフレーム、ポイントの準備 gray1 = gray2.copy() # 次のフレームを最初のフレームに設定 ft1 = good2.reshape(-1, 1, 2) # 次の点を最初の点に設定 # qキーが押されたら途中終了 if cv2.waitKey(30) & 0xFF == ord('q'): break # 終了処理 cv2.destroyAllWindows() cap.release()

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

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

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

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

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

guest

回答1

0

python

1for i, (pt2, pt1) in enumerate(zip(good2, good1)): 2  x1, y1 = pt1.ravel() # 1フレーム目の特徴点座標 3  x2, y2 = pt2.ravel() # 2フレーム目の特徴点座標

こんにちは、この部分で、前後フレームでの特徴点の座標が取り出しています。ひとまずご質問にあるように、右か左かを判断したければ、たとえば、関心領域の移動方向を平均化すれば、おおよその移動した向きがわかると思います。

投稿2021/01/02 08:44

Kenta_py

総合スコア132

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問