2013-02-22 24 views
6

Web kameramda C++ kullanarak bir görüntüyü nasıl yakalarım ve diske kaydederim? Donanım sorunları nedeniyle OPENCV kullanamıyorum. USB web kamerası mplayer, peynir, gpicview, ffmpeg vb. Gibi diğer programlarla çalışır.USB web kamerası görüntü yakalama C + + OLMADAN openCV (LINUX)

V4L'nin bunu yapabildiğini duydum ancak C++ kütüphaneleri var mı? Herkes bana bunun nasıl yapılacağı konusunda bir C++ örneği gösterebilir mi?

+0

Yığın Taşmasına Hoş Geldiniz! StackOverflow bu soru için uygun bir yer değil. Kodunuzu sizin için yazmayız. Kendi kodlamanızı yapmalısınız ve eğer bir şeyin neden beklendiği gibi çalışmadığından emin değilseniz, kodun ne yapmak için beklediğinizi ve gerçekte tüm hata mesajlarını içerdiğini anlatarak açıklayın. [StackOverflow hakkında] konusuna bakın (http://stackoverflow.com/about). –

cevap

18

Kolayca kontrolünüz altında kam almak için bazı ioctls etkinleştirdikten sonra, bir videodevice üzerinde read yapabilirsiniz.

Bu iş için v4l2'yi kullanabilirsiniz. Siz bu adımda bunu:

  1. Açık kameranın devicefile ("/ dev/video0" genellikle)
  2. Eğer
  3. okumak için V4L2 söyle cihazın bazı yeteneği bilmek istediğiniz V4L2 söyle cihazdan
  4. Eğer burada

kullanmak istiyorum bu iş için kullandıkları bir uygulama V4L2 wich biçimini almaktadır söyle. Kamerayı 320x240 Pixel formatında bir video çekecek, ancak çözünürlükleri okuyabileceksiniz, kamera v4l2_capability yapısına sahiptir.

Ayrıca farklı Fotoğraf Makineleri üzerindeki kodu PS2 EyeToy'umdan daha önce test etmedim, ancak çoğunlukla qv4l2 adlı bir örnek programdan alınmış (bunu here'dan edinebilirsiniz). Bu program genellikle orada gördüğünüz diğer tüm sorunları çözmelidir.

#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

Detaylı yanıt için teşekkürler, bunu deneyeceğim. – Prem

İlgili konular