web-dev-qa-db-ja.com

OpenCVを使用して人を検出および追跡するにはどうすればよいですか?

私は屋内に向けて静止しているカメラを持っています。人々は、カメラから約5メートル以内にカメラを通り過ぎます。 OpenCVを使用して、過去を歩いている個人を検出したい-私の理想的な戻り値は、境界矩形を持つ検出された個人の配列です。

私はいくつかの組み込みサンプルを見てきました。

  • Pythonサンプルはどれも本当に適用されません
  • [〜#〜] c [〜#〜] blobトラッキングサンプルは有望に見えますが、ライブビデオを受け入れないため、テストが困難になります。また、最も複雑なサンプルであるため、関連する知識を抽出し、それをPython APIに変換するのは問題があります。
  • [〜#〜] c [〜#〜] 'motempl'サンプルも、後続のビデオフレームからシルエットを計算するという点で有望に見えます。おそらく、それを使用して強力に接続されたコンポーネントを見つけ、個々のブロブとそのバウンディングボックスを抽出できますが、後続のフレームで見つかったブロブを同じブロブとして識別する方法を見つけようとすることはまだ残っています。

誰でもこれを行うためのガイダンスやサンプルを提供できますか?できればPythonで?

35
Nick Johnson

OpenCVの最新のSVNバージョンには、HOGベースの歩行者検出の(文書化されていない)実装が含まれています。事前学習済みの検出器とpythonラッパーも付属しています。基本的な使用法は次のとおりです。

from cv import *

storage = CreateMemStorage(0)
img = LoadImage(file)  # or read from camera

found = list(HOGDetectMultiScale(img, storage, win_stride=(8,8),
                padding=(32,32), scale=1.05, group_threshold=2))

したがって、追跡する代わりに、各フレームで検出器を実行し、その出力を直接使用することもできます。

見る src/cvaux/cvhog.cpp実装用およびsamples/python/peopledetect.pyより完全なpythonの例(両方ともOpenCVソースにあります)。

27
Martin

ニック、

探しているのは、人の検出ではなく、動きの検出です。あなたが解決しようとしていることについてもっと詳しく教えていただければ、より良い回答が得られます。とにかく、結果をどうしようとしているかに応じて、動き検出を行う多くの方法があります。最も単純なものはしきい値処理が続く差分処理であり、複雑なものは適切なバックグラウンドモデリング->前景減算->形態学的操作->連結成分分析、それに続く必要に応じてブロブ分析です。 opencvコードをダウンロードして、サンプルディレクトリを確認します。あなたが探しているものを見るかもしれません。また、OCVに関するOreillyの本があります。

これがお役に立てば幸いです、ナンド

5
Nand

これは明らかに重要な作業です。インスピレーションを得るには科学出版物を調べる必要があります( Google Scholar はあなたの友人です)。人間の検出と追跡に関する論文を次に示します。 高速平均シフトモードシークによる人間の追跡

4
geschema

これは、コンピュータビジョンコースの一環として行ったプロジェクトに似ており、すぐに解決するのは難しい問題であると言えます。

前景/背景のセグメンテーションを使用して、すべてのブロブを見つけてから、それらが人間であると判断できます。問題は、人々が一緒に行ったり、お互いを通り過ぎたりする傾向があるため、うまく機能しないことです。そのため、ブロブは2人で構成されている可能性が高く、その後、歩いていくにつれてブロブが分割されてマージされることがわかります。

1つのBLOBで複数の人を区別する方法が必要になります。これは、誰もが単一のSOポストで回答できることを期待する問題ではありません。

私のアドバイスは、利用可能な研究に飛び込み、そこで何かを見つけることができるかどうかを確認することです。これを行う製品が存在することを考えると、問題は解決できません:Autolivには、車のIRカメラを使用して歩行者を検出する製品があり、店舗に出入りする顧客のカウントを扱う他の製品を見てきました。

2
Hannes Ovrén