基於 OpenCv 和 Python 的手指識別及追蹤

嬌兮心有之發表於2018-12-16

前言

手指追蹤是許多計算機視覺應用的重要特徵。在該應用中,使用基於直方圖的方法將手與背景幀分離。 使用閾值處理和濾波技術來進行背景消除以獲得最佳結果。

Python學習資料或者需要程式碼、視訊加Python學習群:960410445

GitHub地址:https://github.com/amarlearning/opencv

本文為 AI 研習社編譯的技術部落格,原標題 Finger Detection and Tracking using OpenCV and Python,作者為Jason Brownlee。

翻譯 | 餘杭 Lamaric 校對 | 吳曉曼 稽核 | 餘杭

要跟蹤使用者手部移動的應用程式中,膚色在要跟蹤使用者手部移動的應用程式中,膚色直方圖將非常有用。使用直方圖從影象中剔除背景,僅留下包含膚色的影象部分。

檢測皮膚的一種更簡單的方法是找到特定 RGB 或 HSV 範圍內的畫素。如果您想了解更多有關此方法的資訊,可以檢視官方文件:(https://docs.opencv.org/3.4.2/df/d9d/tutorial_py_colorspaces.html)。

上述方法的問題在於改變光線條件和膚色可能會使皮膚檢測的結果很糟糕。另一方面,直方圖往往更準確,並且直方圖能夠考慮到當前的光照條件。

 

在框架中繪製一個綠色的長方形並且使用者將他們的手放置在長方形中。應用程式提取使用者手掌的膚色,然後繪製成一個直方圖。

繪製長方形的過程遵循以下函式:

 

這個過程非常簡單——我建立了四行程式碼來表示每個長方形的座標。

hand_rect_one_x

hand_rect_one_y

hand_rect_two_x

hand_rect_two_y

這四行程式碼不斷迭代以在框架內使用:cv2.rectangle 繪製生成長方形;這裡的total_rectangle表示行列的長度9。

現在使用者理解了在哪裡放置他們的手掌,接下來成功的關鍵步驟是從這些長方形中提取畫素,然後基於畫素生成 HSV 直方圖

 

函式把輸入框架轉換成 HSV 直方圖。使用 Numpy 庫生成一張影象。影象大小為[90*10],顏色通道數為 3。我們將其命名為 ROI (Region of Interest). 它從綠色的長方形中提取了 900 個畫素值,然後將它們放入 ROI 矩陣中。cv2.calcHist 基於 ROI 矩陣給膚色建立了一個直方圖並且 cv2.normalize 使用 norm 型別對矩陣進行歸一化 cv2.NORM_MINMAX 。現在我們可以用直方圖來檢測框架中的皮膚區域。

現在使用者理解了將他們的手掌放在哪裡,下一步就是從這些長方形中提取畫素然後用它們生成HSV直方圖。

現在基於膚色直方圖我們可以找到包含皮膚的框架區域,OpenCV 提供了一個簡便的方法,cv2.calvBackProject,該方法使用直方圖來分離影象中的特徵。我通過這個函式來把膚色直方圖應用到框架中。如果你想獲取更多關於 back project 的資訊,可以通過連結1(https://docs.opencv.org/master/dc/df6/tutorial_py_histogram_backprojection.html)和連結2(https://docs.opencv.org/2.4/doc/tutorials/imgproc/histograms/back_projection/back_projection.html)來獲取。

相關文章