使用OpenCV进行手部检测

8

我正在使用OpenCV库为图像处理项目检测手部。我使用iplimage初始化图像,上色,并使用cvCvtColor(imageHand,imageHand,CV_BGR2HSV );将其转换为HSV格式。

因为不知道高效的算法,所以遇到了问题。请检查我的代码:

for( int row = 0; row < imageHand->height; row++ )
{
    for ( int col = 0; col < imageHand->width; col++ )
    {
       h =(imageHand->imageData[imageHand->widthStep * row + col * 3]) ;
    s = (imageHand->imageData[imageHand->widthStep * row + col * 3 + 1]);
    v = (imageHand->imageData[imageHand->widthStep * row + col * 3 + 2]);

         if(  h>85)
         {
     imageHand->imageData[imageHand->widthStep * row + col * 3 ]     = 0 ;
     imageHand->imageData[imageHand->widthStep * row + col * 3 + 1 ] =0 ;
     imageHand->imageData[imageHand->widthStep * row + col * 3 + 2 ] = 0 ;
         }
         else
         {
         imageHand->imageData[imageHand->widthStep * row + col * 3 ]     = 255 ;
     imageHand->imageData[imageHand->widthStep * row + col * 3 + 1 ] = 255 ;
         imageHand->imageData[imageHand->widthStep * row + col * 3 + 2 ] = 255 ;

         }


     }
}

我认为搜索的范围是> 85的? 如果您知道比这更好的算法,请指导我。


我已经清理了拼写和语法 - 请检查以确保信息仍然正确。 - Pubby
1
您能具体说明需要手势检测的用途吗?需要实时完成还是可以离线处理?您需要在各种光照条件下都可使用吗?或者您只是在玩呢? - Ernest Staszuk
我需要手部检测代码,以便将其移植到FPGA上,因此它必须是实时和高效的,并且我希望它能够适用于最有可能的条件。 - Mohamed Kamal
2个回答

6
如果您查看此网站使用opencv进行手部检测,您将找到与您使用的类似算法。我会说最简单检测手部的方法是通过颜色(即皮肤检测)。我强烈建议首先查看该网站提供的算法。还有另一部分也进入了手势识别,如果这是一个你最终需要处理的问题。

其他可能性包括:

  • 背景减除
    • 这非常简单,容易破坏,特别是如果您计划更改背景。但是,如果您希望仅在白墙前使用它......这可能是一种简单的方法。
  • 形状分析
    • 使用广义霍夫变换已经成功地检测到指尖。但是假阳性可能会成为一个问题,效率方面则需要考虑,在有显著的背景情况下尤其如此。

我正在解决类似的问题。我正在使用颜色。但我发现它有点慢且容易出错。你提供的链接已经失效了。你有新链接吗?我很想看看其他人是如何解决这个问题的。 - CB4

2

正如Ancallan所提到的,使用OpenCV进行手部检测,我想在手势检测方面添加更多信息。在那篇文章中,作者采用了一种皮肤颜色分割的方法,在特定情况下取得了相当好的结果。

最新更新了一篇使用OpenCV进行手势识别的文章,其中作者使用HAAR分类器来检测闭合手掌,结果比前面的方法更加稳健。但需要指出的是,检测对象有些受限制,因为一个分类器只能针对一个手势工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接