Andreas-Loibl.de Programmieren :: C/C++
Hintergrundbild

Webcammit C ansteuern

Ich hab mal eine Aldi-Webcam bekommen (schon länger her), die ich nie wirklich benutzt habe. Jetzt hab ich mal ausprobiert selbst Programme dafür zu schreiben und es funktioniert!

Hier ein Beispielprogramm, das ein Foto von der Webcam ausliest und auf die Standartausgabe ausgibt (im PPM-Format)

Die Anwendung funktioniert folgendermaßen:

# kompilieren:
gcc -o read_image read_image.c

# ausführen:
./read_image > dateiname.ppm

Hier nun der Sourcecode (read_image.c)
/*
 read_image.c: Foto mit einer Webcam machen und das Bild im PPM-Format ueber stdout ausgeben
*/
# include <stdio.h>
# include <unistd.h>
# include <fcntl.h>
# include <sys/ioctl.h>
# include <linux/videodev.h>
 
# define MAX_BYTES (640*480*3)
 
unsigned char image[MAX_BYTES];
 
int main()
 {
  int fd;
  long length;
  struct video_window video_win;
 
 
  if ((fd = open("/dev/video", O_RDONLY)) == -1)
   {
    perror("read_image: Can't open device");
    return(1);
   }
 
  if (ioctl(fd, VIDIOCGWIN, &amp;video_win) == -1)
   {
    perror("read_image: Can't get video window");
    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);
   }
 
  printf("P6\n%d %d\n255\n", video_win.width,
         video_win.height);
  fwrite(image, 3, video_win.width*video_win.height,
         stdout);
 
  close(fd);
 
  return(0);
 }

Später werd ich hier vielleicht noch etwas ergänzen, ich hab bei mir schon eine kleine Kantenerkennung eingebaut und versuche jetzt damit irgendwie eine einfache Mustererkennung hinzubekommen, naja....

Ach ja, downloaden kann man das Script auch (wenn man zu faul für Copy&Paste ist ;) )

read_image.c