2013-02-22 30 views
6

C++を使用してウェブカメラで画像をキャプチャしてディスクに保存するにはどうすればよいですか? OPENCVはハードウェアの問題のために使用できません。 usb webcamは、mplayer、cheese、gpicview、ffmpegなどの他のプログラムと連携します。openCV(LINUX)なしのUSBウェブカメラ画像キャプチャ

V4Lはこれを実行できると聞きましたが、C++ライブラリはありますか? 誰でも私にこれを行う方法のC++の例を表示できますか?

+0

ようこそスタックオーバーフロー! StackOverflowはこの質問の適切な場所ではありません。私たちはあなたのコードを書いていません。独自のコーディングを行う必要があります。なぜ何かが期待どおりに機能しない理由がわからない場合は、コードが何を期待しているのか、実際にはすべてのエラーメッセージを含めて説明してください。 [StackOverflowについて](http://stackoverflow.com/about)を参照してください。 –

答えて

18

非常に簡単ですが、ビデオカメラでreadを実行することができます。ioctlを有効にして、コントロールすることができます。

このジョブにはv4l2を使用できます。あなたはこれらのステップに次の操作を行います。

  1. オープンカメラのdevicefileは(「は/ dev/video0」通常)
  2. はあなたが
  3. が読むためにV4L2を知らせるデバイスのいくつかの機能を知りたいということV4L2知らせますデバイス
  4. からあなたがここ

を使用したいV4L2ウィッヒ形式を知らせる、私はこの仕事のために使うの実装です。 320x240ピクセルのビデオをキャプチャするようにカメラを設定しますが、解像度を読み取ることができます。カメラはv4l2_capability構造からアクセスできます。

また、私のPS2 EyeToyとは別のカメラでコードをテストしていませんが、ほとんどがサンプルコードqv4l2(hereから入手できます)から取得しました。このプログラムはあなたが通常そこに見る他のすべての問題を解決するはずです。

#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

詳細な応答をありがとう、私はこれを試してみましょう。 – Prem

関連する問題