2

私の主な動機は、単純なRGB画像(私のWebカメラからの画像)から手を検出することです。サンプルコードfind_hand_pointを見つけました

    function [result, depth] = find_hand_point(depth_frame)

    % function result = find_hand_point(depth_frame)
    %
    % returns the coordinate of a pixel that we expect to belong to the hand.
    % very simple implementation, we assume that the hand is the closest object
    % to the sensor.

    max_value = max(depth_frame(:));
    current2 = depth_frame;
    current2(depth_frame == 0) = max_value;
    blurred = imfilter(current2, ones(5, 5)/25, 'symmetric', 'same');
    minimum = min(blurred(:));
    [is, js] = find(blurred == minimum);
    result = [is(1), js(1)];
    depth = minimum;

結果変数は、カメラ(手)に最も近いものの座標です。

kinectデバイスからの深度画像がこの関数に渡され、結果は次のようになります。

http://img839.imageshack.us/img839/5562/testcs.jpg

緑の長方形は、カメラ(手)に最も近いものを示しています。

問題:

  1. 私のラップトップカメラがキャプチャする画像は、深度画像ではなく、単純なRGB画像です。
  2. RGB画像をそれらの深度画像に変換する方法はありますか?
  3. 手を検出するための簡単な代替手法はありますか?
4

3 に答える 3

1

Kinectは、追加のセンサーを使用して深度データを取得します。3D画像を再構成するための十分な情報が単一のWebカメラ画像にありません。しかし、一連の画像に基づいて広範囲にわたる推定を行うことは可能です。これが、 XTR-3Dおよび同様のソリューションの背後にある原則です。

于 2012-11-24T16:02:27.157 に答える
1

より簡単なアプローチはhttp://www.andol.info/hci/830.htmにあります。

そこで、作者はrgb画像をhsvに変換し、H、S、V値の特定の範囲を保持します。これは、手のような色であると想定しています。

Matlabの場合:

function [hand] = get_hand(rgb_image) 
    hsv_image = rgb2hsv(rgb_image) 
    hand = ( (hsv_image(:,:,1)>= 0) & (hsv_image(:,:,1)< 20) ) & ( (hsv_image(:,:,2)>= 30) & (hsv_image(:,:,2)< 150) ) & ( (hsv_image(:,:,3)>= 80) & (hsv_image(:,:,3)< 255) ) 
end

これによりhand=...、ピクセル内に1が含まれる行列が得られます。

0 <= H <20 AND 30 <= S <150 AND 80 <= V <255

于 2012-11-24T15:24:25.397 に答える
0

肌の色で手を検出するために私が見つけたより良いテクニック:)

http://www.edaboard.com/thread200673.html

于 2012-11-24T18:00:13.700 に答える