2

我的主要动机是从简单的 RGB 图像(来自我的网络摄像头的图像)中检测手部。我找到了一个示例代码 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 图片。但是可以根据一系列图像做出影响深远的估计。这就是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 回答