最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2021年09月14日 09:26:38   作者:OKjokull  
這篇文章主要介紹了C++基于OpenCV手勢(shì)識(shí)別的實(shí)現(xiàn)源碼,這里用到背景減法模型知識(shí),具體實(shí)例代碼跟隨小編一起看看吧

先給大家上效果圖:

請(qǐng)?zhí)砑訄D片描述

源碼在下面

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

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

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

沒什么好說(shuō)的直接看代碼會(huì)比較容易理解
核心代碼

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

要直接跑代碼調(diào)試的,可以直接去下載

到此這篇關(guān)于C++基于OpenCV實(shí)現(xiàn)手勢(shì)識(shí)別的源碼的文章就介紹到這了,更多相關(guān)OpenCV手勢(shì)識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言超詳細(xì)梳理排序算法的使用

    C語(yǔ)言超詳細(xì)梳理排序算法的使用

    這篇文章主要介紹了C語(yǔ)言完成排序的實(shí)例,在C語(yǔ)言基本類型的排序中特別有用,下面我們一起進(jìn)入文章學(xué)習(xí)更詳細(xì)的內(nèi)容吧,需要的朋友可以參考下
    2022-03-03
  • C語(yǔ)言下快速排序(挖坑法)詳解

    C語(yǔ)言下快速排序(挖坑法)詳解

    大家好,本篇文章主要講的是C語(yǔ)言下快速排序(挖坑法)詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 淺談C++中的string 類型占幾個(gè)字節(jié)

    淺談C++中的string 類型占幾個(gè)字節(jié)

    本篇文章小編并不是為大家講解string類型的用法,而是講解我個(gè)人比較好奇的問題,就是string 類型占幾個(gè)字節(jié)
    2013-08-08
  • C語(yǔ)言中你不知道的隱式類型轉(zhuǎn)換規(guī)則詳解

    C語(yǔ)言中你不知道的隱式類型轉(zhuǎn)換規(guī)則詳解

    在C語(yǔ)言中,類型轉(zhuǎn)換的方式一般可分為隱式類型轉(zhuǎn)換和顯示類型轉(zhuǎn)換(也稱為強(qiáng)制類型轉(zhuǎn)換),其中隱式類型轉(zhuǎn)換由編譯器自動(dòng)進(jìn)行,不需要程序員干預(yù),本文給大家詳細(xì)介紹了C語(yǔ)言中隱式類型轉(zhuǎn)換規(guī)則,需要的朋友可以參考下
    2024-01-01
  • C++類與對(duì)象深入之靜態(tài)成員與友元及內(nèi)部類詳解

    C++類與對(duì)象深入之靜態(tài)成員與友元及內(nèi)部類詳解

    朋友們好,這篇播客我們繼續(xù)C++的初階學(xué)習(xí),現(xiàn)在對(duì)我們對(duì)C++的靜態(tài)成員,友元,內(nèi)部類知識(shí)點(diǎn)做出總結(jié),整理出來(lái)一篇博客供我們一起復(fù)習(xí)和學(xué)習(xí),如果文章中有理解不當(dāng)?shù)牡胤?還希望朋友們?cè)谠u(píng)論區(qū)指出,我們相互學(xué)習(xí),共同進(jìn)步
    2022-06-06
  • C語(yǔ)言之實(shí)現(xiàn)棧的基礎(chǔ)創(chuàng)建

    C語(yǔ)言之實(shí)現(xiàn)棧的基礎(chǔ)創(chuàng)建

    這篇文章主要介紹了C語(yǔ)言之實(shí)現(xiàn)棧的基礎(chǔ)創(chuàng)建,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++?重載運(yùn)算符在HotSpot?VM中的應(yīng)用小結(jié)

    C++?重載運(yùn)算符在HotSpot?VM中的應(yīng)用小結(jié)

    C++支持運(yùn)算符重載,對(duì)于Java開發(fā)者來(lái)說(shuō),這個(gè)可能比較陌生一些,因?yàn)镴ava不支持運(yùn)算符重載,下面介紹一下HotSpot?VM中的運(yùn)算符重載,感興趣的朋友跟隨小編一起看看吧
    2023-09-09
  • 使用C語(yǔ)言實(shí)現(xiàn)繪制立體分離式環(huán)圖

    使用C語(yǔ)言實(shí)現(xiàn)繪制立體分離式環(huán)圖

    這篇文章主要為大家詳細(xì)介紹了使用C語(yǔ)言實(shí)現(xiàn)繪制立體分離式環(huán)圖的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • 深度解析三個(gè)常見的C語(yǔ)言內(nèi)存函數(shù)

    深度解析三個(gè)常見的C語(yǔ)言內(nèi)存函數(shù)

    這篇文章主要深度解析了三個(gè)常見的C語(yǔ)言內(nèi)存函數(shù)memcpy,memmove,memcmp,所以本文將對(duì)memcpy,memmove,memcmp 三個(gè)函數(shù)進(jìn)行詳解和模擬實(shí)現(xiàn),需要的朋友可以參考下
    2023-07-07
  • 最短時(shí)間學(xué)會(huì)基于C++實(shí)現(xiàn)DFS深度優(yōu)先搜索

    最短時(shí)間學(xué)會(huì)基于C++實(shí)現(xiàn)DFS深度優(yōu)先搜索

    常見使用深度優(yōu)先搜索(DFS)以及廣度優(yōu)先搜索(BFS)這兩種搜索,今天我們就來(lái)講講什么是深度優(yōu)先搜索,感興趣的可以了解一下
    2021-08-08

最新評(píng)論

通道| 工布江达县| 常德市| 呼和浩特市| 中西区| 富阳市| 漯河市| 甘孜| 定陶县| 正阳县| 英山县| 宣威市| 镇雄县| 肥城市| 浦城县| 乌兰县| 平安县| 彭阳县| 阿坝县| 宁陵县| 潞城市| 从化市| 互助| 龙川县| 宁河县| 资兴市| 河西区| 远安县| 九龙城区| 芷江| 滨海县| 奉节县| 电白县| 曲水县| 浮梁县| 萨迦县| 平定县| 呼伦贝尔市| 边坝县| 革吉县| 台湾省|