2013-02-22 8 views
6

Wie kann ich ein Bild mit meiner Webcam mit C++ aufnehmen und auf Festplatte speichern? Ich kann OPENCV wegen Hardwareproblemen nicht verwenden. Die USB-Webcam funktioniert mit anderen Programmen wie mplayer, Käse, gpicview, ffmpeg, etc.USB Webcam Bilderfassung in C++ OHNE openCV (LINUX)

Ich habe gehört, V4L ist dazu in der Lage, aber hat es irgendwelche C++ Bibliotheken? Kann jemand mir ein C++ Beispiel zeigen, wie man das macht?

+0

Willkommen bei Stack Overflow! StackOverflow ist nicht der richtige Ort für diese Frage. Wir schreiben Ihren Code nicht für Sie. Sie müssen Ihre eigene Codierung vornehmen und wenn Sie nicht sicher sind, warum etwas nicht wie erwartet funktioniert, veröffentlichen Sie den Code mit einer Erläuterung dessen, was Sie erwartet haben und was er tatsächlich tut, einschließlich aller Fehlermeldungen. Siehe [über StackOverflow] (http://stackoverflow.com/about). –

Antwort

18

Es ist ziemlich einfach, Sie können read auf einem Videogerät tun, nachdem Sie einige ioctls aktiviert haben, um die Kamera unter Ihrer Kontrolle zu bekommen.

Sie können v4l2 für diesen Job verwenden. Sie tun dies in diesen Schritten:

  1. Öffnen Sie die devicefile der Kamera (in der Regel „/ dev/video0“)
  2. Sagen v4l2, dass Sie einige Fähigkeit des Gerätes
  3. Sagen v4l2 wissen wollen, lesen vom Gerät
  4. v4l2 Weicht Format Sagen Sie

Hier ist eine Implementierung ich für diesen Job verwenden verwenden. Es wird die Kamera einstellen, um ein Video in 320x240 Pixel zu erfassen, aber Sie können die Auflösungen lesen, die Kamera kann von der v4l2_capability Struktur.

Ich habe auch nicht den Code auf verschiedenen Kameras als meine PS2 EyeToy getestet, aber es ist meist aus einem Beispielprogramm namens qv4l2 (Sie können es von here erhalten). Dieses Programm sollte alle anderen Probleme lösen, die Sie normalerweise dort sehen.

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <string.h> 
#include <fcntl.h>    /* low-level i/o */ 
#include <errno.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <sys/time.h> 
#include <sys/ioctl.h> 

#include <linux/videodev2.h> 

static int xioctl(int fh, int request, void *arg) 
{ 
    int r; 
    do { 
     r = ioctl(fh, request, arg); 
    } while (-1 == r && EINTR == errno); 
    return r; 
} 

int allocCamera(const char* file) 
{ 
    struct v4l2_capability cap; 
    struct v4l2_crop crop; 
    struct v4l2_format fmt; 

    int camera_fd = open(file, O_RDONLY); 

    if (-1 == xioctl (camera_fd, VIDIOC_QUERYCAP, &cap)) { 
     if (EINVAL == errno) { 
      fprintf (stderr, "%s is no V4L2 device\n", file); 
      exit (EXIT_FAILURE); 
     } else { 
      printf("\nError in ioctl VIDIOC_QUERYCAP\n\n"); 
      exit(0); 
     } 
    } 

    if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) { 
     fprintf (stderr, "%s is no video capture device\n", file); 
     exit (EXIT_FAILURE); 
    } 

    if (!(cap.capabilities & V4L2_CAP_READWRITE)) { 
     fprintf (stderr, "%s does not support read i/o\n", file); 
     exit (EXIT_FAILURE); 
    } 

    memset(&fmt, 0, sizeof(fmt)); 
    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 
    fmt.fmt.pix.width  = 320; 
    fmt.fmt.pix.height  = 240; 
    fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; 
    fmt.fmt.pix.field  = V4L2_FIELD_INTERLACED; 
    if (-1 == xioctl(camera_fd, VIDIOC_S_FMT, &fmt)) { 
     printf("VIDIOC_S_FMT"); 
    } 
    return camera_fd; 
} 
+0

Vielen Dank für die ausführliche Antwort, ich werde dies versuchen. – Prem