65.9K
CodeProject 正在变化。 阅读更多。
Home

激光手势识别

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (79投票s)

2007年1月9日

3分钟阅读

viewsIcon

334313

downloadIcon

7245

一篇关于设置简单的实时激光手势识别应用程序并使用它来控制 Windows Media Player 的快速文章。

Sample Image - lasergesture.jpg

引言

如果我们不用接触键盘或鼠标就能向电脑发出视觉命令,那岂不是很好?在本文中,我们将组合一个简单的激光手势识别应用程序,并使用它来控制 Windows Media Player。这比使用遥控器舒服得多,因为您不必在黑暗中寻找正确的按钮。您所要做的就是在摄像头视野内的任何地方用激光笔做一些简单的手势,就是这样!该程序识别用激光笔在墙上做出的简单手势,例如左、右、上、下、两个向下的对角线和两个向上的对角线。这个程序可以修改以识别更多手势;但是,由于我没有采用神经网络方法进行图像识别,因此它无法识别复杂的手势。

视频

我们的第一步是从网络摄像头获取视频输入到我们的应用程序中。 我们可以使用 DirectX 的组件 DirectShow 来完成此操作。我直接使用了Andrew Kirillov 的运动检测代码[^](经许可)用于图像采集。我修改了 *MotionDetector1.cs* 中的代码以执行激光手势识别。

致谢

该程序在其视野中搜索亮度高于某个阈值的最亮像素(在我们的例子中是一个激光点)。可以使用其 RGB 值通过一个简单的公式计算像素的亮度

Luminance = (299 * red + 587 * green + 114 * blue) / 1000

找到像素后,它会分析该点沿 x 轴和 y 轴移动了多少。基于这些参数,程序尝试识别运动。例如,如果激光点沿 x 轴的移动量远大于沿 y 轴的移动量,则程序将确定它或多或少是水平移动。然后,根据激光点的初始位置和最终位置,它将确定移动是向左还是向右。它使用类似的技术来检测向上、向下和对角线移动。

控制 Windows Media Player

为了控制 Windows Media Player,程序只是模拟 Media Player 使用的一些键盘快捷键。此代码可以跳到上一首/下一首曲目,或者根据程序识别的手势播放、暂停、停止曲目

// Get a handle to an application window.
[DllImport("USER32.DLL")]
private static extern IntPtr FindWindow(string lpClassName,
    string lpWindowName);

// Activate an application window.
[DllImport("USER32.DLL")]
private static extern bool SetForegroundWindow(IntPtr hWnd);


private void ControlMediaPlayer(string gesture)
{
    IntPtr mediaPlayerHandle = 
           FindWindow("WMPlayerApp", "Windows Media Player");

    // Verify that WMP is a running process.
    if (mediaPlayerHandle == IntPtr.Zero)
    {
        System.Windows.Forms.MessageBox.Show("WMP is not running.");
        return;
    }

    switch (gesture)
    {        
        case "LEFT":
            SetForegroundWindow(mediaPlayerHandle);
            SendKeys.SendWait("^b");
            break;

        case "RIGHT":
            SetForegroundWindow(mediaPlayerHandle);
            SendKeys.SendWait("^f");
            break;

        case "UP":
            SetForegroundWindow(mediaPlayerHandle);
            SendKeys.SendWait("^s");
            break;

        case "DOWN":
            SetForegroundWindow(mediaPlayerHandle);
            SendKeys.SendWait("^p");
            break;
    }
}

使用程序

由于该程序在摄像头的视野中搜索最亮的像素,因此您房间的照明条件可能会影响其性能。因此,调整亮度阈值和照明条件,使任何东西(激光除外)都不超过亮度阈值。

在我在本文中提供的示例程序中,用于控制 Windows Media Player 的手势是

  • 上 – 停止
  • 下 – 播放/暂停
  • 左 – 上一首曲目
  • 右 – 下一首曲目

您还可以轻松地修改代码并使用对角线手势进行音量控制。 :)

结论

我们已经到了本文的结尾。我稍后可能会更新此程序以执行更复杂的手势识别。但是,现在,玩得开心!您可以在我的 博客[^] 上找到一些使用此应用程序控制 Media Player 的视频。您还可以轻松地修改代码,使该程序做的不仅仅是控制 Windows Media Player。玩得开心!

历史

  • [2007 年 1 月 13 日] - 细微的更正
  • [2007 年 1 月 9 日] - 首次发布
© . All rights reserved.