Отслеживание/подсчет пальцев с использованием функций выпуклой оболочки OpenCV и Convexity Defect

Я работал над базовым кодом отслеживания рук/пальцев, используя OpenCV и методы ConvexHull и ConvexityDefects.

В принципе, я могу создать контур руки. Теперь мне нужно уметь считать количество пальцев. Я знаю, что начальная и конечная точки выпуклого корпуса — это кончики пальцев, но я не уверен, как их посчитать, а также как выделить их, нарисовав на них круги или что-то в этом роде.

Я хочу, чтобы мой код выполнял что-то вроде этого.

Это примерная часть моего кода:

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

Однако я все еще получаю много ложных срабатываний. Кроме того, если бы кто-нибудь мог предложить какие-либо методы подсчета пальцев, это было бы замечательно.


person user1061512    schedule 23.11.2011    source источник
comment
Не могли бы вы показать некоторые изображения, полученные в результате запуска кода, который у вас есть?   -  person Chris    schedule 24.11.2011
comment
Кроме того, сталкивались ли вы с этим вопросом, который обрабатывает выпуклую оболочку для возврата дефектов в виде вектора точки? Я думаю, вам нужно будет обработать эти точки, чтобы извлечь кончики пальцев с другого конца корпуса. Это будет зависеть от того, как на самом деле выглядит изображение, возможно, корпус простирается до края изображения, и вы можете игнорировать точки рядом с краем?   -  person Chris    schedule 24.11.2011


Ответы (1)


Одна из имеющихся у вас возможностей — подсчитать количество имеющихся дефектов. Если вы все сделали правильно, дефекты должны находиться в нижней части между двумя пальцами.http://img27.imageshack.us/img27/6532/herpz.jpg

Убедившись, что у вас нет «нежелательных» дефектов, вы можете использовать параметр «глубина» из CvConvexityDefect(); функция фильтрации дефектов малой длины. Лучшее описание параметра «глубина» можно найти здесь: описание дефекта opencv.itseez.com

person Marc Pilgaard    schedule 29.11.2011