2012-02-06 147 views
8

我正在使用OpenCV庫進行圖像處理項目以檢測手部。我初始化了圖像iplimage,給它着色,然後用cvCvtColor(imageHand,imageHand,CV_BGR2HSV); 將它轉換成HSV,我不知道高效的算法,所以這是我的問題。請檢查我的代碼:使用OpenCV進行手部檢測

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!? 如果你知道更好的算法,請引導我。

+0

我清理了拼寫和語法 - 請檢查它以確保信息仍然正確。 – Pubby 2012-02-06 23:23:03

+1

你能指定你需要手部檢測嗎?它應該是實時還是可以離線完成?你需要在各種光照條件下工作嗎?或者,也許你只是在玩? – 2012-02-06 23:31:40

+0

我需要手動檢測代碼將其移植到FPGA,因此它必須是實時和高效的,我希望它在最可能的條件下工作 – 2012-02-07 01:15:47

回答

6

如果你看看這個網站,Hand detection using opencv,你會發現類似algorithm你正在使用。我會說,檢測手的最簡單方法是通過使用顏色(即皮膚檢測)。我肯定會建議先看看該網站提供的算法。還有一部分還涉及到手勢識別,如果這是您需要處理的最終問題。

其他可能性包括:

  • 背景減除
    • 這是非常簡單,不易斷裂,特別是如果你打算在後臺發生變化。但是,如果你只希望在白牆之前使用它,這可能是一個簡單的方法。
  • 形狀分析
    • 已經有使用通用霍夫變換一些成功detecting fingertips。假陽性可能會成爲一個擔憂,但效率是一個擔憂,尤其是在背景數量衆多的情況下。
+0

我正在處理類似的問題。我正在使用顏色。但我發現它有點慢,容易失敗。您提供的鏈接已死亡。你有什麼新的鏈接嗎?我很有興趣看看其他人是如何做到的。 – CB4 2016-07-27 21:32:29

2

Ancallan具有上述hand detection using opencv,我想補充的手勢檢測的話題的更多信息。在這篇文章中,筆者使用了一種膚色分割方法,在特定情況下取得了相當不錯的效果。

使用openCV進行手勢檢測的新帖子已更新,其中作者使用了a HAAR classifier to detect closed palm,結果比前者更穩健。但需要指出的是,檢測對象在某種程度上是有限的,因爲一個分類器只能用於一個手勢。