ZASADY OPISU ZARYSÓW OBIEKTÓW W FORMACIE FCD ============================================ Niniejsza dokumentacja zawiera zasady opisu elastycznych wzorców zarysów (FECT - Flexible Editable Contour Temlates) w formacie FCD, na podstawie którego tworzone są wzorcowe sygnatury służące do porównywania z sygnaturami konturów rozpoznawanych w celu identyfikacji obiektów znajdujących się w polu widzenia kamery. OGÓLNA STRUKTURA OPISU WZORCA ZARYSU W FORMACIE FCD --------------------------------------------------- Opis wzorca zarysu w formacie FCD składa się z nagłówka (instrukcja #CNT) oraz następującego po nim ciągu instrukcji opisujących elementarne segmenty zarysu (odcinki linii prostych i łuki okręgów), przy czym opisany w ten sposób zarys musi być zarysem zamkniętym. Elementarne segmenty zarysu opisuje się w takiej kolejności, w jakiej występują one w zarysie, przy czym opis musi być realizowany w kierunku przeciwnym do ruchu wskazówek zegara. Nagłówek opisu zarysu ma następującą strukturę: #CNT / Parametry obrazu nie są elementem wzorca elastycznego, jednak są niezbędne dla prawidłowej pracy programu realizującego wizualizację elastycznych wzorców. Parametry są zapisane jako wartości liczbowe oddzielone od siebie przecinkami, przy czym kolejne parametry mają następujące znaczenie: - Kierunek pierwszego segmentu elementarnego: kąt, jaki tworzy styczna do segmentu w jego punkcie początkowym z osią X (pokrywającą się z górną krawędzią obrazu), przy czym kąt ten jest mierzony w kierunku zgodnym z ruchem wskazówej zegara, a jego wartość jest standardowo interpretowana jako wartość w radianach, chyba że następuje po niej symbol stopnia °, który można otrzymać w wyniku kombinacji klawiszy ALT+248. - Szerokość obrazu na którym powinien się zmieścić największy zarys opisany za pomocą tego wzorca - Wysokość obrazu na którym powinien się zmieścić największy zarys opisany za pomocą tego wzorca - Współrzędna X punktu początkowego pierwszego segmentu zarysu - Współrzędna Y punktu początkowego pierwszego segmentu zarysu - Liczba wierzchołków zarysu będącego wzorcem elastycznym (podanie tej wartości jest opcjonalne: w przypadku braku jej podania, system automatycznie przyjmuje liczbę wierzchołków równą liczbie wystąpień instrukcji GO we wzorcu powiększonej o 1). Podanie tej wartości jest wskazane, gdy niektóre wierzchołki są łagodne, co powoduje ich nieuwzględnienie podczas generowania sygnatur (przejawia się to brakiem zaznaczenia ich czerwoną kropką podczas wizualizacji). Przykład nagłówka wzorca elastycznego: #CNT TEST / 0°,650,500,80,80 Elementarne segmenty zarysu opisywane są za pomocą ciągu instrukcji determinujących ich geometrię (instrukcje LINE i ARC) oraz instrukcji zmieniających kierunek zarysu (instrukcja GO - stosowana wtedy, gdy początek kolejnego segmentu elementarnego ma inną orientację kątową niż koniec segmentu poprzedniego). INSTRUKCJE OPISUJĄCE ZARYS: --------------------------- Odcinek linii prostej: LINE: / length: Łuk okręgu: ARC: / bend:; angle:; radius: (przy czym kolejność modyfikatorów BEND, ANGLE, RADIUS jest dowolna) Skokowa zmiana kierunku zarysu: GO: / angle: przy czym: - jest to unikalna nazwa, która ma być przypisana danemu segmentowi elementarnemu - może być podany jako LEFT lub RIGHT - jest to albo pojedyncza wartość, albo zakres wartości Pojedyncza wartość jest określona przez wyrażenie arytmetyczne (w rozumieniu języka Arlang) determinujące wartość liczbową. Może ono odwoływać się do zmiennych zdefiniowanych wcześniej w opisie wzorca elastycznego. Zakres wartości jest podawany w formie: .. lub: .. \ W przypadku drugim (gdy krok nie jest podany), krok jest automatycznie przyjmowany jako różnica pomiędzy wartością maksynalną i wartością minimalną. Oznacza to, że sygnatura wzorcowa zarysu jest generowana tylko dla wartości minimalnej i maksymalnej. Przykład: line: a / length: 100..150 \10 Przy podawaniu wartości (zarówno w postaci wartości pojedynczej, jak i zakresu wartości) istnieje możliwość przypisania tej wartości do zmiennej, jeśli przed wyrażeniem arytmetycznym określającym pojedynczą wartość bądź zakres wartości znajdzie się zapis: = Przykład: line: a / length: L = 100..150 \10 W opisie zarysu mogą wystąpić też osobne instrukcje przypisania wartości (bądź ich zakresów) do zmiennych (zmienne te mogą być następnie użyte w wyrażeniach arytmetycznych opisujących wartości parametrów segmentów elementarnych. Te instrukcje podstawienia mają postać: := przy czym jest nazwą spełniającą warunki dotyczące nazw zmiennych w języku Arlang. Przykład: S := 5*L .. 10*L \ L UWAGA 1: Automatyczne generowanie sygnatur zarysu na podstawie wzorca elastycznego zapisanego w formacie FCD, jest realizowane począwszy od pierwszego w kolejności wierzchołka, który znajduje się po punkcie zarysu położonym najwyżej na obrazie. Aby było zapewnione prawidłowe uczenie systemu na podstawie generowanych sygnatur, musi to być zawsze ten sam wierzchołek zarysu (podczas generowania sygnatur jest on wyświetlany na zielono), niezależnie od wariantu wymiarowego wzorca elastycznego (w przeciwnym razie rozpoznawanie obiektów na obrazie może być później zakłócone). Spełnienie tego warunku można zapewnić np. poprzez właściwy dobór kierunku pierwszego segmentu elementarnego (kierunek ten kjest określany w nagłówku wzorca elastycznego). UWAGA 2: Prawidłowe generowanie sygnatur uczących jest uzależnione od zachowania stałej liczby wykrywanych wierzchołków dla każdego wariantu wymiarowego wzorca (wierzchołki te - oprócz pierwszego - są zaznaczane za pomocą czerwonych punktów podczas generowania sygnatur). Z tego względu należy unikać tworzenia bardzo krókich segmentów elementarnych, gdyż sąsiednie wierzchołki mogą się "zlewać". Ewentualne problemy związane w tym zagadnieniem można w niektórych sytuacjach rozwiązywać poprzez zmianę oczekiwanej liczby wierzchołków zarysu (szósty parametr w nagłówku opisu wzorca). PRZYKŁAD OPISU WZORCA ELASTYCZNEGO W FORMACIE FCD: -------------------------------------------------- #cnt test / 0°,650,500,80,80 line: a / length:L=100..200 S:=30..50 \10 D:=1.8*S..2.4*S \0.2*S R:=D/2 G:=0.3*D..0.6*D \0.1*D A:=15°..24° \3° amax:=arctan(sqrt(D*D-G*G)/D) alfa:=A..amax \0.1*amax arc:b/bend:right;angle:alfa;radius:r=(D*cos(alfa)-G)/2/(1-cos(alfa)) kat:=arctan(S/sqrt(4*R*R-S*S)) H:=R*cos(kat) arc:c/bend:left; angle:alfa-A; radius: R go:left / angle: 90° line: m / length: w=0.4*S..0.6*S \0.1*S go:right / angle:90° arc: n / bend:left; angle:90°-kat; radius: R go: left / angle: gamma=90°+kat line: d/ length: H go: right/ angle: 90° line: e/ length:S-w go: right/ angle: 90° line: f/ length: H go: left/ angle: delta=90°+kat arc: g/ bend: left; angle: alfa+90°+A-kat; radius:R arc: h/ bend: right; angle: alfa; radius:r line: i/length: L arc: j/ bend: left; angle:180°; radius: G/2