OpenCV cvCaptureFromCAM - eiichiromomma/CVMLAB GitHub Wiki

(OpenCV) cvCaptureFromCAM

カメラからのキャプチャを有効化

定義

/* start capturing frames from camera: index = camera_index + domain_offset (CV_CAP_*) */
CVAPI(CvCapture*) cvCaptureFromCAM( int index );

引数

index = カメラ番号(0から昇順で何台目か)+CV_CAP_*で定義されるオフセット

CV_CAP_*

#define CV_CAP_ANY      0   //何でもあり
#define CV_CAP_MIL      100 //Matrox Imaging Library
#define CV_CAP_VFW      200 //Video for Windows
#define CV_CAP_V4L      200 //Video for Linux
#define CV_CAP_V4L2     200 //Video for Linux2
#define CV_CAP_FIREWARE 300 //Firewire?
#define CV_CAP_IEEE1394 300 //IEEE1394
#define CV_CAP_DC1394   300 // 300はFirewireを使うデバイス
#define CV_CAP_CMU1394  300 

使用例

どうやらcvcam.hは廃れる運命にあるらしい。cvCaptureFromCAMを使った動画像処理プログラムを作る。

基本形

cvCaptureFromCAMでキャプチャ用ポインタを取得して、cvQueryFrameでフレーム画像を取得するのが基本らしい。 ライブラリはcv.lib cxcore.lib highgui.libを使う。 ちなみに原画像を出したくない場合は"main window"関係の部分を全てコメントしてしまえば良い。

    #include <cv.h>
    #include <highgui.h>
    #include <stdio.h>
    
    IplImage *image1;
    void effect(IplImage *image){
      image1 = cvCloneImage(image);
      cvShowImage("feed window",image1);
      cvReleaseImage(&image1);
    }
      
    int main()
    {
      //cvCaptureFromCAMでキャプチャ用のCvCaptureへのポインタを取得
      //引数はカメラ番号
      CvCapture *capture = cvCaptureFromCAM(CV_CAP_ANY);
      IplImage *image;
      int keyInput;
    
      if(!capture){
        fprintf(stderr,"Capture failed\n");
        return 1;
      }
      cvNamedWindow("main window",CV_WINDOW_AUTOSIZE);
      cvNamedWindow("feed window",CV_WINDOW_AUTOSIZE);
      
      //cvcamでのコールバックの代わりに無限ループを回す
      for(;;){
        //フレーム画像を取得
        image=cvQueryFrame(capture);
        if(!image){
          break;
        }
        cvShowImage("main window",image);
        
        //画像処理はここで行なう
        effect(image);
        
        //10msのウェイトをかけてキー入力を監視
        keyInput=cvWaitKey(10);
        //ESCキーでループを終了
        if((keyInput&255)==27){
          break;
        }
      }
      //後片付け
      cvReleaseCapture(&capture);
      cvDestroyWindow("main window");
      cvDestroyWindow("feed window");
      return 0;
    }

処理の追加

コールバック関数の代わりに用意したeffect関数を使う。 ネガ画像の作成には便利な関数cvXorSがあったのでそっちを使う。

void effect(IplImage *image){
  image1 = cvCloneImage(image);
  cvXorS(image, CV_RGB(255,255,255),image1,NULL);
  cvShowImage("feed window",image1);
  cvReleaseImage(&image1);
}

動画の保存

CvVideoWriterを使う。使い方は簡単で上の動画像処理プログラムに、宣言→設定→画像を指定しつつフレーム保存→後片付けの4行を足すだけ。 [[OpenCV/関数リファレンス/cvCreateVideoWriter)cvCreateVideoWriter については関数リファレンスに記載。

    #include <cv.h>
    #include <highgui.h>
    #include <stdio.h>
    
    IplImage *image1;
    void effect(IplImage *image){
      image1 = cvCloneImage(image);
      cvShowImage("feed window",image1);
      cvReleaseImage(&image1);
    }
      
    int main()
    {
      //cvCaptureFromCAMでキャプチャ用のCvCaptureへのポインタを取得
      //引数はカメラ番号
      CvCapture *capture = cvCaptureFromCAM(CV_CAP_ANY);
      IplImage *image;
      int keyInput;

      //動画保存用
      CvVideoWriter* videowriter=NULL;
    
      if(!capture){
        fprintf(stderr,"Capture failed\n");
        return 1;
      }
      cvNamedWindow("main window",CV_WINDOW_AUTOSIZE);
      cvNamedWindow("feed window",CV_WINDOW_AUTOSIZE);
      
      //cvcamでのコールバックの代わりに無限ループを回す
      for(;;){
        //フレーム画像を取得
        image=cvQueryFrame(capture);
        if(!image){
          break;
        }
        cvShowImage("main window",image);
        //動画保存用
        if(!videowriter){
          videowriter=cvCreateVideoWriter("filename.avi", -1,
          10.0, cvSize(image->width,image->height),1);
        }
        
        //画像処理はここで行なう
        effect(image);
        //動画保存用
        cvWriteFrame(videowriter_nopol, image2);
        
        //10msのウェイトをかけてキー入力を監視
        keyInput=cvWaitKey(10);
        //ESCキーでループを終了
        if((keyInput&255)==27){
          break;
        }
      }
      //後片付け
      cvReleaseCapture(&capture);
      cvDestroyWindow("main window");
      cvDestroyWindow("feed window");
      cvReleaseVideoWriter(&videowriter);
      return 0;
    }
⚠️ **GitHub.com Fallback** ⚠️