7

ウェブカメラでレーザーライトドット(壁にある)を追跡したいのですが、openCVを使用してこのタスクを実行しています。誰かが私にC++でそれを行う方法を提案できますか?

ありがとうございました !

4

6 に答える 6

8

背景の安定性と、画像でやりたいことによって、3つのオプションがあります。

画像を暗くして、レーザーポイントだけを見ることができます。これを行うには、絞りを閉じるか、シャッター時間を短縮します。安価なウェブカメラでも、これは通常、ドライバーで実行できます。これを実行すると、レーザーポイントを見つける作業は非常に簡単になります。通常、レーザーが当たるポイントは明るすぎてカメラが捉えられないため、画像をできるだけ暗くします。これは、(あなたが経験したように)光レーザードットと画像内の他の光オブジェクトを区別できないことを意味します。暗くすることで、これを行うことができます。

画像の他の用途(人に見せること)があり、背景が安定している場合は、最後のいくつかのビデオ画像の平均を「背景」として使用して、その背景の間に大きな違いがある場所を見つけることもできますそして最新の画像。これは通常、レーザーが向けられている場所です(ここでも、背景が十分に安定している場合)。

最後に、背景が安定しておらず、画像を非常に暗くしたくない場合、最後のオプションは、緑と青よりも赤のチャネルで非常に明るく、明るいすべてのピクセルを探すことです(あなたは赤いレーザーを使用しています)。このシステムはまだ白い斑点に気を取られますが、明るいピクセルを見つけるほどではありません。レーザーポインタースポットの中心が実際にレーザーの色に関係なく明るい白で表示されている場合、この手法を使用すると、この明るいスポット(レーザーがそれほど明るくないドットの外側部分)の周りの「リング」を見つけることができます。それは画像のレーザーの実際の色で表示されるように中央にあります)。次に、これらの円を埋めるために、単純な形態学的操作を使用できます(おそらく閉じるだけで十分です)。

于 2010-10-25T13:21:15.137 に答える
4

赤、緑、青のいずれかの色のレーザーを使用するとします。レーザードットが非常に明るく見える場合(少なくとも1つのチャネル、たとえば赤)、画像/チャネルをたとえばグレー値200でしきい値処理するだけで、レーザー光の候補がいくつか残ります。この領域で他のチャネルが暗い場合は、適切な色の明るい光であることがわかります。サイズで少しフィルタリングすると、スポットを見つける可能性が高くなります。

于 2010-10-24T20:53:35.757 に答える
3

ウェブカメラにIRフィルターを貼り付けると、投影が取得されないため、レーザーポイントの検出がはるかに簡単になります(単純なバックグラウンド減算などを使用)。これは、レーザーポインターがIR光を放射することを前提としています...

于 2010-10-25T12:55:08.557 に答える
1

他の回答で示唆されているように、色を検索することは良い考えかもしれません。特定の色の範囲を探すことを検討する必要があります。これを行う最良の方法は、画像をHSLまたはHSV色空間に変換することです。

cv::cvtColor(src, hsv, COLOR_BGR2HSV);

ウィキペディアの詳細情報。

次に、色相(=色)、彩度、明度(または値)の3つのチャネルがあります。

これcv::inRange(hsv, cv::Scalar(159, 135, 165), cv::Scalar(179, 255, 200), inRange);で、カラー範囲内のピクセルを示す白黒画像を生成できます。スカラーは、各チャネルの下限値と上限値です。

この例では、色が159〜179(色相)、彩度が135〜255、値が165〜200のピクセルを取得します。

多分これはあなたの追跡を改善することができます。

于 2013-10-28T10:00:40.483 に答える
1

このコードはどうですか

https://www.youtube.com/watch?v=MKUWnz_obqQ

https://github.com/niitsuma/detect_laser_pointer

このコードでは、観測されたHSV色が、ホテリングのt二乗検定を使用して登録された色と比較されます。

于 2014-05-25T05:44:33.640 に答える
0

テンプレートマッシングを試してください。まず、寺院を完成させるために、特定の場所に「ポインターを向ける」。次に、それを探します。

または、jilles de witが言ったように、最後の2フレームの差を取ることができます。おそらく、差によってポインタが表示されます。

最後の2フレームをグレースケールで変換してから、SUB関数を適用します。

于 2011-01-31T22:48:38.487 に答える