簡體   English   中英

使用OpenCV凸包和凸度缺陷函數進行手指跟蹤/計數

[英]Finger tracking / counting using OpenCV convex hull and Convexity Defect functions

我一直在使用OpenCV和ConvexHull和ConvexityDefects方法處理基本的手/手指跟蹤代碼。

基本上我能夠創造出手的輪廓。 我現在需要能夠計算手指的數量。 我知道Convex Hull的起點和終點是指尖,但我不確定如何計算它們以及如何通過在它們上面繪制圓圈來突出它們。

我希望我的代碼能夠執行這樣的操作

到目前為止,這是我的代碼的示例部分:

cvFindContours( hsv_mask, storage, &contours, sizeof(CvContour), CV_RETR_LIST,         CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) );

CvSeq* contours2 = NULL;

CvRect rect = cvBoundingRect( contours2, 0 );

cvRectangle( bitImage, cvPoint(rect.x, rect.y + rect.height), cvPoint(rect.x + rect.width, rect.y), CV_RGB(200, 0, 200), 1, 8, 0 );

CvSeq* hull = cvConvexHull2( contours2, 0, CV_CLOCKWISE, 0 );

CvSeq* defect = cvConvexityDefects( contours2, hull, dftStorage );

CvBox2D box = cvMinAreaRect2( contours2, minStorage );

cvDrawContours( bg, contours2,  CV_RGB( 0, 200, 0), CV_RGB( 0, 100, 0), 1, 1, 8, cvPoint(0,0));

我玩過它,我現在可以使用此代碼繪制指尖點

for(;defect;defect = defect->h_next) 
{ 
        int nomdef = defect->total;
        if(nomdef == 0)  
    continue; 
    defectArray = (CvConvexityDefect*)malloc(sizeof(CvConvexityDefect)*nomdef);     
    cvCvtSeqToArray (defect, defectArray, CV_WHOLE_SEQ);
    for(i=0; i<nomdef;>
    { 
        cvCircle( bg, *(defectArray[i].end), 5, CV_RGB(255,0,0), -1, 8,0);  
        cvCircle( bg, *(defectArray[i].start), 5, CV_RGB(0,0,255), -1, 8,0); 
        cvCircle( bg, *(defectArray[i].depth_point), 5, CV_RGB(0,255,255), -1, 8,0);        
    }
    j++;
    free(defectArray);
    }

但是我仍然得到很多誤報。 此外,如果有人可以建議任何方法現在計算將是美妙的手指。

您有一種可能性就是計算缺陷的數量。 如果你做得對,假設缺陷位於兩個手指之間的底部。 http://img27.imageshack.us/img27/6532/herpz.jpg

確保沒有任何“不需要的”缺陷,您可以使用CvConvexityDefect()中的'depth'參數; 用於過濾低長度缺陷的功能。 可以在此處找到“深度”參數的更好描述: opencv.itseez.com缺陷描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM