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

初学图像处理+opencv----读取视频

2017-02-25 10:39 453 查看
读取视频的前提,还需要安装解码器。刚开始我是有一定疑惑的,opencv中提供只可以读取avi格式视频的功能,为什么还需要安装解码器,感谢从ChenLee_l博客http://blog.csdn.net/carson2005/article/details/6979806,得到了解答。重点就是,尽管OpenCV提供了一些读写视频文件的API,但是,它也仅仅是一个接口而已,其内部,依然需要调用相应的视频编解码器的API来进行解码。

接下来我安装了xvid,然后运行代码。

代码和解读如下:

#include "highgui.h"
int main(int argc, char* argv[])
{
cvNamedWindow("avi");
CvCapture* capture = cvCreateFileCapture(“视频文件路径");
IplImage* frame;
while(1)
{
frame = cvQueryFrame(capture);
if(!frame)break;

cvShowImage("avi",frame);
char c = cvWaitKey(33);
if(c==27)//esc ascII值
break;
}
cvReleaseCapture(&capture);
cvDestroyWindow("avi");
return 0;
}


CvCapture 是一个结构体,用来保存图像捕获所需要的信息。 opencv提供两种方式从外部捕获图像,一种是从摄像头中,一种是通过解码视频得到图像。 两种方式都必须从第一帧开始一帧一帧的按顺序获取,因此每获取一帧后都要保存相应的状态和参数。比如从视频文件中获取,需要保存视频文件的文件名,相应的解码器类型,下一次如果要获取将需要解码哪一帧等。 这些信息都保存在CvCapture结构中,每获取一帧后,这些信息都将被更新,获取下一帧需要将新信息传给获取的api接口。

cvCreateFileCapture(char*name):通过输入要读取的avi文件的路径,然后,该函数返回一个指向CvCapture结构体的指针。

cvQueryFrame(capture):输入一个CvCapture类型的指针,该函数主要功能是将视频文件的下一帧加载到内存。与cvLoadImage的不同之处是,该函数不重新分配内存空间。

C=cvWaitKey(33):当前帧被显示后,等待33毫秒。如果用户触发了一个按键,c会被设置成这个按键的ASCII码,否则会被设置成-1。cvWaitKey(33)在此处的另外一个作用是,控制帧率。

cvReleaseCapture(&capture):释放为CvCapture结构体开辟的内存空间,关闭打开的AVI文件相关的文件句柄。

运行时我遇到一个问题,出现debug assertion failed,查找半天没找出问题,后来在狸猫里修改了转换avi的格式为avi auto video后,竟然奇迹的成功运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv VS2010