2012-08-06 101 views
10

我正在用fread和fwrite在C中進行一點點試驗。於是我用C編寫了這個小程序,以便從網絡攝像頭獲取數據並將其轉儲到文件中。以下是來源:在Linux中讀取USB攝像頭的輸出

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

該程序在編譯時工作(gcc -o snap camera.c)。令我吃驚的是,輸出文件不是原始數據轉儲,而是JPEG文件。在程序輸出文件上的linux上file命令的輸出顯示它是JPEG圖像數據:JFIF Standard 1.01。該文件可以在圖像查看器上查看,儘管有點飽和。

這是怎麼發生的?我沒有在源代碼或程序中使用任何JPEG編碼庫。相機是否本地輸出JPEG?該網絡攝像頭是由羅技製造的索尼Playstation 2 EyeToy。該系統是Debian Linux。

+1

很可能攝像機輸出的JPEG文件。 – doron 2012-08-06 14:59:19

回答

7

Sony EyeToy有一個OV7648傳感器與相當流行的OV519橋。 OV519以JPEG格式輸出畫面 - 如果我從我自己的相機中正確記得,那是它支持的唯一格式。

像這樣的相機需要應用程序支持,或者需要一個特殊的驅動程序,在傳遞到用戶空間之前解壓縮幀。顯然在你的情況下,驅動程序以原始形式提供JPEG幀,這就是爲什麼你要在輸出中獲得JPEG數據的原因。

順便說一句,你真的應該看看在Video4Linux2 API爲在Linux上訪問視頻設備的正確方法 - 一個簡單的open()/read()/close()一般是不夠的......