ś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.

6 komentarzy:

ugresia pisze...

Czy mógłbym prosić o informację na jakim linuksie udało się to odpalić i skąd są sterowniki?

Adam Śmigielski pisze...
Ten komentarz został usunięty przez autora.
Adam Śmigielski pisze...

Przepraszam, że dopiero teraz odpowiadam, ale ostatnio staram się unikać komputera poza pracą.

To już dość dawno było i mogło mi się coś pokręcić. Wydaje mi się jednak, że to był ten sterownik do którego podałem link w poprzednim wpisie: http://sourceforge.net/projects/easycapdc60/

OS to był Ubutnu Command Line Interface, czyli to bez X.
Wersja jak sądzę aktualna w tamtym okresie, czyli 10.10 lub 11.04. Nie jestem w stanie tego doprecyzować.


Poprawka, wpis był dodany w lutym 2011, więc 11.04 nie było jeszcze dostępne.

Marco pisze...

Hello, thank you very much for this tricks. But I still cannot reach my goal. I have the EasyCap 4ch, a program using OpenCv and i can't switch channel.
I used
fd = open(dev_name,O_RDONLY | O_NONBLOCK, 0);
int index=2;
ioctl(fd,VIDIOC_S_INPUT,&index);

but then i use
cvCaputureFromCAM (1)
to acquire the video signal.

Are the previous string of v4l2 valid for cvCaptureFromCAM command?
Thank you very much,
Marco

Adam Śmigielski pisze...

Quite surprising. I have not expected to see English comment here.


That was a long time ago, so I do not remember details. I have also changed my job in the meantime. There is no way for me to access the code.

EasyCAP DC60 - driver for device, this thing needs to be installed.

dev_name - absolute path to device.

index - values 0 and 1 points to the first channel.

OpenCV has problems with enumerating available devices (not possible). If you have multiple capture devices, then you have problem. There is no warranty that devices will get same ids on the next time system is restarted.

V4L2 is separate library and has nothing to do with OpenCV (OpenCV may use it internally, but ...).
As stated before long time has passed, but according to what I have posted, it looks fine. Note that just after channel is changed, framegrabber provide invalid frame (some random buffer in memory). "Good" image can be acquired after device perform acquisition.

I am not sure, but ioctl may require su privileges.

pklawit pisze...

Witam,

Problem z przełączaniem kanałów i śmieciami zaraz po przełączeniu widzę że jest dokładnie taki sam, z jakim ja walczyłem na taniej karcie 4-wejściowej z BT878.

Chodzi o to, że i tu (na tej karcie USB) i tam (na mojej karcie PCI) jest jeden scalak do przechwytywania obrazu, który na wejściu ma multiplexer podłączający do scalaka kolejne wejścia.

Pierwsza ramka po przełączeniu wejścia jest zazwyczaj skopana, ponieważ przełączenie wejścia często następuje w środku ramki a nie pomiędzy nimi. Ja miałem w rezultacie np. tylko co drugie linie, albo obraz zaczynał się kilka pikseli później itp.

Dla własnych potrzeb napisałem góry softu w PHP do pobierania i naprawiania takich ramek. W rezultacie obraz nie jest zły, ale prędkość przechwytywania jest na poziomie 2 kl/s dla każdej kamery, a obciążenie CPU non stop 90%.

Dobre rozwiązanie jest tylko jedno - bez multiplexowania. Musi być jeden chip A/D per wejście i koniec. Kupiłem ostatnio kartę PCI z 8 wejściami i 8 chipami BT878 i tam jest o niebo lepiej - nic się nie kaszani, nic nie trzeba poprawiać ręcznie.



Także przestrzegam przed kupowaniem tanich kart wielowejściowych, gdzie jest jeden przetwornik A/D i przełącznik na jego wejściu.

Pozdrawiam,
Piotr