一、OpenCV读取视频
使用OpenCV播放视频,和用它来显示图像一样简单。播放视频的时候只需要明白如何循环地读取视频中的每一帧,和怎么退出循环操作。
(1)结构体CvCapture
CvCapture 是一个结构体,用来保存图像捕获所需要的信息。
opencv提供两种方式从外部捕获图像
一种是从摄像头中,
一种是通过解码视频得到图像。
两种方式都必须从第一帧开始一帧一帧的按顺序获取,因此每获取一帧后都要保存相应的状态和参数。
比如从视频文件中获取,需要保存视频文件的文件名,相应的解码器类型,下一次如果要获取将需要解码哪一帧等。 这些信息都保存在CvCapture结构中,每获取一帧后,这些信息都将被更新,获取下一帧需要将新信息传给获取的api接口.
(2)cvCreateFileCapture(char*name)
通过输入要读取的avi文件的路径,然后,该函数返回一个指向CvCapture结构体的指针。
(注意:区分cvCreateFileCapture(char*name)与结构体CvCapture中首字母c的大小写问题,记住结构体的首字母为大写
还要注意一个东西就是有可能变量capture没有值ox00000000,这个时候可能是需要装一个解码器)
(3)cvQueryFrame(capture)
输入一个CvCapture类型的指针,该函数主要功能是将视频文件的下一帧加载到内存。与cvLoadImage的不同之处是,该函数不重新分配内存空间。
(4)C=cvWaitKey(33)
当前帧被显示后,等待33毫秒。如果用户触发了一个按键,c会被设置成这个按键的ASCII码,否则会被设置成-1。
cvWaitKey(33)在此处的另外一个作用是,控制帧率。改变值,来控制帧率,值越大,播放速度越慢。
(5)cvReleaseCapture(&capture)
功能:释放为CvCapture结构体开辟的内存空间
关闭打开的AVI文件相关的文件句柄
补充:读取摄像头
只需把cvCreateFileCapture改成cvCreateCameraCapture即可。
该函数的输入参数是一个ID号,只有存在多个摄像头时才起作用。当ID=-1时,表示随机选择一个。
二、框架总结
三、具体例子代码:
// test_aiv_file.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "highgui.h"
int _tmain(int argc, _TCHAR* argv[])
{
cvNamedWindow("avi");
CvCapture* capture = cvCreateFileCapture("F:\\电影\\聚美优品广告 陈欧 我为自己代言 高清.avi");//大小写要注意;结构体首字母要大写
//CvCapture* capture =cvCreateCameraCapture("");
IplImage* frame;
while(1)
{
frame=cvQueryFrame(capture);
if(!frame)这里要注意!别写成中文格式的!
{
break;
}
cvShowImage("avi",frame);
char c = cvWaitKey(33);
if(c==27)
{
break;
}
}
cvReleaseCapture(&capture);
cvDestroyWindow("avi");
return 0;
}
四、实验结果
实验没有成功,正在检查原因。。。。
五、OpenCV读取视频遇到常见问题
(1)视频文件路径没写对
(2)没有安装解码器
(3)如果使用的是Opencv2.0或更高版本,那么,能否正确加载opencv_ffmpeg210.dll
(4)尽管是AVI文件,但也可能使用了某种codec,例如:MJPEG Decompressor。 需要把它转换OpenCV支持的AVI文件. OpenCV支持的AVI。例如使用狸窝全能视频转换器,在《预置方案》处,选择AVI-Audio_Video Interleaved(*.avi)。或者使用格式工厂也可以。
(5)读摄像头数据,需要安装与摄像头相应的驱动程序。
重新实验了一下,利用狸窝全能视频转换器把视频转换了下格式和截取了一部分,终于成功了。
试验结果:
附录下载:
解码器:decoder
本文尚不成熟,希望大家提出宝贵意见。
敬请关注本博客和新浪微博To_捭阖_youth.