对视频进行读写,可使用OpenCV提供的CvCapture和CvVideoWriter。
在Windows平台下,OpenCV以前提供的读写功能采用VFW,效率低下且有些格式支持不好。而 OpenCV 2.0 内置了videoInput Library,可以自动在VFW和DirectShow间切换。videoInput是老外写的功能强大的开源视频处理库。
0. Windows SDK
微软每推出一个重要的windows版本,一般都会同时推出一个SDK(Software Development Kit)。SDK包含了开发该windows版本所需的windows函数和常数定义、API函数说明文档、相关工具和示例。
安装Windows 7 SDK,下载地址:
1. 新建项目
启动Code::Blocks,选择File->New->Project, 项目类型选择:Console Application,项目名为:MyRecorder,其他按默认选择。
2. 代码
打开main.cpp文件,输入以下代码:
#include <iostream>
#include <videoInput.h>
#include <opencv2/opencv.hpp>
using namespace std;
int main(int argc, char** argv)
{
int width = 640;
int height = 400;
char* name = "test.avi";
name = argc == 2 ? argv[1] : name;
if(argc == 3)
{
width = atoi(argv[1]);
height = atoi(argv[1]);
}
else if(argc == 4)
{
name = argv[1];
width = atoi(argv[2]);
height = atoi(argv[3]);
}
IplImage* pImg = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
videoInput video;
video.setupDevice(0, width, height);
video.showSettingsWindow(0);
CvVideoWriter* writer = 0;
writer = cvCreateAVIWriter(name, -1, 25, cvSize(width, height), 1);
cvNamedWindow("video", 1);
pImg = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
while(1)
{
if(video.isFrameNew(0))
{
video.getPixels(0, (unsigned char*)pImg->imageData, false, true);
cvWriteFrame(writer, pImg);
cvShowImage("video", pImg);
if(cvWaitKey(1) == 27)
break;
}
}
cvReleaseVideoWriter(&writer);
cvReleaseImage(&pImg);
cvDestroyAllWindows();
return 0;
}
3. 设置
打开Project-〉Build Options选项卡
选择Search directories,在Compiler里Add进以下目录:
C:/OpenCV2.2/include
C:/OpenCV2.2/3rdparty/include
在Linker里Add进以下目录:
C:/OpenCV2.2/lib
C:/OpenCV2.2/3rdparty/lib
C:/Program Files/Microsoft SDKs/Windows/v7.0A/Lib
选择Linker settings,添加以下文件:
C:/OpenCV2.2/lib 此目录下的所有文件
C:/OpenCV2.2/3rdparty/lib 此目录下的所有文件
C:/Program Files/Microsoft SDKs/Windows/v7.0A/Lib 此目录下所有ole开头的文件
4. 编译
点击Build->Build编译项目。
5. 运行
点击Build-〉Run
会出现三个窗口:
视频编码选择:
根据系统安装和OpenCV支持的编码格式,选择合适的格式来生成avi文件,我测试可以用的是Microsoft Video 1格式,点确定后即可看到视频窗口。
视频属性设置窗口:
可以设置视频的一些效果。
在项目的根目录下会产生一个avi文件,可以直接用播放器来播放。