Dies funktioniert möglicherweise besser mit einem einfachen generativen Modell in RGB als mit HSV.
- Holen Sie sich ein Trainingsbild oder mehrere Trainingsbilder mit etwas Haut.
- Wählen Sie die Skin-Pixel manuell aus (z. B. durch Erstellen einer Binärmaske).
- Berechnen Sie den Mittelwert und die Kovarianz des Hautfarbtons in RGB (jeder sollte aus 3 Elementen bestehen).
- Berechnen Sie für ein unbekanntes Pixel seinen Mahalanobis-Abstand vom Mittelwert unter Verwendung der Kovarianz.
- Klassifizieren Sie es als Skin, wenn der Abstand unter einem Schwellenwert liegt.
- Stellen Sie den Schwellenwert auf die beste Leistung ein.
Bearbeiten:
Ich weiß nicht, ob OpenCV eine Funktion zum Berechnen der Kovarianz hat, aber ich kann Ihnen sagen, wie es selbst geht. Angenommen, Sie haben RGB-Pixel. Sie legen sie in eine n x 3 Matrix, nennen wir es P . Berechnen Sie dann m , den mittleren RGB-Vektor, indem Sie den Durchschnitt der Spalten berechnen. m wird ein 1 x 3 Vektor sein. Subtrahieren Sie m von jeder Zeile von P und rufen Sie die resultierende Matrix Q auf . Nun zu berechnen Kovarianz, alles , was Sie tun müssen, ist mehrfach Q durch die Transponierung von selbst: C = Q ' Q . Stellen Sie sicher, dass CnnPmmmPQ.Q.C= Q′Q.C ist 3 x 3.
Edit2:
Die Werte, die Sie erhalten, scheinen zu groß zu sein. Um die maximale Kovarianz zu erhalten, erstellen Sie die folgende Matrix:
255 255 255
0 0 0
und Kovarianz davon berechnen. Sie sollten eine Matrix erhalten, in der jeder Wert ungefähr 32513 ist. Stellen Sie also sicher, dass Ihre Pixelwerte zwischen 0 und 255 liegen, und kopieren Sie sie korrekt in Floats oder Doubles. Der Mahalanobis-Abstand wird in Varianz-Einheiten angegeben, daher sollten die Zahlen klein sein. Ihr Schwellenwert für die Hautklassifizierung sollte wahrscheinlich unter 4 liegen.
Berücksichtigen Sie die unterschiedlichen Werte, die in der HSV-Farbe erhalten werden, wenn Neonlicht angewendet wird: Ein Beispiel für die Abweichung ist hier . Passen Sie Ihren Algorithmus an diese Werte an.
Hier gibt es einen anderen Algorithmus , um die Haut zu erkennen und Lichtverhältnisse zum Erkennen können Sie verwenden diese ein .
Ein anderer Algorithmus, der mit der Hauterkennung zusammenhängt, aber nicht zu sehr mit Neonlichteffekten zusammenhängt, ist dieser .
quelle
Die Antworten, die Sie bisher erhalten haben, deuten auf gute alternative Methoden hin. Wenn Sie jedoch an der Verwendung Ihres ursprünglichen Algorithmus interessiert sind, ist dies wahrscheinlich nicht schwer zu beheben. Sie müssen sich nur an die HSV-Besonderheiten von OpenCV anpassen. Angesichts der verrückten Ergebnisse nehme ich an, dass Sie bei der Auswahl Ihrer Schwellenwerte und / oder bei der Konvertierung von Pixeln wahrscheinlich eine der gebräuchlichsten numerischen Darstellungen von HSV verwendet haben.
OpenCV stellt HSV anders dar als die meisten anderen Quellen, die Sie möglicherweise gefunden haben:
Wahrscheinlich zu spät, um Ihnen zu helfen, aber es war eine interessante Frage, und jemand anderes könnte auf dasselbe Problem stoßen.
quelle
quelle