用hough+細化的方法,識別速度快,但是在某些情況下容易造成誤差,識別不是很穩定。如下圖:
由於深度圖的視差等原因,會有些點找不到,如上圖握拳後掌心位置,如果還採用前一章的方法,細化結果會很糟糕(掌心處會產生若干干擾線段)造成識別不準確。
可以利用圖像形態學中的開閉運算消除這種影響,但是當五指靠的非常近時會對手指間造成惡劣的影響(五指被靠在一起了)。
考慮其他方法:利用圖像輪廓+圖像中凸包和凸缺陷以及矩的概念進行識別。
opencv提供了輪廓圖像的輪廓檢測,通過返回最外層輪廓可以得到手的邊緣。
利用輪廓然後可以得到凸包和凸缺陷,從而得到一系列凸頂點和凸缺陷(凹)頂點和凹的深度(其中包含指尖座標)
如上圖所示,一隻手有很多凸缺陷,需要一定的策略判斷哪些是手指縫那些是干擾,可利用
凹的深度和凸點和凹點的夾角([0,90))進行閾值判斷,夾角利用三點的向量積求得。但是大拇指比較特殊(當張開很大時角度可能偏大)
這裏可以利用矩的概念進行識別,
矩是沿X,y方向的積分,因此有一個輪廓矩的概念,
輪廓矩是沿輪廓邊界像素的積分,
用來計算形狀的重心,面積,主軸和其它的形狀特徵等,因此可以求得手掌重心,根據其與凸缺陷點的物理距離可以捨去其他干擾因素。最終可求得指尖座標。
相對上章算法,輪廓算法識別速度略顯慢,但是識別精度比較高,穩定性好。不影響實時識別。但是存在下面問題:當只有一個手指頭伸出或者做“六”動作的時候,輪廓不存在凹點,也就無法識別指尖了,因此,需要結合:
對輪廓識別出來後,如果輪廓法識別出0個指尖,那麼對輪廓內部進行填充(消除第一張圖的影響),利用hough法進行識別。兩者的結果即爲最終結果。
上結果圖:
手指識別做好後,可以基於它做許多的應用,我基於識別結果做了個小的實例,可以隔空查看圖片和看視頻,廢話不說,上圖。
看圖
看電影
如果將其與一些軟件結合,可以做出很好的前景。如將其與U3D,UDK等3維可視化軟件結合,可以做出一些比較有意思的體感遊戲。