Jednym z najciekawszych projektów, nad którymi pracowałem w ciągu ostatnich kilku lat, był projekt dotyczący przetwarzania obrazu . Celem było opracowanie systemu umożliwiającego rozpoznawanie „puszek” Coca-Coli (zauważ, że podkreślam słowo „puszki”, za chwilę zrozumiesz dlaczego). Poniżej możesz zobaczyć próbkę z puszką rozpoznaną w zielonym prostokącie ze skalą i obrotem.
Niektóre ograniczenia dotyczące projektu:
- Tło może być bardzo głośne.
- Puszki może mieć jakąkolwiek skalę lub obrót lub orientacji nawet (w rozsądnych granicach).
- Obraz może mieć pewien stopień rozmycia (kontury mogą nie być całkowicie proste).
- Na obrazie mogą znajdować się butelki Coca-Coli, a algorytm powinien wykrywać tylko puszkę !
- Jasność obrazu może się bardzo różnić (więc nie można polegać „zbytnio” na wykrywaniu kolorów).
- Puszka może być częściowo ukryte po bokach i na środku i ewentualnie częściowo ukryty za butelkę.
- Na obrazie nie może być żadnej puszki , w którym to przypadku nie musisz nic znaleźć i napisać taką wiadomość.
Możesz więc skończyć z takimi trudnymi rzeczami (które w tym przypadku całkowicie zawiodły mój algorytm):
Zrobiłem ten projekt jakiś czas temu i miałem dużo zabawy, robiąc to, i miałem przyzwoitą implementację. Oto kilka szczegółów na temat mojej implementacji:
Język : Wykonano w C ++ przy użyciu biblioteki OpenCV .
Wstępne przetwarzanie : Do wstępnego przetwarzania obrazu, tj. Przekształcenia obrazu w bardziej surową formę w celu nadania algorytmowi, zastosowałem 2 metody:
- Zmiana domeny kolorów z RGB na HSV i filtrowanie w oparciu o „czerwony” odcień, nasycenie powyżej pewnego progu, aby uniknąć kolorów podobnych do pomarańczowego, oraz filtrowanie o niskiej wartości, aby uniknąć ciemnych tonów. Efektem końcowym był binarny czarno-biały obraz, w którym wszystkie białe piksele reprezentowałyby piksele pasujące do tego progu. Oczywiście na obrazie wciąż jest dużo badziewia, ale zmniejsza to liczbę wymiarów, z którymi musisz pracować.
- Filtrowanie szumów za pomocą filtrowania medianowego (pobieranie wartości mediany pikseli wszystkich sąsiadów i zastępowanie piksela tą wartością) w celu zmniejszenia szumu.
- Użycie Canny Edge Detection Filter do uzyskania konturów wszystkich elementów po 2 poprzednich krokach.
Algorytm : sam algorytm, który wybrałem do tego zadania, został zaczerpnięty z tej niesamowitej książki na temat ekstrakcji funkcji i nazywał się Uogólnioną transformatą Hougha (całkiem inną niż zwykła transformacja Hougha). Mówi w zasadzie kilka rzeczy:
- Możesz opisać obiekt w przestrzeni, nie znając jego równania analitycznego (co ma miejsce tutaj).
- Jest odporny na deformacje obrazu, takie jak skalowanie i obrót, ponieważ w zasadzie przetestuje obraz pod kątem każdej kombinacji współczynnika skali i współczynnika obrotu.
- Wykorzystuje model podstawowy (szablon), którego algorytm „się nauczy”.
- Każdy piksel pozostały na obrazie konturowym będzie głosował na inny piksel, który prawdopodobnie będzie środkiem (pod względem grawitacji) obiektu, na podstawie tego, czego nauczył się z modelu.
W końcu otrzymujesz mapę cieplną głosów, na przykład tutaj wszystkie piksele konturu puszki będą głosować za jej środkiem grawitacyjnym, więc będziesz mieć dużo głosów w tym samym pikselu odpowiadającym centrum i zobaczy szczyt na mapie ciepła, jak poniżej:
Gdy to osiągniesz, prosta heurystyka oparta na progach może podać lokalizację środkowego piksela, z którego możesz uzyskać skalę i obrót, a następnie narysować wokół niej swój mały prostokąt (ostateczna skala i współczynnik obrotu będą oczywiście zależne od twojego oryginalny szablon). Teoretycznie przynajmniej ...
Wyniki : Mimo że podejście to działało w podstawowych przypadkach, w niektórych obszarach bardzo go brakowało:
- To jest bardzo wolne ! Nie podkreślam tego wystarczająco. Potrzebny był prawie cały dzień na przetworzenie 30 zdjęć testowych, oczywiście ponieważ miałem bardzo wysoki współczynnik skalowania dla rotacji i translacji, ponieważ niektóre puszki były bardzo małe.
- Został całkowicie utracony, gdy butelki były na zdjęciu, i z jakiegoś powodu prawie zawsze znajdował butelkę zamiast puszki (być może dlatego, że butelki były większe, więc miały więcej pikseli, a więc więcej głosów)
- Rozmyte obrazy również nie były dobre, ponieważ głosy kończyły się w pikselach w losowych lokalizacjach w centrum, co zakończyło się bardzo głośną mapą ciepła.
- Osiągnięto różnice w translacji i rotacji, ale nie w orientacji, co oznacza, że puszka, która nie była skierowana bezpośrednio w stronę obiektywu aparatu, nie została rozpoznana.
Czy możesz mi pomóc ulepszyć mój specyficzny algorytm, używając wyłącznie funkcji OpenCV , aby rozwiązać cztery wymienione problemy?
Mam nadzieję, że niektórzy również się z tego czegoś nauczą, w końcu uważam, że nie tylko ludzie, którzy zadają pytania, powinni się uczyć. :)
źródło
Odpowiedzi:
Alternatywnym podejściem byłoby wyodrębnienie elementów (punktów kluczowych) przy użyciu niezmiennej w skali transformacji funkcji (SIFT) lub przyspieszonej niezawodnej funkcji (SURF).
Jest zaimplementowany w OpenCV 2.3.1.
Możesz znaleźć dobry przykład kodu, używając funkcji w Feature2D + Homography, aby znaleźć znany obiekt
Oba algorytmy są niezmienne dla skalowania i rotacji. Ponieważ działają one z funkcjami, możesz także obsługiwać okluzję (o ile widoczna jest wystarczająca liczba punktów kluczowych).
Źródło obrazu: przykład samouczka
Przetwarzanie zajmuje kilkaset ms dla SIFT, SURF jest nieco szybszy, ale nie nadaje się do aplikacji w czasie rzeczywistym. ORB używa FAST, który jest słabszy pod względem niezmienności rotacji.
Oryginalne dokumenty
źródło
Aby przyspieszyć, skorzystam z faktu, że nie jesteś proszony o znalezienie dowolnego obrazu / obiektu, a konkretnie takiego z logo Coca-Coli. Jest to znaczące, ponieważ to logo jest bardzo charakterystyczne i powinno mieć charakterystyczną, niezmienną w skali sygnaturę w dziedzinie częstotliwości, szczególnie w czerwonym kanale RGB. Innymi słowy, naprzemienny wzór koloru czerwonego do białego do czerwonego napotykany przez poziomą linię skanowania (wytrenowaną na poziomo wyrównanym logo) będzie miał charakterystyczny „rytm”, gdy przechodzi przez środkową oś logo. Rytm ten „przyspieszy” lub „zwolni” w różnych skalach i orientacjach, ale pozostanie proporcjonalnie równoważny. Można zidentyfikować / zdefiniować kilkadziesiąt takich linii skanowania, zarówno poziomo, jak i pionowo, poprzez logo i kilka innych po przekątnej, we wzór gwiazdy. Nazwij je „liniami skanowania podpisów”.
Wyszukiwanie tego podpisu na obrazie docelowym to prosta kwestia zeskanowania obrazu poziomymi paskami. Poszukaj wysokiej częstotliwości w czerwonym kanale (wskazującym przejście z czerwonego obszaru do białego), a po znalezieniu sprawdź, czy następuje po nim jeden z rytmów częstotliwości określonych podczas sesji treningowej. Po znalezieniu dopasowania natychmiast poznasz orientację i położenie linii skanowania w logo (jeśli śledzisz te rzeczy podczas treningu), więc identyfikowanie granic logo jest stamtąd banalne.
Byłbym zaskoczony, gdyby nie był to algorytm wydajny liniowo lub prawie tak. Oczywiście nie odnosi się to do dyskryminacji butelek, ale przynajmniej będziesz mieć swoje logo.
(Aktualizacja: do rozpoznawania butelek szukałbym koksu (brązowej cieczy) sąsiadującego z logo - to znaczy wewnątrz butelki. Lub, w przypadku pustej butelki, szukałem zakrętki, która zawsze będzie miała ten sam podstawowy kształt, rozmiar i odległość od logo i zazwyczaj będą białe lub czerwone. Szukaj eliptycznego kształtu w jednolitym kolorze, w którym powinna znajdować się czapka , w stosunku do logo. Oczywiście nie jest to niezawodne, ale Twoim celem powinno być tutaj znaleźć łatwe te szybko ).
(Minęło kilka lat od moich dni przetwarzania obrazów, więc utrzymałem tę sugestię na wysokim poziomie i konceptualnie. Myślę, że może nieco przybliżać sposób działania ludzkiego oka - a przynajmniej mój mózg!)
źródło
Zabawny problem: kiedy spojrzałem na twoje zdjęcie butelki, pomyślałem, że to też może być puszka. Ale jako człowiek zrobiłam różnicę, że zauważyłam, że to także butelka…
Tak więc, aby odróżnić puszki i butelki od siebie, może po prostu najpierw przejrzysz butelki? Jeśli znajdziesz, zamaskuj etykietę, zanim zaczniesz szukać puszek.
Nie za trudne do wdrożenia, jeśli już robisz puszki. Prawdziwym minusem jest to, że podwaja Twój czas przetwarzania. (Ale myśląc o aplikacjach rzeczywistych, i tak będziesz chciał robić butelki ;-)
źródło
Czy nie jest trudno nawet ludziom odróżnić butelkę od puszki na drugim zdjęciu (pod warunkiem, że przezroczysty obszar butelki jest ukryty)?
Są prawie takie same, z wyjątkiem bardzo małego regionu (to znaczy szerokość na górze puszki jest trochę mała, podczas gdy opakowanie butelki ma taką samą szerokość na całej długości, ale niewielka zmiana, prawda?)
Pierwszą rzeczą, jaka przyszła mi do głowy, było sprawdzenie czerwonego wieczka butelki. Ale nadal jest problem, jeśli nie ma góry na butelkę lub jeśli jest częściowo ukryta (jak wspomniano powyżej).
Drugą rzeczą, o której myślałem, była przezroczystość butelki. OpenCV pracuje nad znalezieniem przezroczystych obiektów na obrazie. Sprawdź poniższe linki.
Notatki ze spotkania OpenCV, protokół 19.03.2012
Notatki ze spotkania OpenCV Protokół 28.02.2012
W szczególności spójrz na to, aby zobaczyć, jak dokładnie wykrywają szkło:
Zobacz wynik ich wdrożenia:
Mówią, że jest to realizacja dokumentu „Geodezyjny aktywny kontur konturowy do znalezienia szkła” autorstwa K. McHenry i J. Ponce, CVPR 2006 .
W twoim przypadku może to być trochę pomocne, ale problem pojawia się ponownie, jeśli butelka jest napełniona.
Myślę więc, że możesz najpierw poszukać przezroczystego korpusu butelek lub czerwonego obszaru połączonego z dwoma przezroczystymi obiektami z boku, którym jest oczywiście butelka. (Idealnie działa obraz w następujący sposób.)
Teraz możesz usunąć żółty region, czyli etykietę butelki i uruchomić algorytm, aby znaleźć puszkę.
W każdym razie to rozwiązanie ma również inne problemy, jak w innych rozwiązaniach.
Ale w każdym razie, jeśli na zdjęciach nie ma żadnego z powyższych problemów, wydaje się, że jest to lepszy sposób.
źródło
Bardzo podoba mi się odpowiedź Darrena Cooka i układacza na ten problem. Właśnie zastanawiałem się nad tymi komentarzami, ale wierzę, że moje podejście jest zbyt ukierunkowane na odpowiedź, aby nie opuścić tutaj.
Krótko mówiąc, zidentyfikowałeś algorytm, który określa, że logo Coca-Coli jest obecne w określonym miejscu w kosmosie. Teraz próbujesz określić, dla dowolnych orientacji i dowolnych czynników skalowania, heurystykę odpowiednią do odróżnienia puszek Coca-Coli od innych przedmiotów, w tym: butelek , billboardów , reklam i akcesoriów Coca-Coli, wszystkie związane z tym kultowym logo. Nie wskazałeś wielu z tych dodatkowych przypadków w opisie problemu, ale uważam, że są one niezbędne dla powodzenia twojego algorytmu.
Sekret polega na tym, aby określić, jakie cechy wizualne może zawierać puszka lub, poprzez negatywną przestrzeń, jakie cechy są obecne dla innych produktów Coke, które nie są obecne dla puszek. W tym celu bieżąca odpowiedź naszkicuje podstawowe podejście do wybierania „może” wtedy i tylko wtedy, gdy „butelka” nie zostanie zidentyfikowana, czy to przez obecność zakrętki, płynu, czy innej podobnej heurystyki wizualnej.
Problem polega na tym, że się psuje. Butelka może na przykład być pusta i pozbawiona nakrętki, co prowadzi do fałszywie dodatniego wyniku. Lub może to być częściowa butelka z popsutymi dodatkowymi funkcjami, co ponownie prowadzi do fałszywego wykrywania. Nie trzeba dodawać, że nie jest to eleganckie i nie jest skuteczne dla naszych celów.
W tym celu najbardziej poprawne kryteria wyboru puszek wydają się następujące:
Twoja klasyfikacja może wyglądać następująco:
To wizualnie podkreśla użytkownikowi to, co zostało wykryte, podkreślając słabe pozytywy, które można poprawnie wykryć jako zniekształcone puszki.
Wykrywanie każdej właściwości niesie ze sobą bardzo różną złożoność czasową i przestrzenną, a dla każdego podejścia szybkie przejście przez http://dsp.stackexchange.com jest więcej niż rozsądne dla ustalenia najbardziej poprawnego i najbardziej wydajnego algorytmu dla twoich celów. Moim celem tutaj jest, czysto i prosto, podkreślenie, że wykrycie, czy coś jest puszką poprzez unieważnienie niewielkiej części przestrzeni wykrywania kandydatów, nie jest najbardziej niezawodnym ani skutecznym rozwiązaniem tego problemu, a najlepiej, abyś podjął odpowiednie działania odpowiednio.
I cześć, gratuluję opublikowania Hacker News! Ogólnie rzecz biorąc, jest to dość przerażające pytanie godne rozgłosu, który otrzymał. :)
źródło
Patrząc na kształt
Weź podglądacz w kształcie czerwonej części puszki / butelki. Zauważ, jak puszka zwęża się nieznacznie u samej góry, podczas gdy etykieta na butelce jest prosta. Możesz je rozróżnić, porównując szerokość czerwonej części na całej jej długości.
Patrząc na najważniejsze wydarzenia
Jednym ze sposobów odróżnienia butelek od puszek jest materiał. Butelka wykonana jest z plastiku, a puszka z aluminium. W wystarczająco dobrze oświetlonych sytuacjach patrzenie na lusterko byłoby jednym ze sposobów odróżnienia etykiety butelki od etykiety puszki.
O ile mi wiadomo, w ten sposób człowiek odróżniałby dwa typy etykiet. Jeśli warunki oświetleniowe są złe, rozróżnienie tych dwóch elementów może być niepewne. W takim przypadku musisz być w stanie wykryć obecność samej przezroczystej / półprzezroczystej butelki.
źródło
Proszę spojrzeć na tracker Predator Zdenka Kalala . Wymaga to szkolenia, ale może aktywnie nauczyć się, jak śledzony obiekt wygląda w różnych orientacjach i skalach, i robi to w czasie rzeczywistym!
Kod źródłowy jest dostępny na jego stronie. Jest w MATLAB , ale być może jest już implementacja Java wykonana przez członka społeczności. Udało mi się ponownie wdrożyć część TLD z funkcją śledzenia w języku C #. O ile dobrze pamiętam, TLD używa paproci jako detektora punktów kluczowych. Zamiast tego używam SURF lub SIFT (już sugerowane przez @stacker), aby odzyskać obiekt, jeśli został on utracony przez moduł śledzący. Informacje zwrotne od trackera ułatwiają budowanie z czasem dynamicznej listy szablonów przesiewania / surfowania, które z czasem umożliwiają ponowne uzyskanie obiektu z bardzo wysoką precyzją.
Jeśli jesteś zainteresowany moją implementacją modułu śledzącego w języku C #, możesz zapytać.
źródło
Jeśli nie jesteś ograniczony tylko do aparatu, który nie był objęty jednym z twoich ograniczeń, być może możesz przejść do korzystania z czujnika zasięgu, takiego jak Xbox Kinect . Dzięki temu można przeprowadzić dopasowaną segmentację obrazu w oparciu o głębię i kolor. Pozwala to na szybszą separację obiektów na obrazie. Następnie możesz użyć dopasowania ICP lub podobnych technik, aby nawet dopasować kształt puszki, a nie tylko jej obrysu lub koloru, a biorąc pod uwagę, że jest cylindryczny, może to być poprawna opcja dla dowolnej orientacji, jeśli masz poprzedni skan 3D celu. Techniki te są często dość szybkie, szczególnie gdy są używane do tak konkretnego celu, który powinien rozwiązać problem prędkości.
Mógłbym również zasugerować, niekoniecznie ze względu na dokładność lub szybkość, ale dla zabawy możesz użyć wyszkolonej sieci neuronowej na obrazie podzielonym na odcień, aby zidentyfikować kształt puszki. Są one bardzo szybkie i często mogą być do 80/90% dokładne. Trening byłby trochę długim procesem, ponieważ musiałbyś ręcznie zidentyfikować puszkę na każdym obrazie.
źródło
Wykrywałbym czerwone prostokąty: RGB -> HSV, filtruj czerwony -> obraz binarny, zamykaj (rozszerzaj, a następnie eroduj, znany jak
imclose
w Matlabie)Następnie spójrz przez prostokąty od największego do najmniejszego. Prostokąty, które mają mniejsze prostokąty w znanej pozycji / skali, mogą zostać usunięte (zakładając, że proporcje butelek są stałe, mniejszy prostokąt byłby zakrętką do butelki).
To zostawiłoby ci czerwone prostokąty, wtedy musisz jakoś wykryć logo, aby stwierdzić, czy jest to czerwony prostokąt czy puszka coli. Jak OCR, ale ze znanym logo?
źródło
To może być bardzo naiwny pomysł (lub może w ogóle nie działać), ale wymiary wszystkich puszek coli są ustalone. Może się tak zdarzyć, jeśli ten sam obraz zawiera zarówno puszkę, jak i butelkę, możesz je rozróżnić pod względem wielkości (butelki będą większe). Teraz z powodu braku głębokości (tj. Mapowania 3D do mapowania 2D) możliwe jest, że butelka może wydawać się skurczona i nie ma różnicy wielkości. Możesz odzyskać niektóre informacje o głębokości za pomocą obrazowania stereo, a następnie odzyskać oryginalny rozmiar.
źródło
Hmm, właściwie myślę, że coś mi się podoba (to najbardziej interesujące pytanie w historii - szkoda byłoby nie kontynuować próby znalezienia „idealnej” odpowiedzi, nawet jeśli znaleziono akceptowalną). .
Gdy znajdziesz logo, twoje problemy są w połowie skończone. Potem trzeba tylko, aby dowiedzieć się różnic co wokół logo. Ponadto chcemy zrobić jak najmniej dodatkowych korzyści. Myślę, że to właściwie ta łatwa część ...
Co jest wokół logo? W przypadku puszki możemy zobaczyć metal, który pomimo działania oświetlenia nie zmienia się w swoim podstawowym kolorze. Tak długo, jak znamy kąt etykiety, możemy powiedzieć, co jest bezpośrednio nad nią, więc patrzymy na różnicę między nimi:
To, co powyżej i poniżej logo jest całkowicie ciemne, ma jednolity kolor. Stosunkowo łatwe pod tym względem.
Tutaj to, co powyżej i poniżej, jest jasne, ale nadal ma jednolity kolor. Jest całkowicie srebrny, a całkowicie srebrny metal wydaje się dość rzadki, podobnie jak srebrne kolory w ogóle. Dodatkowo jest w cienkim poślizgu i wystarczająco blisko czerwonego, który został już zidentyfikowany, dzięki czemu można prześledzić jego kształt na całej długości, aby obliczyć procent tego, co można uznać za metalowy pierścień puszki. Naprawdę potrzebujesz tylko niewielkiej części tego miejsca w dowolnym miejscu na puszce, aby stwierdzić, że jest częścią tego, ale nadal musisz znaleźć równowagę, która zapewni, że nie będzie to tylko pusta butelka z czymś metalowym za nią.
I w końcu podstępna. Ale nie takie trudne, gdy przechodzimy tylko przez to, co widzimy bezpośrednio nad (i poniżej) czerwonym opakowaniem. Jest przezroczysty, co oznacza, że pokaże wszystko, co się za nim kryje. To dobrze, ponieważ rzeczy, które stoją za nim, prawdopodobnie nie będą tak spójne w kolorze, jak srebrny okrągły metal puszki. Może być za nim wiele różnych rzeczy, które mogłyby nam powiedzieć, że jest to pusta (lub wypełniona przezroczystą cieczą) butelka lub jednolity kolor, co może oznaczać, że jest wypełniona cieczą lub że butelka jest po prostu przed jednolity kolor. Pracujemy z tym, co najbliżej góry i dołu, a szanse na właściwe kolory we właściwym miejscu są stosunkowo niewielkie. Wiemy, że to butelka, ponieważ nie ma tego kluczowego elementu wizualnego puszki,
(ten ostatni był najlepszy, jaki mogłem znaleźć z pustej dużej butelki Coca Coli - co ciekawe, nakrętka ORAZ pierścień są żółte, co wskazuje, że nie należy polegać na zaczerwienieniu nakrętki)
W rzadkich przypadkach, gdy podobny odcień srebra znajduje się za butelką, nawet po pobraniu plastiku lub butelka jest w jakiś sposób wypełniona tym samym odcieniem srebrnej cieczy, możemy powrócić do tego, co możemy z grubsza oszacować jako kształt srebra - który, jak wspomniałem, jest okrągły i podąża za kształtem puszki. Ale choć brakuje mi pewnej wiedzy na temat przetwarzania obrazu, brzmi to wolno. Co więcej, dlaczego nie wywnioskować tego, sprawdzając po bokach logo, aby upewnić się, że nie ma w nim nic w tym samym srebrnym kolorze? Ach, ale co, jeśli za puszką jest ten sam odcień srebra? Następnie rzeczywiście musimy zwracać większą uwagę na kształty, ponownie patrząc na górę i dół puszki.
W zależności od tego, jak bezbłędnie to wszystko musi być, może być bardzo powolne, ale myślę, że moją podstawową koncepcją jest sprawdzenie najpierw najłatwiejszych i najbliższych rzeczy. Przejdź przez różnice kolorów wokół już dopasowanego kształtu (co i tak wydaje się najbardziej trywialną częścią), zanim przystąpisz do opracowywania kształtu pozostałych elementów. Aby to wymienić, idzie:
W przypadku, gdy nie możesz tego zrobić, prawdopodobnie oznacza to, że górna i dolna część puszki są zakryte, a jedynymi możliwymi rzeczami, których człowiek mógł użyć do niezawodnego rozróżnienia puszki i butelki, jest okluzja i odbicie puszki, która byłaby o wiele trudniejsza do przetworzenia. Jednak, aby pójść jeszcze dalej, możesz śledzić kąt puszki / butelki, aby sprawdzić cechy podobne do butelek, używając półprzezroczystych technik skanowania wymienionych w innych odpowiedziach.
Ciekawe dodatkowe koszmary mogą obejmować puszkę wygodnie siedzącą za butelką w takiej odległości, że metal tak się pokazuje powyżej i poniżej etykiety, co nadal zawodzi, dopóki skanujesz wzdłuż całej długości czerwonego etykieta - co w rzeczywistości jest większym problemem, ponieważ nie wykrywasz puszki tam, gdzie możesz ją mieć, w przeciwieństwie do tego, że faktycznie wykrywasz butelkę, w tym puszkę przez przypadek. W takim razie szklanka jest w połowie pusta!
Jako zrzeczenie się, nie mam doświadczenia ani nigdy nie myślałem o przetwarzaniu obrazów poza tym pytaniem, ale jest to tak interesujące, że zastanowiłem się nad tym głęboko, a po przeczytaniu wszystkich innych odpowiedzi uważam, że może to być najłatwiejszy i najskuteczniejszy sposób, aby to zrobić. Osobiście cieszę się, że tak naprawdę nie muszę myśleć o programowaniu tego!
EDYTOWAĆ
Dodatkowo spójrz na ten rysunek, który zrobiłem w MS Paint ... Jest absolutnie okropny i dość niekompletny, ale na podstawie samego kształtu i kolorów możesz zgadnąć, co prawdopodobnie będzie. W gruncie rzeczy są to jedyne rzeczy, które trzeba zawracać sobie głowy skanowaniem. Kiedy spojrzysz na tak bardzo charakterystyczny kształt i kombinację kolorów tak blisko, co jeszcze może być? Kawałek, którego nie malowałem, białe tło, należy uznać za „coś niespójnego”. Gdyby miał przezroczyste tło, mógłby przejść na prawie każdy inny obraz i nadal można go zobaczyć.
źródło
Nie znam OpenCV, ale logicznie patrzę na problem. Myślę, że możesz rozróżnić butelkę i zmieniając obraz, którego szukasz, np. Coca Cola. Powinieneś dołączyć do górnej części puszki, ponieważ w przypadku puszki znajduje się srebrna podszewka u góry coca coli, aw przypadku butelki nie będzie takiej srebrnej podszewki.
Ale oczywiście ten algorytm zawiedzie w przypadkach, gdy górna część puszki jest ukryta, ale w takim przypadku nawet człowiek nie będzie w stanie rozróżnić tych dwóch (jeśli widoczna jest tylko część butelki / puszki coca cola)
źródło
Lubię wyzwanie i chciałem udzielić odpowiedzi, która, jak sądzę, rozwiązuje problem.
Wykrywanie czapki to kolejny problem. Może to być skomplikowane lub proste. Gdybym był tobą, po prostu sprawdziłbym histogram kolorów w ROI, aby podjąć prostą decyzję.
Proszę o informację zwrotną, jeśli się mylę. Dzięki.
źródło
Kilka lat spóźniłem się z odpowiedzią na to pytanie. Biorąc pod uwagę najnowocześniejszy stan wiedzy, który został przekroczony przez CNN w ciągu ostatnich 5 lat, nie użyłbym teraz OpenCV do wykonania tego zadania! ( Wiem, że szczególnie chciałeś funkcji OpenCv w pytaniu ). Wydaje mi się, że algorytmy wykrywania obiektów, takie jak Faster-RCNN, YOLO, SSD itp., Pokonałyby ten problem ze znacznym marginesem w porównaniu z funkcjami OpenCV. Gdybym miał teraz rozwiązać ten problem (po 6 latach !!), zdecydowanie użyłbym Faster-RCNN .
źródło
Podoba mi się twoje pytanie, niezależnie od tego, czy jest nie na temat, czy nie: P
Ciekawe na bok; Właśnie ukończyłem przedmiot, który obejmował robotykę i wizję komputerową. Nasz projekt na semestr był niesamowicie podobny do tego, który opisujesz.
Musieliśmy opracować robota, który używał Xbox Kinect do wykrywania butelek i puszek z koksem w dowolnej orientacji w różnych warunkach oświetleniowych i środowiskowych. Nasze rozwiązanie polegało na zastosowaniu filtru pasmowo-przepustowego na kanale Barwa w połączeniu z transformacją koła Hougha. Byliśmy w stanie nieco ograniczyć środowisko (mogliśmy wybrać, gdzie i jak ustawić robota i czujnik Kinect), w przeciwnym razie użyjemy transformacji SIFT lub SURF.
O naszym podejściu możesz przeczytać na moim blogu na ten temat :)
źródło
Istnieje wiele deskryptorów kolorów używanych do rozpoznawania obiektów, poniższy papier porównuje wiele z nich. Są szczególnie wydajne w połączeniu z SIFT lub SURF. Same SURF lub SIFT nie są zbyt przydatne w obrazie coca coli, ponieważ nie rozpoznają wielu punktów zainteresowania, potrzebujesz informacji o kolorze, aby pomóc. Używam BIC (Border / Interior Pixel Classi fi kation) z SURF w projekcie i świetnie sprawdzało się rozpoznawanie obiektów.
Deskryptory kolorów dla pobierania obrazów z Internetu: badanie porównawcze
źródło
Głęboka nauka
Zbierz co najmniej kilkaset zdjęć zawierających puszki coli, oznacz obwiednię wokół nich jako klasy pozytywne, w tym butelki z colą i inne produkty coli oznaczaj je jako klasy negatywne, a także losowe obiekty.
Jeśli nie zbierzesz bardzo dużego zestawu danych, wykonaj sztuczkę polegającą na korzystaniu z funkcji głębokiego uczenia się w przypadku małego zestawu danych. Idealnie przy użyciu kombinacji maszyn wektorów wsparcia (SVM) z głębokimi sieciami neuronowymi.
Po wprowadzeniu obrazów do wcześniej wyszkolonego modelu dogłębnego uczenia się (np. GoogleNet), zamiast wykorzystywać warstwę decyzyjną (ostatnią) sieci neuronowej do klasyfikacji, użyj danych z poprzednich warstw jako funkcji do szkolenia klasyfikatora.
OpenCV i Google Net: http://docs.opencv.org/trunk/d5/de7/tutorial_dnn_googlenet.html
OpenCV i SVM: http://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html
źródło
Potrzebujesz programu, który uczy się i poprawia dokładność klasyfikacji na podstawie własnego doświadczenia.
Zasugeruję głębokie uczenie się, przy głębokim uczeniu się staje się to trywialny problem.
Możesz przekwalifikować model początkowy v3 na Tensorflow:
Jak przekwalifikować końcową warstwę Incepcji dla nowych kategorii .
W takim przypadku będziesz trenował splotową sieć neuronową, aby sklasyfikować obiekt jako coca-cola, czy nie.
źródło
Alternatywą dla wszystkich tych fajnych rozwiązań jest wyszkolenie własnego klasyfikatora i zwiększenie odporności aplikacji na błędy. Jako przykład możesz użyć treningu Haar , zapewniającego dużą liczbę pozytywnych i negatywnych obrazów twojego celu.
Przydatne może być wyciąganie tylko puszek i można je łączyć z wykrywaniem przezroczystych obiektów.
źródło
Istnieje pakiet wizji komputerowej o nazwie HALCON firmy MVTec, którego dema mogą dostarczyć dobrych pomysłów na algorytm. Istnieje wiele przykładów podobnych do problemu, które można uruchomić w trybie demonstracyjnym, a następnie spojrzeć na operatorów w kodzie i zobaczyć, jak je zaimplementować z istniejących operatorów OpenCV.
Użyłem tego pakietu, aby szybko prototypować złożone algorytmy dla takich problemów, a następnie znaleźć sposób ich implementacji przy użyciu istniejących funkcji OpenCV. W szczególności w twoim przypadku możesz spróbować zaimplementować w OpenCV funkcjonalność osadzoną w operatorze find_scaled_shape_model . Niektórzy operatorzy wskazują na artykuł naukowy dotyczący implementacji algorytmów, który może pomóc dowiedzieć się, jak zrobić coś podobnego w OpenCV. Mam nadzieję że to pomoże...
źródło
Jeśli interesuje Cię to, aby działało w czasie rzeczywistym, musisz dodać filtr wstępnego przetwarzania, aby określić, co zostanie zeskanowane za pomocą ciężkich urządzeń. Dobry szybki filtr wstępnego przetwarzania w czasie rzeczywistym, który pozwala skanować rzeczy, które mogą być coca-colą, zanim przejdzie do bardziej niepewnych rzeczy, jest mniej więcej taki: wyszukaj obraz w poszukiwaniu największych łat koloru, który jest pewną tolerancją z dala od
sqrt(pow(red,2) + pow(blue,2) + pow(green,2))
puszki coca-coli. Zacznij od bardzo ścisłej tolerancji kolorów i przejdź do łagodniejszych tolerancji kolorów. Następnie, gdy robotowi zabraknie przydzielonego czasu na przetworzenie bieżącej ramki, wykorzystuje aktualnie znalezione butelki do twoich celów. Pamiętaj, że będziesz musiał dostosować kolory RGB,sqrt(pow(red,2) + pow(blue,2) + pow(green,2))
aby uzyskać je dokładnie.Poza tym wydaje się to głupie, ale czy upewniłeś się, że
-oFast
włączyłeś optymalizacje kompilatora podczas kompilacji kodu C?źródło
Może zbyt wiele lat spóźnienia, ale jednak teoria do wypróbowania.
Stosunek ograniczającego prostokąta obszaru czerwonego logo do ogólnego wymiaru butelki / puszki jest inny. W przypadku Can powinien wynosić 1: 1, natomiast będzie różny w butelce (z lub bez zakrętki). Powinno to ułatwić rozróżnienie między nimi.
Aktualizacja: Pozioma krzywizna regionu logo będzie różna dla puszki i butelki ze względu na ich różnicę wielkości. Może to być szczególnie przydatne, jeśli twój robot musi podnieść puszkę / butelkę i odpowiednio zdecydujesz o chwycie.
źródło
Pierwszych rzeczy, których szukałem, to kolor - jak CZERWONY, podczas wykrywania czerwonych oczu na obrazie - istnieje pewien zakres kolorów do wykrycia, niektóre cechy dotyczące tego, biorąc pod uwagę otaczający obszar i takie jak odległość od drugiego oka, jeśli to jest rzeczywiście widoczny na obrazie.
1: Pierwszą cechą jest kolor, a czerwony dominuje. Po wykryciu Coca Coli Red jest kilka interesujących elementów 1A: Jak duży jest ten czerwony obszar (czy jest wystarczającej ilości, aby ustalić prawdziwą puszkę, czy nie - 10 pikseli to prawdopodobnie za mało), 1B: Czy zawiera kolor etykiety - „Coca-Cola” lub fala. 1B1: Czy jest wystarczająco dużo, aby rozważyć wysokie prawdopodobieństwo, że jest to etykieta.
Pozycja 1 jest rodzajem skrótu - proces wstępny, jeśli na obrazie nie ma smoka - przejdź dalej.
Więc jeśli tak jest, mogę wykorzystać ten fragment mojego obrazu i zacząć trochę bardziej oddalać dany obszar - w zasadzie spójrz na otaczający region / krawędzie ...
2: Biorąc pod uwagę powyższy obszar obrazu o numerze ID 1 - sprawdź otaczające punkty [krawędzie] danego elementu. Odp .: Czy istnieje coś, co wydaje się być górną lub dolną puszką - srebrne? B: Butelka może wydawać się przezroczysta, ale może też szklany stolik - podobnie jak szklany stolik / półka lub przezroczysty obszar - jeśli tak, istnieje wiele możliwych wyjść. Butelka MOŻE mieć czerwoną nasadkę, może nie, ale powinna mieć albo kształt górnej części butelki / śruby gwintowane, albo nasadkę. C: Nawet jeśli to się nie powiedzie A i B, to wciąż może to być puszka - częściowa. Jest to bardziej skomplikowane, gdy jest częściowe, ponieważ częściowa puszka / częściowa puszka może wyglądać tak samo, więc trochę więcej przetwarzania pomiaru krawędzi obszaru czerwonego do krawędzi .. mała butelka może mieć podobny rozmiar ..
3: Po powyższej analizie, kiedy spojrzałem na literę i logo fali - ponieważ mogę ukierunkować wyszukiwanie niektórych liter w słowach, ponieważ możesz nie mieć całego tekstu z powodu braku wszystkich może, fala wyrównałaby się w pewnych punktach do tekstu (pod względem odległości), więc mogłam wyszukać to prawdopodobieństwo i wiedzieć, które litery powinny istnieć w tym punkcie fali w odległości x.
źródło
To jest stary projekt, nad którym pracowałem. Obrazy MAP są bardzo łatwe w użyciu z javascript. Oferuję ci przedmiot, czytasz go i wiesz, jak go używać. Nie potrzebujemy JQuery i innych systemów do korzystania z obrazów MAP.
źródło