使用OpenCV进行手检测

时间:2012-02-06 23:15:49

标签: c++ image-processing opencv computer-vision

我正在使用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 ;

         }


     }
}

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

2 个答案:

答案 0 :(得分:6)

如果您查看此网站Hand detection using opencv,您会发现与您正在使用的内容类似的algorithm。我会说,检测手的最简单方法是使用颜色(即皮肤检测)。我肯定会建议先查看该网站提供的算法。还有另一部分也会用于手势识别,如果这是您将需要处理的最终问题。

其他可能性包括:

  • 背景减法
    • 这很简单,容易破裂,特别是如果你计划改变背景。但是,如果你只想在白墙前面使用它......这可能是一种简单的方法。
  • 形状分析
    • detecting fingertips使用广义Hough变换取得了一些成功。假阳性可能会成为一种担忧,但效率是一种担忧,特别是在具有大量背景的情况下。

答案 1 :(得分:2)

正如Ancallan上面提到hand detection using opencv,我想补充一些关于手势检测主题的更多信息。在该帖子中,作者使用了一种肤色分割方法,在特定情况下取得了很好的效果。

使用openCV更新了一个新的手势检测帖子,其中作者使用了a HAAR classifier to detect closed palm,结果比前者更加健壮。但需要指出的是,检测对象在某种程度上受到限制,因为一个分类器仅适用于一个手势。