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
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
相关文章推荐
- 【OpenCV学习笔记】2.3图像的腐蚀、膨胀、模糊、边缘检测
- Opencv学习笔记—霍夫变换
- opencv学习笔记-OpenCV3.0 决策树的使用
- 学习OpenCV的学习笔记系列(三)显示图片及视频
- OpenCV学习笔记——视频的边缘检测
- Python OpenCV学习笔记之:图像直方图反向投影(backprojection)原理简单实现
- 基础学习笔记之opencv(15):离散傅里叶变换
- Opencv_Python学习笔记--OpenCV中的GUI特性
- 【OpenCV学习笔记】十四、图像几何变换
- OpenCV学习笔记(五十五)——用OpenCV做人脸识别和性别识别contrib
- opencv学习笔记-入门(7)单通道的图像数据访问
- openCV学习笔记(二)---openCV系列基本操作
- Opencv学习笔记——自建滤波器cvFilter2D
- OpenCV学习笔记01--图像和视频的显示
- OpenCV学习笔记(六)—— OpenCV for Android打开相机
- OpenCV学习笔记【5】:一个复杂的变换
- opencv学习笔记-2,图像颜色空间转换
- Python OpenCV学习笔记之:使用KNN对视频背景消除
- openCV学习笔记一 —— 初识openCV
- 基础学习笔记之opencv(8):Mat - 基本图像容器