2012-08-06 16 views
10

Eksperymentowałem trochę z freadem i fwrite w C. Więc napisałem ten mały program w C, aby pobrać dane z kamery internetowej i zrzucić je do pliku. Poniżej znajduje się źródło:Wynik odczytu kamery USB w Linuksie

#include <stdio.h> 
#include <stdlib.h> 
#define SIZE 307200 // number of pixels (640x480 for my webcam) 
int main() { 
    FILE *camera, *grab; 
    camera=fopen("/dev/video0", "rb"); 
    grab=fopen("grab.raw", "wb"); 
    float data[SIZE]; 
    fread(data, sizeof(data[0]), SIZE, camera); 
    fwrite(data, sizeof(data[0]), SIZE, grab); 
    fclose(camera); 
    fclose(grab); 
    return 0; 
} 

Program działa gdy kompilowany (gcc -o snap camera.c). Zaskoczyło mnie to, że plik wyjściowy nie był zrzutem danych surowych, ale plikiem JPEG. Wynik polecenia file na Linuksie w pliku wyjściowym programów pokazał, że był to obraz JPEG: JFIF Standard 1.01. Plik był widoczny na przeglądarce obrazów, chociaż trochę nasycony.

Jak to się dzieje? Nie użyłem żadnych bibliotek kodujących JPEG w źródle lub w programie. Czy kamera wyprowadza natywnie obraz JPEG? Kamera internetowa to Sony Playstation 2 EyeToy, która została wyprodukowana przez firmę Logitech. System to system Debian Linux.

+1

mogłaby być, że wyjścia kamery JPEG. – doron

Odpowiedz

7

Ma czujnik OV7648 z dość popularnym mostkiem OV519. OV519 generuje ramki w formacie JPEG - i jeśli dobrze pamiętam z własnych kamer, jest to jedyny obsługiwany format.

Kamery tego typu wymagają obsługi aplikacji lub specjalnego sterownika, który rozpakuje ramki przed dostarczeniem do przestrzeni użytkownika. Najwyraźniej w twoim przypadku sterownik dostarcza ramki JPEG w ich oryginalnej formie, dlatego otrzymujesz dane JPEG na wyjściu.

BTW, naprawdę powinieneś rzucić okiem na Video4Linux2 API dla właściwego sposobu uzyskania dostępu do urządzeń wideo w Linuksie - prosty open()/read()/close() generalnie nie jest wystarczająco ...

Powiązane problemy