środa, 16 lutego 2011

EasyCap 4 Channel Usb DVR

Aktualnie pracuję nad tym jak zrobić PIP z kilku kamer. EasyCap 4 Channel Usb DVR to frame grabber, którego używamy do przechwytywania obrazu z kamer analogowych. Ma tą ważną cechę, że dzięki sterownikowi EasyCAP DC60 Driver działa z systemem Linux, co chyba nie jest takie oczywiste w tej kategorii sprzętu. Testowaliśmy jedno konkurencyjne urządzenie i nie udało się go uruchomić.
Frame grabber ma 4 kanały video in. Możliwe jest jednak zbieranie tylko z jednego kanału równocześnie. Zmianę aktualnego kanału można dokonać za pomocą biblioteki Video for Linux 2 - v4l2. Przełączenie kanału jest operacją dość czasochłonną i powoduje, że obraz pobrany tuż po niej zawiera śmieci.

Jak zrobić Pip z takim sprzętem? Użyć kilka frame grabber'ów ;)



Obrazy pobieramy biblioteką OpenCV, funkcje:
cvCaptureFromCAM,
cvQueryFrame.

Zmiana kanału jest możliwa poprzez v4l2, funkcja:
ioctl(file, VIDIOC_S_INPUT, &index),
gdzie file to plik urządzenia otwarty funkcją open i flagą O_RDONLY | O_NONBLOCK,
a indeks to wartość typu int z numerem kanału. 0 i 1 to kanał pierwszy.

wtorek, 1 lutego 2011

3 miesiące przerwy, podsumowanie

Od poprzedniego posta upłynęło już bardzo dużo czasu. W pracy projekt się kończy w trybie przyśpieszonym (czytać: nie ma kasy, więc robimy na szybko ile się da). Przedłużająca się niezbyt przyjemna sytuacja w pracy daje mi się we znaki (uczucie senności, zmęczenie itp). Krótko, nie bardzo mi się chciało pisać.

Z pracy:
- linux frame buffer - bardzo ciekawa bestia,
- obsługa wielokanałowego frame grabbera sterownikiem EasyCAP DC60 Driver,
- fuse - o tym już pisałem,
- wizyta w warszawie,
- przechwytywanie obrazu z kamer ip dedykowaną biblioteką pylon.

Z domu:
- przeprowadzka - w listopadzie zamieszkaliśmy we "własnym" mieszkaniu (nasze nie jest, ale w końcu sami),
- silnik się rozwija. Przemyślałem sobie parę rzeczy i sporo pracy poświęciłem przygotowaniu "framework'a" leżącego u podstaw silnika.

W silniku skończony mam jak na razie system obsługi okien. Prosty w obsłudze i bardzo elastyczny ;) Na poważnie, skupiłem się na elastyczności:
- użytkownik sam może utworzyć okno (np. CreateWindowEx) i przekazać je do systemu,
- użytkownik może wybierać pomiędzy domyślną i własną funkcją obsługi komunikatów,
- nie ma ograniczeń co do ilości okien,
- można dynamicznie tworzyć i zamykać okna,
- system zapewnia dostęp do uchwytu okna (na razie tworzę z myślą o Windows),
- renderować do okna można dowolną metodą: GDI, OGL, DX,
- można renderować do kilku okien naraz,
- można nawet dodać menu ;).

Ograniczenia:
- domyślna funkcja okna korzysta z danych zapisanych za pomocą funkcji SetWindowLong w polu GWL_USERDATA.

Wygoda:
- utworzenie typowych okien wymaga jedynie obiektu menadżera i wywołania odpowiedniej funkcji tworzącej okno.


Koniec.