0

私はopencvにまったく慣れていません。最近、kinectによって検出された最も近いブロブの中心を見つける割り当てが割り当てられました。つまり、kinectの前で手を伸ばすと、手が最も近いブロブになります。あなたの体。

サンプルコードが提供されています。このコードは、オンラインでもここにあります。これまでのところ、2つのアプローチしか考えられません。1つはcvFindContours()を使用してオブジェクトのすべての輪郭を取得し、それぞれをループして最も近いものを見つけます。問題は、各輪郭の深度情報を取得するために使用できる関数があるかどうかわからないため、その方法がわからないことです。

私の2番目のアイデアは、depthMatマトリックスをループして、最も近いポイントと思われる最小値を見つけ、伝播してブロックを見つけ、ブロックを描画することです。これに伴う問題は、非常に多くの計算が必要になるため、kinectビデオの応答が非常に遅くなることです。

誰かがこのタスクについて良い提案をしていますか?ありがとう。

4

1 に答える 1

0

反復範囲ゲーティングを試すことができます。Kinect の最大有効範囲は約 6 m であるため、距離が限られている場合はこれでうまくいく可能性があります。

深度がセンチメートル単位であると仮定します (カウント単位の場合、適切と思われる 10、100、または 1000 カウントのビンにカウントを分割します)。

Mat depthData, objectMask;
Mat closestDepth, closestObjectMask, closestDist;

// getting depth data from kinect out here...

for(int i = 600; i > 0; i -= 20)
{
    threshold(depthData, objectMask, (double)i, 1, THRESH_BINARY_INV);
    // gated out all objects (may need to adjust pixel count for best results)
    Scalar pixelCount = sum(objectMask);
    if(pixelCount.val[0] < 1.0) 
    {
        break;
    }

    closestDepth = depthData; // last good depth data
    closestObjectMask = objectMask; // last good object mask
    closestDist = i; // last closest distance
}

そのループが発生すると、次のようになります。

  • closestDepth - マスクを乗算して実際のオブジェクトの距離を取得するために使用する深度イメージです。
  • closestDist - 「ブラックアウト」前のレンジ ゲートの距離である必要があります。
  • closestObjectMask - 最も近いオブジェクトのマスクである必要があります (最大の輪郭または類似のもので追跡します)

お役に立てば幸いです。

于 2011-10-08T04:35:56.503 に答える