Ich muss in der Nähe befindliche Konturen in einem Bild basierend auf dem Abstand zwischen ihnen verbinden, der angibt, ob die Konturen verbunden werden sollen.
Jetzt gibt es hier bereits eine Frage zum gleichen Problem: /programming/8973017/opencv-c-obj-c-connect-nearby-contours, aber hier führt er alle Konturen zu einer einzigen zusammen. Das will ich nicht. Ich glaube nicht, dass es dafür eine Funktion in opencv gibt, aber Sie können einen Algorithmus dafür vorschlagen. Meine Bewerbung sieht folgendermaßen aus:
Ich erkenne Hände, also habe ich einen Hauterkennungsalgorithmus verwendet, um sie zu bestimmen, aber da meine Haut nicht weiß ist und möglicherweise aufgrund von Aufhellungsbedingungen manchmal die Kontur am Ellbogen bricht. Ich möchte also, dass die nahe gelegenen Konturen verbunden werden, aber nicht alle (weil beide Hände in Konturen vorhanden sind.) (Mit Händen meine ich von der Schulter bis zur Handfläche.)
Darüber hinaus denke ich, dass ich durch die Verwendung einer Kantenerkennung meine Handgrenzen erhalte und erkenne, ob ein Teil dieses Patches innerhalb dieser Grenze als Haut erkannt wird, dann wird der gesamte Bereich innerhalb dieser Grenze als Haut erkannt, aber ich bin mir nicht sicher, wie ich das tun soll Teil.
Jede Hilfe wird geschätzt. Danke im Voraus
Beispielbild:
In diesem Bild möchte ich Punkte (8 Konnektivitäten) verbinden, die weniger als 40 Pixel entfernt sind, damit ich meine linke Hand als einzelne Kontur bekomme
Mein Ziel ist es, nur die Handkontur zu erhalten (mir ist keine andere Region wichtig)
quelle
Antworten:
Wenn Sie sich keine Gedanken über die Geschwindigkeit oder die genaue Kontur der Hand machen, finden Sie unten eine einfache Lösung.
Die Methode ist wie folgt: Sie nehmen jede Kontur und finden Abstand zu anderen Konturen. Wenn die Entfernung weniger als 50 beträgt, sind sie in der Nähe und Sie setzen sie zusammen. Wenn nicht, werden sie als unterschiedlich eingestuft.
Das Überprüfen des Abstands zu jeder Kontur ist daher ein zeitaufwändiger Vorgang. Dauert einige Sekunden. Sie können es also auf keinen Fall in Echtzeit tun.
Um Konturen zu verbinden, habe ich sie in einem einzigen Satz zusammengefasst und einen konvexen Rumpf für diesen Satz gezeichnet. Das Ergebnis, das Sie erhalten, ist also tatsächlich eine konvexe Handhülle, keine echte Hand.
Unten ist mein Code in OpenCV-Python. Ich habe keine Optimierung vorgenommen, wollte nur, dass es funktioniert, das ist alles. Wenn es Ihr Problem löst, gehen Sie zur Optimierung.
Unten sind die Ergebnisse, die ich bekommen habe:
quelle
Um das Verbindungsproblem zu beheben, können Sie einen Abschlussvorgang versuchen:
Ich bezweifle, dass dies zu den gewünschten Ergebnissen führt, aber Sie können es versuchen.
quelle
Es sieht so aus, als würden Sie Ihr Image "übersegmentieren". Morphologische Operationen, wie bjnoernz vorgeschlagen hat, würden helfen. Insbesondere sollte ein Wassereinzugsgebietsansatz näher an das heranrücken, was Sie möchten, als nur die Entfernung zu überprüfen (wie im obigen Python-Beispiel). Sehen http://cmm.ensmp.fr/~beucher/wtshed.html .
quelle