您好,登錄后才能下訂單哦!
如何使用C++中的OpenCV實現手勢識別,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
先給大家上效果圖:
源碼在下面
使用 RGB 值分割手部區域,即手部的 GB 值將與背景不同
或者使用邊緣檢測
或者
背景減法。
我這里使用了背景減法模型。OpenCV為我們提供了不同的背景減法模型,codebook 它的作用是對某些幀進行一段時間的精確校準。其中對于它獲取的所有圖像;它計算每個像素的平均值和偏差,并相應地指定框。
在前景中它就像一個黑白圖像,只有手是白色的
用 Convex Hull 來找到指尖。Convex hull 基本上是包圍手部區域的凸集。
包圍手的紅線是凸包。基本上它是一個凸起;如果我們在紅色區域內取任意兩點并將它們連接起來形成一條線,那么這條線就完全位于集合內。
黃點是缺陷點,會有很多這樣的缺陷點,即每個谷都有一個缺陷點。現在根據缺陷點的數量,我們可以計算展開的手指數量。
大概就是
手部區域提取是使用背景減法完成的。
對于尖端點,深度點凸度缺陷。
提取輪廓和檢測凸點的主要代碼在函數中
無效檢測(IplImage* img_8uc1,IplImage* img_8uc3);
將相機放在穩定的背景前;運行代碼,等待一段時間。校準完成后。你會看到顯示一些干擾的連接組件圖像。把你的手放在相機視圖中。
沒什么好說的直接看代碼會比較容易理解
核心代碼
int main(int argc, char** argv) { const char* filename = 0; IplImage* rawImage = 0, *yuvImage = 0; IplImage *ImaskCodeBook = 0,*ImaskCodeBookCC = 0; CvCapture* capture = 0; int c, n, nframes = 0; int nframesToLearnBG = 300; model = cvCreateBGCodeBookModel(); model->modMin[0] = 3; model->modMin[1] = model->modMin[2] = 3; model->modMax[0] = 10; model->modMax[1] = model->modMax[2] = 10; model->cbBounds[0] = model->cbBounds[1] = model->cbBounds[2] = 10; bool pause = false; bool singlestep = false; for( n = 1; n < argc; n++ ) { static const char* nframesOpt = "--nframes="; if( strncmp(argv[n], nframesOpt, strlen(nframesOpt))==0 ) { if( sscanf(argv[n] + strlen(nframesOpt), "%d", &nframesToLearnBG) == 0 ) { help(); return -1; } } else filename = argv[n]; } if( !filename ) { printf("Capture from camera\n"); capture = cvCaptureFromCAM( 0 ); } else { printf("Capture from file %s\n",filename); capture = cvCreateFileCapture( filename ); } if( !capture ) { printf( "Can not initialize video capturing\n\n" ); help(); return -1; } for(;;) { if( !pause ) { rawImage = cvQueryFrame( capture ); ++nframes; if(!rawImage) break; } if( singlestep ) pause = true; if( nframes == 1 && rawImage ) { // CODEBOOK METHOD ALLOCATION yuvImage = cvCloneImage(rawImage); ImaskCodeBook = cvCreateImage( cvGetSize(rawImage), IPL_DEPTH_8U, 1 ); ImaskCodeBookCC = cvCreateImage( cvGetSize(rawImage), IPL_DEPTH_8U, 1 ); cvSet(ImaskCodeBook,cvScalar(255)); cvNamedWindow( "Raw", 1 ); cvNamedWindow( "ForegroundCodeBook",1); cvNamedWindow( "CodeBook_ConnectComp",1); } if( rawImage ) { cvCvtColor( rawImage, yuvImage, CV_BGR2YCrCb ); if( !pause && nframes-1 < nframesToLearnBG ) cvBGCodeBookUpdate( model, yuvImage ); if( nframes-1 == nframesToLearnBG ) cvBGCodeBookClearStale( model, model->t/2 ); if( nframes-1 >= nframesToLearnBG ) { cvBGCodeBookDiff( model, yuvImage, ImaskCodeBook ); centers if desired cvCopy(ImaskCodeBook,ImaskCodeBookCC); cvSegmentFGMask( ImaskCodeBookCC ); cvShowImage( "CodeBook_ConnectComp",ImaskCodeBookCC); detect(ImaskCodeBookCC,rawImage); } cvShowImage( "Raw", rawImage ); cvShowImage( "ForegroundCodeBook",ImaskCodeBook); } c = cvWaitKey(10)&0xFF; c = tolower(c); if(c == 27 || c == 'q') break; switch( c ) { case 'h': help(); break; case 'p': pause = !pause; break; case 's': singlestep = !singlestep; pause = false; break; case 'r': pause = false; singlestep = false; break; case ' ': cvBGCodeBookClearStale( model, 0 ); nframes = 0; break; case 'y': case '0': case 'u': case '1': case 'v': case '2': case 'a': case '3': case 'b': ch[0] = c == 'y' || c == '0' || c == 'a' || c == '3'; ch[1] = c == 'u' || c == '1' || c == 'a' || c == '3' || c == 'b'; ch[2] = c == 'v' || c == '2' || c == 'a' || c == '3' || c == 'b'; printf("CodeBook YUV Channels active: %d, %d, %d\n", ch[0], ch[1], ch[2] ); break; case 'i': case 'o': case 'k': case 'l': { uchar* ptr = c == 'i' || c == 'o' ? model->modMax : model->modMin; for(n=0; n<NCHANNELS; n++) { if( ch[n] ) { int v = ptr[n] + (c == 'i' || c == 'l' ? 1 : -1); ptr[n] = CV_CAST_8U(v); } printf("%d,", ptr[n]); } printf(" CodeBook %s Side\n", c == 'i' || c == 'o' ? "High" : "Low" ); } break; } } cvReleaseCapture( &capture ); cvDestroyWindow( "Raw" ); cvDestroyWindow( "ForegroundCodeBook"); cvDestroyWindow( "CodeBook_ConnectComp"); return 0; }
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。