Muszę połączyć pobliskie kontury na obrazie na podstawie odległości między nimi, która określa, czy kontury mają zostać połączone.
Teraz jest już pytanie dotyczące tego samego problemu tutaj /programming/8973017/opencv-c-obj-c-connect-nearby-contours, ale tutaj łączy wszystkie kontury w jeden. Tego nie chcę. Nie sądzę, że jest w tym jakaś funkcja w opencv, ale możesz zaproponować algorytm. Moja aplikacja wygląda następująco:
Wykrywałem dłonie, więc użyłem algorytmu wykrywania skóry, aby je określić, ale ponieważ moja skóra nie jest biała i może z powodu warunków oświetleniowych czasami kontur łamie się na łokciu. Chcę więc, aby pobliskie kontury były ze sobą połączone, ale nie wszystkie (ponieważ obie moje ręce będą tam w konturach.) (Przez ręce mam na myśli od ramienia do dłoni.)
Co więcej, myślę, że stosując pewne wykrywanie krawędzi, dostanę granice rąk i wykryję, czy część tej łatki wewnątrz tej granicy zostanie wykryta jako skóra, wtedy cały region w tej granicy zostanie wykryty jako skóra, ale nie jestem pewien, jak to zrobić część.
Każda pomoc będzie mile widziana. Z góry dziękuję
Przykładowy obraz:
Na tym obrazie chcę połączyć punkty (8 połączeń), które są mniej niż powiedzmy 40 pikseli odległości, aby uzyskać lewą rękę jako pojedynczy kontur
Moim celem jest uzyskanie tylko konturu dłoni (nie dbam o żaden inny region)
Odpowiedzi:
Jeśli nie martwisz się prędkością lub dokładnym konturem dłoni, poniżej znajdziesz proste rozwiązanie.
Metoda jest następująca: bierzesz każdy kontur i znajdujesz odległość od innych konturów. Jeśli odległość jest mniejsza niż 50, są w pobliżu, a ty je poskładasz. Jeśli nie, są one przedstawiane jako różne.
Sprawdzanie odległości do każdego konturu jest więc czasochłonne. Zajmuje kilka sekund. Więc nie ma mowy, abyś mógł to zrobić w czasie rzeczywistym.
Ponadto, aby połączyć kontury, umieściłem je w jednym zestawie i narysowałem wypukły kadłub dla tego zestawu. Tak więc otrzymujesz wynik wypukłego kadłuba dłoni, a nie prawdziwej dłoni.
Poniżej mój fragment kodu w OpenCV-Python. Nie poszedłem na żadną optymalizację, chciałem tylko, żeby działała, to wszystko. Jeśli to rozwiąże problem, przejdź do optymalizacji.
Poniżej znajdują się wyniki, które otrzymałem:
źródło
Aby rozwiązać problem z łącznością, możesz spróbować zamknąć operację:
Wątpię, aby przyniosło to pożądane rezultaty, ale możesz spróbować.
źródło
Wygląda na to, że „przesadzasz” swój obraz. Pomogłyby operacje morfologiczne, jak sugerował bjnoernz. W szczególności podejście do zlewni powinno być bliżej tego, co chcesz, niż tylko sprawdzanie odległości (jak w powyższym przykładzie Pythona). Zobacz http://cmm.ensmp.fr/~beucher/wtshed.html .
źródło