Finger tracking / zählen mit OpenCV und Konvexität konvexe Hülle Defekt Funktionen
Ich habe auf einer grundlegenden hand - /finger-tracking-code mithilfe von OpenCV und die ConvexHull und ConvexityDefects Methode.
Grundsätzlich bin ich in der Lage, erstellen Sie eine Kontur der hand. Ich brauche jetzt in der Lage sein, um die Anzahl der Finger. Ich weiß, dass die start-und die end-Punkte der Konvexen Hülle sind die Fingerspitzen, aber ich bin nicht sicher, wie Sie zu zählen und auch, wie Sie zu markieren, indem Sie das zeichnen von Kreisen auf Sie oder so etwas.
Möchte ich mein code etwas wie diese.
Dies ist ein Beispiel-Teil von meinem code bisher:
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));
Ich habe gespielt, um mit ihm und ich kann jetzt ziehen die Fingerspitze Punkte mit diesem code
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);
}
Aber ich bin noch immer eine Menge von Fehlalarmen. Auch wenn jemand könnte schlagen vor, Methoden zu zählen nun die Finger, das wäre wunderbar.
Außerdem haben Sie come across diese Frage, welche Prozesse eine konvexe Hülle um die Rückgabe Mängel als ein Vektor, der die Punkte? Ich vermute, Sie dann verarbeiten müssen, diese Punkte zu extrahieren, die Fingerspitzen aus dem anderen Ende des Rumpfes. Dies wird davon abhängen, wie das Bild tatsächlich angezeigt wird, vielleicht ist der Rumpf erstreckt sich zum Rand des Bildes und man konnte ignorieren, Punkte in der Nähe der Kante?
InformationsquelleAutor user1061512 | 2011-11-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine der Möglichkeiten, die Sie haben, zählen Sie die Anzahl der Mängel, die es gibt. Wenn Sie es richtig gemacht haben, die Mängel angenommen, um sich in dem unteren Abschnitt zwischen zwei Fingern.http://img27.imageshack.us/img27/6532/herpz.jpg
Dafür, dass Sie nicht bekommen, jede "unerwünschte" Mängel, die Sie verwenden können, die 'depth' - parameter aus der CvConvexityDefect (); - Funktion zum filtern der geringen Länge Mängel. Eine bessere Beschreibung der "depth" - parameter kann hier gefunden werden:
opencv.itseez.com Beschreibung des Mangels
InformationsquelleAutor Marc Pilgaard