BitMan
Opis
Biblioteka przeznaczona jest do programowego przetwarzania obrazów w oparciu o specjalnie zdefiniowaną strukturę do przechowywania obrazu i system filtrów. Nie jest ona jednak jedynie zestawem narzędzi wykonujących konkretne operacje na obrazach, ale także szkieletem ułatwiającym tworzenie własnych funkcji przetwarzania obrazów dzięki mechanizmowi tzw. dynamicznych filtrów.
W kod wbudowanych jest kilka podstawowych filtrów. Nacisk przy ich tworzeniu położony został przede wszystkim na uniwersalność, łatwość użytkowania, oraz przejrzystość kodu. Powoduje to pewien spadek efektywności i w konsekwencji przetwarzanie dużych obrazów przy zastosowaniu standardowych filtrów może okazać się wolne. Nie jest to jednak obciążenie samego szkieletu i możliwe jest tworzenie filtrów użytkownika, które mogą – jako bardziej specjalizowane – działać znacznie efektywniej. Podstawowe filtry za to sprawdzają się świetnie przy przetwarzaniu stosunkowo niewielkich obrazów i mogą służyć np. do wspomagania programowania interfejsów użytkownika, operacji na ikonach, czy tworzenia graficznych dokumentów.
Biblioteka napisana została przy użyciu technik programowania obiektowego (LVOOP). Używanie tej techniki, przynajmniej w podstawowym stopniu, jest także wymagane przy tworzeniu własnych filtrów.
Biblioteka BitMan bierze udział w programie Compatible with
LabVIEW firmy National Instruments i jest dostępna w usłudze LabVIEW Tools Network.
Oznacza to, że została ona sprawdzona przez producenta środowiska LabVIEW i
spełnia stawiane przez niego wymagania.
Funkcjonalność
Najważniejszą klasą biblioteki jest klasa Bitmap. Zdefiniowana jest tu struktura przechowująca obraz (dokładny opis w dokumentacji pod hasłem Bitmap type.ctl) oraz podstawowe metody dostępowe. Głównym założeniem tej struktury jest przechowywanie obrazu w trójwymiarowej tablicy typu U8, której kolejne wymiary oznaczają odpowiednio wysokość (współrzędna y), szerokość (x) oraz kolejny kanał obrazu (channel). Liczba kanałów w obrazie zależy od jego głębi bitowej, dodatkowo zdefiniować można dowolną ilość kanałów użytkownika. Można przechowywać obrazy 1-, 4-, 8-, 24- i 32-bitowe, przy czym przez obrazy 32-bitowe rozumie się tutaj obrazy kodujące kolory przy użyciu modelu CMYK, a nie – jak się to czasem używa – obrazy RGB z przezroczystością. Przezroczystość (tzw. kanał alpha) przechowywany jest w oddzielnym polu struktury. Obsługa obrazów CMYK nie została jeszcze w pełni zaimplementowana.
Przetwarzanie obrazów odbywa się przez zastosowanie systemu filtrów zaimplementowanych w klasie General Filter i pochodnych. Klasa ta przechowuje referencję do znormalizowanego VI przetwarzającego obraz i jego parametry uruchomieniowe. Filtr uruchamia się przy użyciu metody Filter Run, która korzysta z mechanizmu dynamicznego wywołania. Parametry wywołania filtra przechowywane są w jego obiekcie jako zmienna typu Variant, co pozwala na zastosowanie zunifikowanej metody ich przekazywania.
Użytkownik może tworzyć własne filtry na dwa sposoby: przy zastosowaniu metod klasy Dynamic Filter i szablonu filtra lub przez stworzenie nowej klasy dziedziczącej po General Filter. Możliwe jest także stworzenie specjalnych funkcji-interfejsów umożliwiających korzystanie z filtrów jak ze zwykłych funkcji LV. W ten właśnie sposób i przez dziedziczenie napisane zostały wszystkie filtry standardowe (klasa Butli-in filters), dlatego są one także same w sobie swoistym przykładem korzystania z biblioteki.
Szablon do tworzenia własnych filtrów znajduje się w katalogu „typedefs”.
Korzystanie z filtrów dynamicznych wspomaga klasa Filter Library służąca do zarządzania używanymi filtrami. Korzysta ona z mechanizmu functional global przechowując i udostępniając załadowane wcześniej filtry wraz z przypisanymi im nazwami. Dzięki niej można odwoływać się do filtrów za pomocą krótkich nazw w dowolnym miejscu kodu, bez uciążliwego doprowadzania referencji.
Klasą wspomagającą jest także klasa Bitmap with Filters, dziedzicząca po klasie Bitmap i rozszerzająca jej funkcjonalność o przetwarzanie obrazu za pomocą sekwencji filtrów.
Bardziej szczegółowe opisy poszczególnych funkcji i zastosowań znajdują się w ww. dokumentacji i przykładach.
Instalacja
Biblioteki używać można po rozpakowaniu jej w dowolnym miejscu na dysku. Dostęp do wszystkich funkcji możliwy jest wtedy przez otwarcie pliku biblioteki „BitMan Lib.lvlib”. Najwygodniej jednak skopiować cały katalog BitMan do katalogu <LabVIEW x.x>\user.lib. Po restarcie LabVIEW na palecie, w dziale User Libraries, pojawi się wtedy sub-paleta „BitMan”.
Do działania nie są wymagane żadne biblioteki zewnętrzne.
Dokumentacja
Opis wszystkich znajdujących się na palecie funkcji dostępny jest w pliku „docs\BitMan docs.html” (po angielsku). Opisy znajdują się także (dla wszystkich funkcji) w sekcji Documentation okna właściwości danego VI, oraz w analogicznej dokumentacji ważniejszych kontrolek na jego panelu i jako takie dostępne są poprzez system pomocy kontekstowej LabVIEW.
Przykłady
Przykłady zastosowań znajdują się w katalogu „examples” (przykłady użycia samej biblioteki) i w katalogu „examples\Dynamic Filters” (przykłady tworzenia filtrów). Przykłady wraz z opisami umieszczonymi na diagramach stanowią integralną część dokumentacji.
Licencja
Oprogramowanie dostępne jest na zasadach licencji BSD (treść licencji w pliku license.txt)