2012-08-06 15 views
10

Stavo sperimentando un po 'con fread e fwrite in C. Quindi ho scritto questo piccolo programma in C per ottenere i dati da una webcam e scaricarli in un file. Quanto segue è la fonte:Lettura dell'uscita di una webcam USB in Linux

#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; 
} 

Il programma funziona quando viene compilato (gcc -o snap camera.c). Quello che mi ha sorpreso è che il file di output non era un dump di dati grezzi ma un file JPEG. L'output del comando file su linux sul file di output dei programmi ha mostrato che si trattava di dati di immagine JPEG: JFIF Standard 1.01. Il file era visualizzabile su un visualizzatore di immagini, anche se un po 'saturo.

Come o perché ciò accade? Non ho usato alcuna libreria di codifica JPEG nel sorgente o nel programma. La fotocamera emette JPEG in modo nativo? La webcam è una Sony Playstation 2 EyeToy prodotta da Logitech. Il sistema è Debian Linux.

+1

Potrebbe anche essere che i file JPEG uscite della macchina fotografica. – doron

risposta

7

Il Sony EyeToy dispone di un sensore OV7648 con il noto OV519 bridge. OV519 emette frame in formato JPEG e, se ricordo correttamente dalle mie fotocamere, è l'unico formato supportato.

Le fotocamere di questo tipo richiedono supporto per le applicazioni o un driver speciale che decomprimerà i frame prima della consegna nello spazio utente. Apparentemente nel tuo caso il driver consegna i frame JPEG nella loro forma originale, motivo per cui stai ricevendo dati JPEG nell'output.

BTW, si dovrebbe davvero avere uno sguardo al Video4Linux2 API per il modo corretto per accedere ai dispositivi video su Linux - un semplice open()/read()/close() è generalmente non basta ...

Problemi correlati