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

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

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

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

Python

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

解決済

オプティカルフローで物体検知をしたいが新規に画面に入った物体が検知できない

ta.eee
ta.eee

総合スコア0

OpenCV

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

Python

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

1回答

0評価

0クリップ

25閲覧

投稿2021/03/22 01:17

現状

pythonでオプティカルフローを使用しています。
様々なサイトのサンプルコードを使用させてもらって実験をしているのですが、画面に新しく入ってきた物体の検知ができません。
どこがおかしいのか、ご教示いただけると幸いです。

問題点

最初から画面に映っていた物体の検知はできますが、動画の途中から新しく入ってきた物体の検知ができません。

python

import cv2 import numpy as np input_file = 'input.mp4' output_file = 'output.mp4' cap = cv2.VideoCapture(input_file) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') fps = int(cap.get(cv2.CAP_PROP_FPS)) writer = cv2.VideoWriter(output_file, fourcc, fps, (width, height)) # Shi-Tomasiのコーナー検出パラメータ feature_params = dict( maxCorners = 100, qualityLevel = 0.3, minDistance = 20, blockSize = 20, ) # Lucas-Kanade法のパラメータ lk_params = dict( winSize = (15,15), maxLevel = 2, criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)) # ランダムに色を100個生成(値0~255の範囲で100行3列のランダムなndarrayを生成) color = np.random.randint(0, 255, (100, 3)) # 最初のフレームの処理 end_flag, frame = cap.read() gray_prev = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) feature_prev = cv2.goodFeaturesToTrack(gray_prev, mask = None, **feature_params) mask = np.zeros_like(frame) while(end_flag): # グレースケールに変換 gray_next = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # オプティカルフロー検出 feature_next, status, err = cv2.calcOpticalFlowPyrLK(gray_prev, gray_next, feature_prev, None, **lk_params) # オプティカルフローを検出した特徴点を選別(0:検出せず、1:検出した) good_prev = feature_prev[status == 1] good_next = feature_next[status == 1] # オプティカルフローを描画 for i, (next_point, prev_point) in enumerate(zip(good_next, good_prev)): prev_x, prev_y = prev_point.ravel() next_x, next_y = next_point.ravel() ans = cv2.norm(next_point - prev_point); mask = cv2.line(mask, (next_x, next_y), (prev_x, prev_y), color[i].tolist(), 2) frame = cv2.line(frame, (int(width/2), 0), (int(width/2), int(height)), (255, 255, 255), thickness=1, lineType=cv2.LINE_4) img = cv2.add(frame, mask) gray_prev = gray_next.copy() feature_prev = good_next.reshape(-1, 1, 2) #feature_prev = cv2.goodFeaturesToTrack(gray_next, mask = None, **feature_params) end_flag, frame = cap.read() writer.write(img) writer.release() cap.release()

試したこと

上記コードのwhile文の最後の方の
feature_prev = good_next.reshape(-1, 1, 2)
を以下に変更すると新しく動画に入ってきたものを検知できますが、連続した特徴点が取れなくなってしまいます。
feature_prev = cv2.goodFeaturesToTrack(gray_next, mask = None, **feature_params)

行いたいこと

Frameごとに異なる特徴点ではなく、連続した特徴点で物体検知をしたいのですが、どのようにすれば良いでしょうか?
ご教示いただけますと幸いです。
よろしくお願い致します。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

OpenCV

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

Python

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