Я работал над базовым кодом отслеживания рук / пальцев, используя OpenCV и методы ConvexHull и ConvexityDefects.
В принципе, я могу создать контур руки.Теперь мне нужно подсчитать количество пальцев.Я знаю, что начальная и конечная точки выпуклой оболочки - это кончики пальцев, но я не уверен, как их подсчитать, а также как выделить их, нарисовав на них круги или что-то в этом роде.
Я хочу, чтобы мой код выполнял что-то вроде this .
Это пока часть моего кода:
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);
}
Однако я все еще получаю много ложных срабатываний.Также, если бы кто-нибудь мог предложить какие-либо методы, чтобы посчитать пальцы, это было бы замечательно.