Bilder von Webcam lesen



  • Abend,
    ich versuche ein kleines Programm zu schreiben das mir Bilder von der Webcam (Device) liefert und dann als *.ppm Datei abspeichert. Die Webcam funkt und ich kann mit diversen Programmen xawtv (motv),camstream auf die Kamera zugreifen. Wenn ich jedoch ein Bild mit meinem untenstehenden Programm hole (Webcam LED schaltet sich auch ein) dann bekomme ich nur ein (fast) schwarz/weiß Bild (Datei) in dem das eigentliche Bild (Motiv) 3 mal vorhanden ist.
    Nebenbei kann ich auch "video_picture" nicht mit "VIDEO_PALETTE_RGB24" beschreiben. Alles außer der "15" kann ich nicht beschreiben. (Es kommt Fehlermeldung)
    Ich benutze eine QuickCam Pro 3000 und als Treiber "pwc" sowie SUSE 8.2
    Mein Programm wird mit Ausgabeumlenkung in eine Datei aufgerufen.
    "z.B. webcam > /srv/www/.../kamera.ppm"

    Bin für jeden Tip dankbar.

    Danke
    worst_case

    [cpp]
    int main(int argc, char *argv[])
    {
    int fd;
    long MAX_BYTES;
    long length;
    struct video_window video_win;
    struct video_picture video_pict;

    int height = 240;
    int width = 320;
    int Kontrast = 60;
    int Helligkeit = 60;

    MAX_BYTES = (640 * 480 * 3);
    unsigned char image[MAX_BYTES];

    if ((fd = open("/dev/video0", O_RDONLY)) == -1)
    {
    perror("read_image: Can't open device");
    return(1);
    }

    /------------------------------------------------------/
    if (ioctl(fd, VIDIOCGWIN, &video_win) == -1)
    {
    perror("read_image: Can't get video window");
    return(1);
    }

    video_win.width = width;
    video_win.height = height;

    if (ioctl(fd, VIDIOCSWIN, &video_win) == -1)
    {
    perror("write_image: Can't put video window");
    return(1);
    }

    /------------------------------------------------------/

    if (ioctl(fd, VIDIOCGPICT, &video_pict) == -1)
    {
    perror("read_pic: Can't get picture information");
    return(1);
    }

    video_pict.palette = 15;//VIDEO_PALETTE_RGB24;
    video_pict.depth = 24;

    video_pict.colour = 0.5 + 655.35 * 50;

    video_pict.hue = 0.5 + 655.35 * 50;

    video_pict.brightness = 0.5 + 655.35 * Helligkeit;
    video_pict.contrast = 0.5 + 655.35 * Kontrast;

    if (ioctl(fd, VIDIOCSPICT, &video_pict) == -1)
    {
    perror("write_pic: Can't put picture information");
    return(1);
    }

    /------------------------------------------------------/
    length = video_win.width * video_win.height * 3;
    if (length > MAX_BYTES)
    {
    fprintf(stderr, "read_image: Image too large.\n");
    return(1);
    }

    if (read(fd, image, length) == -1)
    {
    perror("read_image: Error while reading");
    return(1);
    }
    close(fd);

    fprintf(stdout,"P6\n%d %d\n255\n", video_win.width,video_win.height);

    fwrite(image, 3 , video_win.width * video_win.height, stdout);

    return(0);
    }


Anmelden zum Antworten