大家可以到这里下载英文原版:http://download.csdn.net/download/zleisure/7451051(下载时请看下资源简介)
第二个程序——视频
使用OpenCV播放视频,几乎与使用它来显示图像一样容易。播放视频时只需要处理的新问题就是如何循环地顺序读取视频中的每一帧,以及如何从枯燥的电影视频的读取中推出该循环操作。见例2- 3。
示例2-3:一个简单的OpenCV程序,用于播放硬盘中的视频文件。在这个示例中,我们只使用特定的模块头文件,而不仅是opencv.hpp。这加快了编译,所以有时这样更为合适。
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp"
int main( int argc,char** argv )
{
cv::namedWindow("Example3", cv::WINDOW_AUTOSIZE );
cv::VideoCapturecap;
cap.open(string(argv[1]) );
cv::Matframe;
while(1 )
{
cap >>frame;
if(!frame.data ) break; // Ran out of film
cv::imshow("Example3", frame );
if( cv::waitKey(33)>= 0 ) break;
}
return0;
}
下面我们开始main()函数,像往常一样,创建一个已命名的窗口(在本例中,命名“Example3”)。然后实例化视频捕捉对象cv::VideoCapture。这个对象可以打开和关闭如ffmpeg格式的大部分视频文件类型。
cap.open(string(argv[1]));
cv::Mat frame;
捕获对象通过一个指定包含路径和文件名的字符串打开视频。一旦打开,捕捉对象将包含所读取视频文件的所有信息,包括状态信息。当以这种方式创建,cv::VideoCapture对象被初始化到所对应视频文件的开头。在程序中,cv::Matframe实例化一个数据对象来保存视频帧。
cap >> frame;
if( !frame.data ) break;
cv::imshow("Example3", frame );
一旦进入while()循环,视频文件将从捕捉对象流逐帧被读取。程序通过if语句检查数据实际是从视频文件中读取(if(! frame.data)),如果不是,退出while()循环。如果一个视频帧读入成功,使用cv::imshow()显示它。
if( cv::waitKey(33)>= 0 ) break;
当前帧被显示后,我们会等待33ms【4】。如果期间用户触发了一个按键,循环被推出,读取视频停止。否则,33ms以后继续执行循环。在程序退出时,一旦它们离开作用域,所有的分配的资源将自动释放。
【4】:你能等待你喜欢的任何时长。在本例中,我们仅仅是假设30帧/秒是播放视频的正确速率,并且允许用户输入每帧间隔时长(我们在每帧间隔33ms)。在实践中,通过从cv::VideoCapture结构中读取实际帧率是一个更好的方法。