2012-08-06 12 views
10

C'yle birlikte biraz fread ve deneme yazıyordum. Bu küçük programı bir web kamerasından veri almak ve bir dosyaya dökmek için C'ye yazdım. (gcc -o snap camera.c) derlenmiş zamanLinux'taki bir USB web kamerasının okuma çıktısı

#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ı çalışır: Aşağıdaki kaynağıdır. Beni şaşırtan şey, çıktı dosyasının ham bir veri dökümü değil, bir JPEG dosyası olmasıydı. Program çıktı dosyasındaki linux üzerindeki file komutunun çıktısı bir JPEG resim verisi olduğunu gösterdi: JFIF Standard 1.01. Dosya, biraz doygun olsa da, bir resim görüntüleyicide görüntülenebilir.

Bu nasıl veya nasıl oluyor? Kaynak veya programda herhangi bir JPEG kodlama kütüphanesi kullanmadım. Kamera doğal olarak JPEG çıkışı veriyor mu? Webcam, Logitech tarafından üretilen bir Sony Playstation 2 EyeToy. Sistem Debian Linux.

+1

iyi ki kamera çıkışları jpegler olabilir. – doron

cevap

7

Sony EyeToy oldukça popüler OV519 köprüsüyle bir OV7648 sensörüne sahiptir. OV519, JPEG formatındaki kareleri çıkarır - ve eğer kendi kameralarımdan doğru bir şekilde hatırlıyorsam, desteklediği tek format.

Bu gibi kameralar, uygulama desteğini veya kullanıcı alanlarına teslim edilmeden önce çerçeveleri açacak özel bir sürücüyü gerektirir. Görünüşe göre, sürücü, JPEG çerçevelerini orijinal biçiminde teslim ediyor, bu yüzden çıktıda JPEG verilerini alıyorsunuz.

BTW, gerçekten Linux'ta video cihazlarına erişmek için uygun bir yol Video4Linux2 API bir göz olmalıdır - Basit bir open()/read()/close() genellikle yeterli olduğunu ...

İlgili konular