久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

C++基于OpenCV實現(xiàn)手勢識別的源碼

這篇文章主要介紹了C++基于OpenCV手勢識別的實現(xiàn)源碼,這里用到背景減法模型知識,具體實例代碼跟隨小編一起看看吧

先給大家上效果圖:

請?zhí)砑訄D片描述

源碼在下面

使用 RGB 值分割手部區(qū)域,即手部的 GB 值將與背景不同
或者使用邊緣檢測
或者
背景減法。

 我這里使用了背景減法模型。OpenCV為我們提供了不同的背景減法模型,codebook   它的作用是對某些幀進行一段時間的精確校準。其中對于它獲取的所有圖像;它計算每個像素的平均值和偏差,并相應地指定框。

在前景中它就像一個黑白圖像,只有手是白色的

在這里插入圖片描述

用 Convex Hull 來找到指尖。Convex hull 基本上是包圍手部區(qū)域的凸集。

在這里插入圖片描述

包圍手的紅線是凸包?;旧纤且粋€凸起;如果我們在紅色區(qū)域內取任意兩點并將它們連接起來形成一條線,那么這條線就完全位于集合內。

在這里插入圖片描述

黃點是缺陷點,會有很多這樣的缺陷點,即每個谷都有一個缺陷點。現(xiàn)在根據(jù)缺陷點的數(shù)量,我們可以計算展開的手指數(shù)量。

大概就是
手部區(qū)域提取是使用背景減法完成的。
對于尖端點,深度點凸度缺陷。
提取輪廓和檢測凸點的主要代碼在函數(shù)中
無效檢測(IplImage* img_8uc1,IplImage* img_8uc3);

將相機放在穩(wěn)定的背景前;運行代碼,等待一段時間。校準完成后。你會看到顯示一些干擾的連接組件圖像。把你的手放在相機視圖中。

沒什么好說的直接看代碼會比較容易理解
核心代碼


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;
}

要直接跑代碼調試的,可以直接去下載

到此這篇關于C++基于OpenCV實現(xiàn)手勢識別的源碼的文章就介紹到這了,更多相關OpenCV手勢識別內容請搜索html5模板網(wǎng)以前的文章希望大家以后多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯(lián)系我們刪除處理,感謝您的支持!

相關文檔推薦

這篇文章主要介紹了++ 設計模式的基本原則,主要的目標是實現(xiàn)最終目的,高內聚,低耦合,開放封閉原則類的改動是通過增加代碼進行的,感興趣的小伙伴可參考下面文章的具體內容
下面小編就為大家?guī)硪黄钊肜斫鈉++指針的指針和指針的引用。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考,一起跟隨小編過來看看吧
C++ 提供了異常機制,讓我們能夠捕獲運行時錯誤,本文就詳細的介紹了C++異常處理入門,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇文章主要給大家介紹了關于C/C++中的內存模型和名稱空間詳解,文中通過示例代碼介紹的非常詳細,對大家學習或者使用c/c++具有一定的參考學習價值,需要的朋友們下面隨著小編來
推箱子想必是很多人童年時期的經(jīng)典游戲,我們依舊能記得抱個老人機娛樂的場景,下面這篇文章主要給大家介紹了關于如何利用c++寫一個簡單的推箱子小游戲的相關資料,需要的朋友可以
本文主要介紹了C++中char[]能修改char*卻不行,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
主站蜘蛛池模板: 黑人精品欧美一区二区蜜桃 | 久久亚洲一区 | 草草影院ccyy| 天天看天天操 | 色婷婷一区二区三区四区 | 狠狠操狠狠干 | 一区二区三区四区不卡视频 | 欧美亚洲视频在线观看 | 91免费观看国产 | 999国产视频 | 国产日韩欧美在线一区 | 欧美日韩成人 | 羞羞色网站 | 欧美精品一区二区免费 | 一区二区三区视频在线观看 | 我要看免费一级毛片 | 久久久久1 | 精品视频一区二区三区 | 欧美日韩综合 | 久久综合久久自在自线精品自 | 日本一区二区在线视频 | 亚洲精品自在在线观看 | 鸳鸯谱在线观看高清 | av在线一区二区三区 | 91视频日本| 国产精品1区| 一级毛片免费 | 伊人导航| 日韩在线中文字幕 | 中文字幕二区三区 | 国产欧美一区二区三区在线看 | 亚洲欧美日韩在线 | 一区二区三区四区在线 | 网址黄 | 欧美成人精品一区二区男人看 | 日日夜夜操天天干 | 国产精品揄拍一区二区久久国内亚洲精 | 亚洲午夜精品视频 | 五月天婷婷激情 | com.国产| 神马影院一区二区三区 |