OpenCV学习笔记(1)

摘自:http://www.aiseminar.cn/bbs/thread-325-1-1.html

 

1 从视频序列获得一帧

OpenCV支持从摄像头或视频文件(AVI)中获取图像,方法如下。

摄像头采集初始化:

  1. CvCapture* capture = cvCaptureFromCAM(0); //从视频设备#0采集
从文件采集初始化:
  1. CvCapture* capture = cvCaptureFromAVI("infile.avi");
采集一帧:
  1. IplImage* img = 0;
  2. if (! cvGrabFrame(capture)) { //采集一帧
  3. printf("Could not grab a frame/n/7");
  4. exit(0);
  5. }
  6. img = cvRetrieveFrame(capture); //提取采集到的帧
要从多个摄像机同时获取图像,首先从每个摄像机都抓取一副图片,然后在全部结束后提取这些图片。

释放采集源:
  1. cvReleaseCapture(&capture);
注意:采集到的图像获得的空间将被设备采集 函数分配或释放,无需明确地去释放他们。

2 获得或设置帧信息

获得采集设备属性:
  1. cvQueryFrame(capture); // 此调用是获得正确的采集属性所必需的
  2. int frameH = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
  3. int frameW = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
  4. int fps = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
  5. int numFrames = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
总的帧数和只与视频文件有关。(它似乎有点工作不正常)

获得帧信息:
  1. float posMsec = cvGetCaptureProperty(capture, CV_CAP_PROP_POS_MSEC);
  2. int posFrames = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES);
  3. float posRatio = cvGetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO);
获得采集帧的第一帧的位置到[msec]中,或得到它们(多摄像机)的索引(第一幅的索引为0)。相对位置(ratio),第一帧是0,最后一帧是1。ratio只相对于从文件采集起作用。

3 保存到视频文件

初始化视频写对象:
  1. CvVideoWriter* writer = 0;
  2. int isColor = 1;
  3. int fps = 25; // 或30
  4. int frameW = 640; // 744 for firewire cameras
  5. int frameH = 480; // 480 for firewire cameras
  6. writer = cvCreateVideoWriter("out.avi", CV_FOURCC('P', 'I', 'M', '1'), fps, cvSize(frameW, frameH), isColor);
其他可能的编码器代码:
  1. CV_FOURCC('P','I','M','1')    = MPEG-1 codec
  2. CV_FOURCC('M','J','P','G')    = motion-jpeg codec (does not work well)
  3. CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
  4. CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
  5. CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
  6. CV_FOURCC('U', '2', '6', '3') = H263 codec
  7. CV_FOURCC('I', '2', '6', '3') = H263I codec
  8. CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
编码器代码-1将打开编码器选择窗口(在windows 系统下)。

写视频文件:
  1. IplImage* img = 0;
  2. int nFrames = 50;
  3. for (i = 0; i < nFrames; i++) {
  4. cvGrabFrame(capture); // 采集一帧
  5. img = cvRetrieveFrame(capture); // 提取获得帧
  6. cvWriteFrame(writer, img); // 加入此帧到文件
  7. }
要在采集同时查看采集到的帧,可以添加如下代码:
  1. cvShowImage("mainWin", img);
  2. key = cvWaitKey(20); // 等待20ms
注意:如果没有20ms的延时,获得的序列将显示不正常。

释放视频写对象:
  1. cvReleaseVideoWriter(&writer);

PS:Introduction to Programming with OpenCV : http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/index.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值