Analiza obrazu (tarczka tachografu)

0

Chciałbym napisać program w Javie (w zasadzie część już napisałem), analizujący dane o pracy kierowcy z tarczki tachografu.

Uporałem się z (łatwiejszą) częścią aplikacji związaną z przechowywaniem i prezentacją danych, teraz została część związana z analizą obrazu.

Chciałbym, aby użytkownik mógł zeskanować tarczkę (zamiast wprowadzać ją ręcznie) a program sam odczytałby zawarte tam informacje. I tu pojawiły się problemy:

  1. Jak znaleźć kąt obrotu tarczki (o ile to potrzebne), tak aby odpowiednio rozpocząć analizę (od godziny 0:00) -> problem związany z tym, że użytkownik może dowolnie obrócić tarczkę podczas skanowania
  2. Jak znaleźć i odczytać rodzaje wykonywanej pracy (z określoną dokładnością) oraz czas ich trwania.

Szukałem już w wielu miejscach informacji na ten temat, ale nic szczególnego nie znalazłem. Na tym forum znalazłem ciekawy temat http://4programmers.net/Forum/97648?h=analiza#id97648 ale on też nie rozwiązuje wielu problemów.

Jak do tego podejść? Co poczytać?

Dla zainteresowanych wyglądem tarczki: http://b.imagehost.org/view/0590/skanuj0014.jpg

0

nie chcę Cię zniechęcać ale żeby to działało to musiał byś mieć idealne tarcze. Jak widać na tym skanie do idealnych mu daleko. Nawet programy, które są sprzedawane za ciężkie pieniądze nie radzą sobie z większością tarcz (wystarczy zabrudzenie, zagięcie, itp).

Co do tematu to chyba pozostaje Ci tylko rozpoznać, gdzie na tarczy jest 24 i od tamtąd zaczęć, ew. możesz próbować rozpoznać kształt wycięcia tarczy bo jego 'czubek' jest na wprost 24

0

Moje podejście, niekoniecznie słuszne ;)

Wykrywasz tą dziurę w kształcie gruszki na środku tarczy. Teraz jesteś już w domu, bo jak pociągniesz prostą od "wierzchołka" łuku stanowiącego szerszą część "gruszki" do krawędzi to trafiasz dokładnie na godzinę 24.

Samo wykrywanie "gruszki" patrz wykrywanie twarzy (pierwsze lepsze znalezione):
http://www-idss.cs.put.poznan.pl/~krawiec/ro/lab/2006-1/ro.pdf

0
Misiekd napisał(a)

nie chcę Cię zniechęcać ale żeby to działało to musiał byś mieć idealne tarcze. ...ciach... Nawet programy, które są sprzedawane za ciężkie pieniądze nie radzą sobie z większością tarcz ...ciach...

W zasadzie to nie musi działać zawsze idealnie. Z punktu widzenia użytkownika łatwiej poprawić zeskanowane dane niż je wprowadzać (przynajmniej testowana p. Basia tak twierdzi).

Misiekd napisał(a)

Co do tematu to chyba pozostaje Ci tylko rozpoznać, gdzie na tarczy jest 24 i od tamtąd zaczęć, ew. możesz próbować rozpoznać kształt wycięcia tarczy bo jego 'czubek' jest na wprost 24

Pomysł wspaniały, tylko jak to zrobić?

Radosław Brunke

Koziołek napisał(a)

Moje podejście, niekoniecznie słuszne ;)

Wykrywasz tą dziurę w kształcie gruszki na środku tarczy. Teraz jesteś już w domu, bo jak pociągniesz prostą od "wierzchołka" łuku stanowiącego szerszą część "gruszki" do krawędzi to trafiasz dokładnie na godzinę 24.

Dziękuję za pomysł

Koziołek napisał(a)

Samo wykrywanie "gruszki" patrz wykrywanie twarzy ...ciach...

Zaprezentowany przykład wykorzystuje OpenCV - który (zdaje się) nie jest możliwy do zastosowania w aplikacji pisanej pod Javą. Tym niemniej przyjrzę się temu projektowi, poza tym "Haar-like java" w googlach daje wiele wyników. Poszukam.

0

A ja bym zaczął od poszukiwania dużego okręgu całej tarczki, bo tło po skanowaniu jest zwykle jednolite a sama tarczka ma symetrię obrotową, więc jest to łatwiejsze. Poza tym rozmiar tarczki jest dobrze określony, więc napisanie czegoś takiego to nie problem.
po prostu liczyć odchylenie standardowe od koloru tła na okręgu o odpowiednim promieniu (promień na początek może być za duży a potem można go zawężać) i przesuwać środek tego okręgu tak by zminimalizować tą wartość.
Tak wyznaczysz środek tarczki (im dokładniej tym lepiej).
Po tym kroku zlokalizowanie gruszki środku to też jest proste, bo wystarczy wykryć jej orientacje, a algorytm będzie bardzo podobny.
Do tego miejsca jest to proste, dalej śledzenie zapisów to już wymaga więcej opisu wyobraźni a przede wszystkim testowania pomysłów.

0

Hehe kolega pisał cos takiego ;) sam chcialem sie szarpnac ale jak zobaczylem jego zrodla przekształcenia itp to podziekowalem ;)
Powiem tyle "Wykrywasz tą dziurę w kształcie gruszki na środku tarczy." zgadza sie ;) ale cala tarcze trzeba "przetrawic" na prosta linie (przecinasz okrag i rozwijasz go do uzyskania prostokatu) wtedy zabawa filtrami aby uzyskac jak najlepszy obraz.

0

Tak jak MarekR22 pisał, z tym że nie okrąg a koło. Łatwiej będzie dopasować koło tarczki niż gruszkę. Po konwersji na bitmapę monochromatyczną z jakimś sensownym progiem (może go ustalać user suwakiem !) wystarczy dopasować koło tak, aby była najmniejsza różnica w pikselach czyli zwykły problem minimalizacji błędu, który można rozwiązać stosując jakąś optymalizację. Zwykła metoda gradientów powinna wystarczyć, ale szybszy będzie LMA. Mając koło masz środek z większą dokładnością niż jakbyś wykrywał gruszkę. No i masz skalę (powiększenie) !

Po wstępnym, przybliżonym dopasowaniu koła dalej lepiej będzie dopasowywać pierścień ignorując jego środek. Wtedy środek tarczy nie będzie przekłamywać dopasowania. Chodzi głównie o niesymetryczną gruszkę, która jest w kolorze tła. Dopasowywane koło odsunęłoby się lekko od jej ogonka.

Teraz można wykrywać pozycję 24-ki. Na im większy promień będziesz patrzeć tym lepsze będzie dopasowanie, zatem ja bym tu dopasowywał ten czarny półokrąg przy brzegu, podobnie jak poprzednio aby różnica w pikselach była jak najmniejsza. Mając dane o środku i skali zostanie do dopasowania jedna zmienna - obrót. Właściwie wystarczyłoby wziąć zbiór punktów na odpowiednim promieniu np co 1 stopień. Jedna połówka punktów będzie ciemna, druga mieszana, wystarczy znaleźć punkt podziału - bodajże regresja liniowa wystarczy. Ilość punktów dobrałbym zależnie od skali tak, aby były one oddalone mniej więcej o 1,5 piksela.

0

ja bym to zrobił w inny sposób:

  1. wymuszamy na użytkowniku aby na skanie była tylko jedna tarczka i aby nie było nic widoczne oprócz niej - na zdjęciu widać jakiś plastik ;p p. basia może podłożyć jakąś grubą białą kartkę pod tarczkę.

  2. wylewamy z każdego rogu 'niewidzialny' kolor (wylewamy w sensie takim jak wylewanie w paincie ;), niewidzialny bo w rzeczywistości nie musimy nic wylewać tylko wykryć ciągły biały obszar). zalane piksele oznaczamy jako przetworzone, ustawiamy dla nich tag 0. tag to wartość która mówi o odległości od najbliższego zalanego piksela w metryce taksówkowej. piksele bezpośrednio sąsiadujące z zalanymi pikselami wrzucamy do kolejki.

  3. teraz dla każdego piskela z kolejki:

  • ustawiamy mu tag - bierzemy minimum z tagów sąsiednich przetworzonych pikseli (czterech - z góry dołu prawej i lewej) i dodajemy jeden.
  • oznaczmy pisel jako przetworzony.
  • wrzucamy na koniec kolejki sąsiednie piksele które nie zostały przetworzone.
  1. po zakończeniu kroku 3 pisel o najwiekszym tagu jest środkiem tarczki. dodatkowo mamy jej promień (przybliżony trochę za duży) w pikselach.

kierunek tarczy rozwiązałbym tak:

  • obliczam w jakiej odległości jest ten półokrąg.
  • wybieram dwa odcinki będące dwiema prostopadłymi średnicami tarczki.
  • oczywiście skracamy je tak aby zahaczały końcami o ten czarny półokrąg.
  • ustawiamy funkcję przekstałacającą daną średnicę w parę wartości (a, b). a to średnia jasność małej plamki na jednym końcu średnicy, a b analogicznie.
  • teraz metodą równego podziału wyszukujemy właściwy podział (tzn. trzeba jeszcze trochę pokombinować).
  • podział jest udany jeśli plamki po obydwu stronach mają taką samą średnią jasność.

bardzo lamerskie rozwiązania ale powinny działać ;d

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.