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_*で定義されるオフセット
#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;
}