1. Opencv提供一个简单易用的框架以提取视频文件和USB摄像头中的图像帧,如果只是想读取某个视频,你只需要创建一个VideoCapture实例,然后在循环中提取每一帧。下面是一个简单的代码
#include<opencv2\core\core.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<iostream>
using namespace cv;
using namespace std;

int main()
{
	VideoCapture capture("d:\\road.avi");
	//检测视频是否读取成功
	if (!capture.isOpened())
	{
		cout << "No input image";
		return 1;
	}

	//获取图像帧率
	double rate = capture.get(CV_CAP_PROP_FPS);
	bool stop = false;
	Mat frame;
	namedWindow("Example");

	int delay = 1000/rate;

	while (!stop)
	{
		if (!capture.read(frame))
			break;
		imshow("Example",frame);
		if (waitKey(delay) >= 0)
			stop = true;
	}
	return 0;
}

要正确地打开视频文件必须确保电脑具有相应的解码器。同时也应该注意文件路径的未知是否正确,路径为止错误经常也会提示错误warning: Error opening file (../../modules/highgui/src/cap_ffmpeg_impl.hpp:545)。这个错误一般都是文件路径错误而导致的。

  1. 处理视频帧 为了对视频中的每一帧进行处理,我们可以创建自己的类VideoProcessor,其中封装OopenCV的视频获取框架,该类允许我们制定每帧调用的处理函数。 首先,我们希望制定一个回调处理函数,(关于回调函数,另外一个帖子http://blog.csdn.net/neal1991/article/details/45009377有介绍)。这个喊出可以接受一个Mat对象然后输出处理之后的Mat对象。
void processFrame(Mat& img, Mat& out);


    // 对视频的每帧做Canny算子边缘检测
void canny(Mat& img, Mat& out) 
{
    // 先要把每帧图像转化为灰度图
   cvtColor(img,out,CV_BGR2GRAY);
    // 调用Canny函数
   Canny(out,out,100,200);
    // 对像素进行翻转
    threshold(out,out,128,255,THRESH_BINARY_INV);
}

定义好一个视频处理类,它将与一个回调函数相关联。使用该类,可以创建一个实例,制定输入的视频文件,绑定回调函数,然后开始对每一帧进行处理,要调用这个视频处理类,只需要在main函数添加就可以了:

	// 首先创建实例
    VideoProcessor processor;
    // 打开视频文件
    processor.setInput("e:\\road.avi");
    
    // 分别为输入和输出视频
    processor.displayInput("Input Video");
    processor.displayOutput("Output Video");
    // 以原始帧率播放视频
    processor.setDelay(1000./processor.getFrameRate());
    // 设置处理回调函数
    processor.setFrameProcessor(canny);
    // 开始帧处理过程
    processor.run();
    waitKey();