web-dev-qa-db-ja.com

カメラが動いたときに画面上の円を動かす

ウェブカメラにアクセスして、キャプチャしたビデオを画面に表示するスクリプトがあります。ビデオの上に非常に簡単に円(長方形、問題ではありません)を描くこともできます。

カメラを物理的に動かすと、ビデオも「動きます」。モニターの左上隅にWebカメラが接続されています。したがって、カメラをモニター全体で右にスライドさせると、ビデオ自体、およびその中のすべてのオブジェクトが左に移動します。しかし、描かれた円が動かないままであることは明らかです。

今度はカメラが動いたときに円を動かしたい。

G1。円にオブジェクトが含まれている場合(pic1のように)、オブジェクトトラッキングアルゴリズムを使用して目標に到達できます。 (私はpythonで作業していて、openCV libを使用しており、いくつかの組み込みアルゴリズム(Boosting、MedianFlow、MIL)、meanshiftアルゴリズムなどもあります)

G2。円にオブジェクトが含まれていない場合があります(pic2のように、基になるオブジェクトがない場合)。これらの場合、オブジェクト追跡アルゴリズムは機能しません。

なんとか問題を説明できたと思います。今私は2つの質問があります:

Q1。目標1を達成するためのより良い方法はありますか?

Q2。どうすれば目標2を達成できますか? (ビデオとオブジェクト(pic2のウォールウォッチ)が左に移動したことを確認し、それに比例して円を移動する方法があるかもしれません。)

任意の助けいただければ幸いです。

P. S. Stack Exchangeプラットフォームは初めてなので、現在のトピックが私の質問(問題)に適さない場合は、どこに投稿すればよいか教えてください。

Pic1Pic2

3
Lorenzo Villani

返信ありがとうございます!

調査した後、G1のより良い解決策を見つけたので、Q1に対する答えを見つけました。

現在は、オブジェクト追跡にLucas-Kanade法(オプティカルフロー推定法)を使用しています。オブジェクトの内側のポイントに言及するだけで(たとえば、非常に小さな円を描くことができます)、そのオブジェクトにくっついています。つまり、円はオブジェクトと共に移動します。この方法の利点の1つはパフォーマンスです。この方法は、質問で述べたオブジェクト追跡アルゴリズムよりもはるかに高速です。必要に応じて、円のサイズを変更できます。中心点のみが重要であるため、pic1の円のようにすることができます。

この方法は2番目の場合にも役立ちます。したがって、白い壁の点について言及すると、パフォーマンスを比較する場合だけでなく、結果を比較する場合にも、オブジェクトトラッキングアルゴリズムよりもうまく機能します。 Lucas-Kanadeメソッドを使用すると、オブジェクトトラッキングアルゴリズムの場合よりも、結果がより正確になり、円は選択したポイントにより近くなります。しかし、この方法では問題が完全に解決するわけではありません(G2)。円が壁の選択した点にくっつかず、他の点にジャンプすることがよくあるからです。しかし、これは私が今のところ達成した最良の結果です。

1
Lorenzo Villani

参照(既知のオブジェクト/マーカー)がなければ、これは事実上不可能です。それは確かに高いでしょう。画像全体をスキャンして、いくつかの明確な領域を参照として選択する必要があります。その後、これらに従ってください。照明の状態、方向、ズームの変化のため、または単にフレームから外れたために、時間が経つにつれて一部が失われます。次に、新しいものが必要になります。したがって、各反復で、方向アイテムを新たにスキャンし、機能する限りそれらを使用する必要があります。おそらく、「新しい」アイテムを失われたアイテムと照合し、今回は少し異なるように見え、各反復でプロパティを更新します。 。異なる参照項目の追跡データの組み合わせは、信頼を提供する必要があります。 「あいまい」になります。

0
Martin Maat

G1とG2を1つのアルゴリズムに組み合わせることができます。

  1. ビュー/画像(座標、サイズ...)内のオブジェクトのマップを作成します:時計、蘭、本、壁紙...
  2. 画像内の一部のオブジェクトを基準にして円(長方形など)を描画します:
    • 正確に24時間体制です。
    • 蘭の上のXYピクセル。
    • (想像力を使って :) )

私にとって明確ではない(そして答えにあまり関係がない)のは、円の初期位置をどのように決定するかです。いくつかの基準を持つアルゴリズムを使用しますか、それとも手動で配置しますか?

0
virolino