Webカメラのビデオフレームでの堅牢なモーション検出と追跡が必要です。背景は常に同じです。目的は、可能であれば影なしでオブジェクトの位置を特定することですが、影を取り除くことはそれほど緊急ではありません。背景の減算としきい値処理にopencvアルゴリズムを試しましたが、これは背景として1つの画像のみに依存します。背景の明るさが少し変化した場合(またはカメラのオートフォーカス)、アルゴリズムを強力にする必要があります。明るさや影などの変化はほとんどありません。
3 に答える
追跡のための堅牢な方法は、世界中で開発されている幅広い研究関心の一部です...非常に興味深いが、広くて開かれた問題を解決するための鍵がここにあります。
まず、それらの多くは明るさの一定性を前提としています (したがって、あなたが求めていることを達成するのは困難です)。例えば:
- ルーカス・カナデ
- ホーン・シュンク
- ブロックマッチング
追跡に広く使用されていますが、明るさが一定であることを前提としています。
次に、他の興味深いものは平均シフトまたはカムシフト追跡ですが、従うには投影が必要です...ただし、特定のしきい値に応じて計算された逆投影を使用して、堅牢性のニーズに合わせることができます...
それについては後で投稿します、ジュリアン、
OpenCVでしきい値処理を試すとき、RGB(赤、緑、青)またはHSV(色相、彩度、値)のカラー形式でこれを行っていますか?個人的な経験から、しきい値処理用のOpenCVおよびblobの場所を識別するためのcvBlobsLibと組み合わせて使用すると、HSVエンコーディングがビデオフッテージ内の色付きオブジェクトの追跡にはるかに優れていることがわかります。
HSVには、明るい色から暗い色まで、その色のいくつかの色合いが存在する可能性が非常に高いにもかかわらず、色(「色相」)を検出するために単一の数字を使用するだけでよいという利点があるため、HSVはより簡単です。(色の量と色の明るさは、それぞれ「彩度」と「値」のパラメーターによって処理されます)。
cvInRange()OpenCV APIの呼び出しを使用して、HSV参照画像('imgHSV')をしきい値設定し、バイナリ(白黒)画像を取得します。
cvInRangeS( imgHSV,
cvScalar( 104, 178, 70 ),
cvScalar( 130, 240, 124 ),
imgThresh );
上記の例では、2つのcvScalarパラメーターは、青みがかった色相を表すHSV値の下限と上限です。私自身の実験では、発生する色相/彩度/輝度値の種類を追跡および観察することに関心のあるオブジェクトのスクリーンショットを取得することで、適切な最大/最小値を取得することができました。
コードサンプルを含む詳細な説明は、このブログ投稿にあります。
アンドリアンにはクールなチュートリアルがあります http://www.pyimagesearch.com/2015/05/25/basic-motion-detection-and-tracking-with-python-and-opencv/
私は従い、良い実験テストをしてい ます https://youtu.be/HJBOOZVefXA
静止画も使ってる
frameDelta = cv2.absdiff(firstFrame, gray)
thresh = cv2.threshold(frameDelta, 25, 255, cv2.THRESH_BINARY)[1]
thresh = cv2.dilate(thresh, None, iterations=2)
(cnts, _) = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
4行のコードは動きをよく見つけます