您的位置:首页 > 运维架构

OpenCV学习笔记(1)

2010-06-26 18:02 330 查看
摘自:http://www.aiseminar.cn/bbs/thread-325-1-1.html

1 从视频序列获得一帧

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

摄像头采集初始化:

CvCapture* capture = cvCaptureFromCAM(0); //从视频设备#0采集

从文件采集初始化:

CvCapture* capture = cvCaptureFromAVI("infile.avi");

采集一帧:

IplImage* img = 0;

if (! cvGrabFrame(capture)) { //采集一帧

printf("Could not grab a frame/n/7");

exit(0);

}

img = cvRetrieveFrame(capture); //提取采集到的帧

要从多个摄像机同时获取图像,首先从每个摄像机都抓取一副图片,然后在全部结束后提取这些图片。

释放采集源:

cvReleaseCapture(&capture);

注意:采集到的图像获得的空间将被设备采集函数分配或释放,无需明确地去释放他们。

2 获得或设置帧信息

获得采集设备属性:

cvQueryFrame(capture); // 此调用是获得正确的采集属性所必需的

int frameH = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);

int frameW = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);

int fps = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);

int numFrames = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);

总的帧数和只与视频文件有关。(它似乎有点工作不正常)

获得帧信息:

float posMsec = cvGetCaptureProperty(capture, CV_CAP_PROP_POS_MSEC);

int posFrames = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES);

float posRatio = cvGetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO);

获得采集帧的第一帧的位置到[msec]中,或得到它们(多摄像机)的索引(第一幅的索引为0)。相对位置(ratio),第一帧是0,最后一帧是1。ratio只相对于从文件采集起作用。

3 保存到视频文件

初始化视频写对象:

CvVideoWriter* writer = 0;

int isColor = 1;

int fps = 25; // 或30

int frameW = 640; // 744 for firewire cameras

int frameH = 480; // 480 for firewire cameras

writer = cvCreateVideoWriter("out.avi", CV_FOURCC('P', 'I', 'M', '1'), fps, cvSize(frameW, frameH), isColor);

其他可能的编码器代码:

CV_FOURCC('P','I','M','1') = MPEG-1 codec

CV_FOURCC('M','J','P','G') = motion-jpeg codec (does not work well)

CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec

CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec

CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec

CV_FOURCC('U', '2', '6', '3') = H263 codec

CV_FOURCC('I', '2', '6', '3') = H263I codec

CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec

编码器代码-1将打开编码器选择窗口(在windows系统下)。

写视频文件:

IplImage* img = 0;

int nFrames = 50;

for (i = 0; i < nFrames; i++) {

cvGrabFrame(capture); // 采集一帧

img = cvRetrieveFrame(capture); // 提取获得帧

cvWriteFrame(writer, img); // 加入此帧到文件

}

要在采集同时查看采集到的帧,可以添加如下代码:

cvShowImage("mainWin", img);

key = cvWaitKey(20); // 等待20ms

注意:如果没有20ms的延时,获得的序列将显示不正常。

释放视频写对象:

cvReleaseVideoWriter(&writer);

PS:Introduction to Programming with OpenCV : http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/index.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: