2012-08-06 48 views
10

私はCでfreadとfwriteを少し試していたので、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標準1.01。ファイルは画像ビューアで表示できましたが、少ししか飽和しませんでした。

これはどうやって起こりますか?私は、ソースまたはプログラムでJPEGエンコードライブラリを使用しませんでした。カメラはJPEGをネイティブに出力しますか?ウェブカメラは、Logitechによって製造されたSony PlayStation 2 EyeToyです。システムはDebian Linuxです。

+1

はよくカメラがJPEGファイルを出力しているかもしれません。 – doron

答えて

7

Sony EyeToyには、非常にポピュラーなOV519ブリッジ付きのOV7648センサーがあります。 OV519はフレームをJPEG形式で出力します。自分のカメラから覚えていれば、それがサポートする唯一のフォーマットです。

このようなカメラでは、アプリケーションのサポート、またはユーザー空間への配信前にフレームを解凍する特別なドライバが必要です。どうやらあなたのケースでは、ドライバは元の形式でJPEGフレームを配信します。そのため、JPEGデータが出力されています。

ところで、あなたは本当にLinux上でビデオデバイスにアクセスするための適切な方法についてVideo4Linux2 APIを見ている必要があります - シンプルなopen()/read()/close()は、一般的に十分ではありません...

関連する問題