代麗男 韓格欣 薄純娟
摘 要:手勢(shì)識(shí)別已發(fā)展成為計(jì)算機(jī)人機(jī)交互的一個(gè)重要組成部分,穩(wěn)定、高效的識(shí)別系統(tǒng)可將人機(jī)交互體驗(yàn)提升到一個(gè)新的高度。簡(jiǎn)要分析了OpenCV計(jì)算機(jī)視覺(jué)庫(kù),提出了一種可行的手勢(shì)識(shí)別方法,實(shí)現(xiàn)了該算法并驗(yàn)證了其穩(wěn)定性和效率。
關(guān)鍵詞:OpenCV;手勢(shì)識(shí)別;模式識(shí)別;圖像處理
中圖分類號(hào):TP368 文獻(xiàn)標(biāo)識(shí)碼:B 文章編號(hào):2095-1302(2015)06-00-03
0 引 言
隨著科技的日益進(jìn)步,傳統(tǒng)的、基于鍵盤(pán)鼠標(biāo)的人機(jī)交互方式略顯單調(diào)。各國(guó)的研究者們探索著一個(gè)又一個(gè)新的人機(jī)交互方式,而在這些方式中,基于圖像理解的方式已經(jīng)取得了很大的進(jìn)展。我們的生活離不開(kāi)肢體動(dòng)作,而圖像方式是計(jì)算機(jī)能夠理解人類動(dòng)作最直接的方式。圖像處理的研究?jī)?nèi)容非常廣泛,配合統(tǒng)計(jì)、模式識(shí)別等學(xué)科知識(shí)的應(yīng)用,我們已經(jīng)能夠識(shí)別并理解常用的人類肢體動(dòng)作。
在肢體動(dòng)作中,手勢(shì)動(dòng)作又是其中的重點(diǎn)。如今很多新的交互方式都建立在手勢(shì)識(shí)別理解的基礎(chǔ)上,例如:Microsoft的kinect系統(tǒng),primesense的生物識(shí)別系統(tǒng)等。很多公司已經(jīng)將其應(yīng)用到了醫(yī)療、教育教學(xué)、失語(yǔ)者手勢(shì)理解等領(lǐng)域。因此,研究手勢(shì)識(shí)別理解將會(huì)是未來(lái)計(jì)算機(jī)領(lǐng)域的一大熱點(diǎn)。
運(yùn)動(dòng)識(shí)別系統(tǒng)的進(jìn)步伴隨著數(shù)字圖像處理領(lǐng)域的進(jìn)步,各國(guó)學(xué)者相繼開(kāi)發(fā)出了大量?jī)?yōu)秀的計(jì)算機(jī)視覺(jué)和圖像處理軟件包。大多數(shù)軟件包基于計(jì)算速度的考慮采用C/C++ 編寫(xiě)[1]。雖然這些軟件包對(duì)計(jì)算機(jī)圖像處理和計(jì)算機(jī)視覺(jué)的研究提供了很大地便利,但也存在著不足之處[2]:
(1)現(xiàn)行的多數(shù)圖像處理平臺(tái)沒(méi)有提供高級(jí)數(shù)學(xué)函數(shù);
(2)Matlab 的運(yùn)行速度需要提高并且對(duì)宿主機(jī)器的配置要求較高;
(3)絕大多數(shù)圖像處理庫(kù)不支持嵌入式程序開(kāi)發(fā)。
開(kāi)源計(jì)算機(jī)視覺(jué)庫(kù)OpenCV(Open Source Computer Vision Library)的出現(xiàn)極大地彌補(bǔ)了這些不足,給開(kāi)發(fā)者提供了強(qiáng)大的綜合開(kāi)發(fā)平臺(tái)。
1 OpenCV簡(jiǎn)介
OpenCV(Open Source Computer Vision Library)誕生于Intel 研究中心,是一個(gè)開(kāi)放源代碼的、高質(zhì)量的計(jì)算機(jī)視覺(jué)庫(kù)。它輕量且高效,采用C/C++ 語(yǔ)言編寫(xiě),可以運(yùn)行在Linux/Windows/Mac等操作系統(tǒng)上。OpenCV 還提供了Python、Ruby、Matlab及其他語(yǔ)言的接口[3]。OpenCV中包含了大量經(jīng)典的計(jì)算機(jī)視覺(jué)處理函數(shù),這些函數(shù)涵蓋了機(jī)器視覺(jué)領(lǐng)域的大多數(shù)應(yīng)用。OpenCV提供的視覺(jué)處理算法非常豐富,利用其開(kāi)源特性,只要開(kāi)發(fā)者處理得當(dāng),不需要添加新的外部支持也可以支持完整的編譯鏈接生成執(zhí)行程序。
OpenCV 現(xiàn)行版本為2.4.11.0,已放出了3.0.0的Beta版本?,F(xiàn)行版本的OpenCV分為18個(gè)模塊,其中常用的有8個(gè)模塊:
(1)Core:定義基本的數(shù)據(jù)結(jié)構(gòu),包括矩陣和被其他模塊使用的公共函數(shù);
(2)Imgproc:包含線性和非線性圖像過(guò)濾器、幾何圖形變化、色彩空間變化等功能;
(3)Video:包含運(yùn)動(dòng)分析、背景剪切和對(duì)象追蹤等功能;
(4)Calib3d:包含多視角集合算法、3D重建等功能;
(5)Features2d:包含特征匹配等功能;
(6)Objdetect:包含預(yù)定義對(duì)象距離探測(cè)等功能;
(7)Highui:包含一個(gè)簡(jiǎn)單易用的高層級(jí)接口,用以抽象不同操作系統(tǒng)對(duì)視頻提取和圖像操作的功能;
(8)GPU:包含GPU加速相關(guān)的算法,這些算法可以被其他模塊使用以加速程序的運(yùn)轉(zhuǎn)。
2 手勢(shì)識(shí)別簡(jiǎn)介
根據(jù)計(jì)算機(jī)系統(tǒng)檢測(cè)手勢(shì)姿態(tài)的傳感器的不同,我們可以將手勢(shì)識(shí)別理解系統(tǒng)分為兩類:一是利用數(shù)據(jù)手套獲相關(guān)技術(shù);二是利用計(jì)算機(jī)視覺(jué)捕獲和處理圖像流。利用數(shù)據(jù)手套捕獲技術(shù)實(shí)現(xiàn)的手勢(shì)識(shí)別系統(tǒng)使用不方便,用戶需要學(xué)習(xí)的內(nèi)容多且使用場(chǎng)景受到限制,而且成本較高[4]。而基于計(jì)算機(jī)視覺(jué)的手勢(shì)識(shí)別系統(tǒng)則具有使用場(chǎng)景廣闊、使用習(xí)慣符合人體本能、傳感器成本低、普及率高等優(yōu)勢(shì)。
基于圖像的手勢(shì)識(shí)別系統(tǒng)一般可分為手勢(shì)姿態(tài)圖像采集、手勢(shì)姿態(tài)圖像分割、手勢(shì)姿態(tài)特征提取及手勢(shì)姿態(tài)識(shí)別四個(gè)步驟[5]。
在大量手勢(shì)識(shí)別系統(tǒng)的實(shí)際開(kāi)發(fā)過(guò)程中,都牽扯到使用膚色過(guò)濾系統(tǒng)來(lái)分割獲取手勢(shì)的binary圖像。手勢(shì)姿態(tài)的binary圖像的獲取關(guān)系到后期手勢(shì)姿態(tài)理解的穩(wěn)定性和準(zhǔn)確性,但是人體的手部顏色受到個(gè)體差異、光源顏色以及光照角度的影響,其中任何一個(gè)因素變化都將造成陰影、遮蔽等不良影響[6]。手勢(shì)識(shí)別的方法主要有4種,具體見(jiàn)表1。
表1 手勢(shì)識(shí)別方法靜態(tài)識(shí)別[7] 動(dòng)態(tài)識(shí)別[8]
模板匹配法(TM) 動(dòng)態(tài)時(shí)間規(guī)整法(DTW)
神經(jīng)網(wǎng)絡(luò)法(NN) 隱馬爾可夫模型法(HMM)
本文首先使用YCrCb膚色分割算法在使用者在線模式下提取使用者手勢(shì)姿態(tài)30組,利用30組手勢(shì)姿態(tài)的均值測(cè)量出使用者手部的色彩平均值;然后提取環(huán)境光照的平均值、極大值和極小值,利用環(huán)境關(guān)照的取值和手部均值做運(yùn)算,特定區(qū)域內(nèi)找點(diǎn)最少的環(huán)境光照值和手部均值,最后利用這兩個(gè)值進(jìn)行手勢(shì)姿態(tài)圖像binary處理。將得到的binary圖像進(jìn)行特征化處理,得到手部特征點(diǎn),通過(guò)對(duì)特征點(diǎn)的運(yùn)算,得到最終的手勢(shì)姿態(tài)理解。
3 手勢(shì)姿態(tài)的binary處理
手勢(shì)姿態(tài)的binary處理核心代碼如下:
主函數(shù):
frame = cvQueryFrame(capture);
//讀取一幀圖像
//cvShowImage( “Main_cam” , frame);
if( !frame ) break;
assert( 0 ==
binary_image_process( frame , mask , high_threshold1 , high_threshold2 , high_threshold3 , &is_get_binary )
);
cvShowImage( “Binary_cam” , mask );
//binary_image_process函數(shù),使用環(huán)境光和膚色在線測(cè)量均值得到的三個(gè)閾值:threshold1,threshold2,threshold3,分別對(duì)應(yīng)YCrCb顏色空間的Y,CR,CB通道:
IplImage* ycrcb = cvCreateImage( cvGetSize(frame) , 8 , 3 );
cvCvtColor( frame , ycrcb , CV_BGR2YCrCb );
for(int i=0 ; i < ycrcb->height ; i++ ) //二值化
{
uchar *row = (uchar *)(ycrcb->imageData) + i * ycrcb->widthStep;
for(int j=0 ; j < ycrcb->width ; j++ )
{
uchar *p = row + 3*j ;
//if( *(p+1) > threshold2 && *(p+2) < threshold3 )//||
if( *(p) < threshold1 )
{
binary_image->imageData[ i * (binary_image->widthStep) + j ] = 255; // 白色
}
else
{
binary_image->imageData[ i * (binary_image->widthStep) + j ] = 0; // 黑色
}
}
}
IplConvKernel *element = cvCreateStructuringElementEx( 4 , 4 , 0 , 0 , CV_SHAPE_RECT );//創(chuàng)建用于腐蝕的核函數(shù)
cvErode( binary_image , binary_image , element , 1); // Erotion
cvDilate( binary_image , binary_image , NULL , 1); // Dilation
cvReleaseStructuringElement( &element );
cvReleaseImage( &ycrcb );
經(jīng)過(guò)提取的手勢(shì)識(shí)別binary圖形如圖1(a)~(e)所示。
可見(jiàn)此方法提取的binary圖像清晰準(zhǔn)確,具有利用價(jià)值,可以為后期的特征提取與識(shí)別創(chuàng)造有利條件。
(a) (b)
(c) (d)
(e)
圖1 手勢(shì)識(shí)別binary圖形
4 手勢(shì)姿態(tài)特征的識(shí)別與理解
首先,我們通過(guò)對(duì)最小包絡(luò)圓和手腕的計(jì)算得出手掌心的位置,然后利用每個(gè)點(diǎn)與相鄰點(diǎn)做向量外積計(jì)算是否為手指尖點(diǎn)和手縫點(diǎn),最后即可得出手勢(shì)姿態(tài)的全部特征點(diǎn)。
//計(jì)算整個(gè)輪廓的中心點(diǎn)
for( int i=0 ; i < real_contours_number ; i++ ){
contour_rectangle = cvMinAreaRect2( sort_contours[i] , 0 );
arm_center[i].x = cvRound( contour_rectangle.center.x );
arm_center[i].y = cvRound( contour_rectangle.center.y );
cvCircle( frame , arm_center[i] , 10 , CV_RGB(255,255,255) , -1 , 8 , 0 );
}
//取得凸包,畫(huà)出指縫
for( int i=0 ; i < real_contours_number ; i++ ){ get_convex_hull( i );
finger_tip( i );
hand( i );
cvClearSeq( hull ); //清空凸包序列
cvClearSeq( defect );
}
最終,得到的含有全部手勢(shì)特征點(diǎn)的圖像如圖2(a) 、圖2(b)所示。
(a) (b)
圖2 含有全部手勢(shì)特征點(diǎn)的圖像
5 結(jié) 語(yǔ)
新版本的OpenCV計(jì)算機(jī)視覺(jué)庫(kù)給我們提供了很強(qiáng)大的計(jì)算機(jī)視覺(jué)處理能力,利用其提供的高級(jí)別函數(shù)和矩陣運(yùn)算能力,開(kāi)發(fā)者們可以開(kāi)發(fā)出大量基于圖像的應(yīng)用。利用OpenCV強(qiáng)大的可移植能力,開(kāi)發(fā)者可以使用相應(yīng)的移植工具將PC平臺(tái)上的成果轉(zhuǎn)化到移動(dòng)端,這將會(huì)為開(kāi)發(fā)者創(chuàng)造新的機(jī)會(huì)。
參考文獻(xiàn)
[1]喻擎蒼, 翁秀娟, 趙勻,等.交互式開(kāi)放結(jié)構(gòu)計(jì)算機(jī)視覺(jué)平臺(tái)[J]. 計(jì)算機(jī)工程與應(yīng)用,2006,42(23):78-81.
[2]秦小文, 溫志芳, 喬維維. 基于OpenCV的圖像處理[J]. 電子測(cè)試, 2011(7):39-41.
[3]于仕琪, 劉瑞禎. 學(xué)習(xí)OpenCV( 中文版)[M]. 北京:清華大學(xué)出版社,2009.
[4] LEE C, XU Y. Online interactive learning of gestures for human /robot interfaces [C] Proceedings of the 1996 IEEE International Conference on Robotics and Automation. Washington,DC: IEEE Computer Society Press,1996,4: 2982-2987.
[5]趙健, 張冬泉. 基于OpenCV的數(shù)字手勢(shì)識(shí)別算法[J]. 計(jì)算機(jī)應(yīng)用, 2013, 33(z2):193-196.
[6] SURAL S,QIAN G,PRAMANIK S.Segmentation and histogram generation using the HSV color space for image retrieval[C] of the 2002 International Conference on Image Processing.Piscataway: IEEE,2002: 589 - 592.
[7]郭興偉,葛元,王林泉.基于形狀特征的字母手勢(shì)的分類及識(shí)別算法[J].人工智能及識(shí)別技術(shù),2004,30( 18) : 130-132.
[8] LEE H-K,KIM J H. An HMM-based threshold model approach for gesture recognitio[J].IEEE Transactions on Pattern Analysis and Machine Intelligence,1999,21(10):961-973.