1. 环境配置(opencv2.2及以上)
选择2.2及以上版本是因为,在2.1及以下会出现以下两个错误:
(a) Codec的错误,需要你安装相应的解码器,如果你的AVI或其他视频OpenCV不能读,请用格式工厂,暴风影音等转化为其他可处理格式,可以先用格式工厂查看视频相关信息,包括帧率、Codec格式、宽和高等。(可以添加解码器http://hi.baidu.com/yibobin/blog/item/0f574302b7d874134afb5158.html)
(b) 每次运行到cvWiteFrame时就弹出:Unhandled exception at 0x0f941f15 in opencv_test.exe: 0xC0000005: Access violation reading location 0xffffffff(或者是0X00000000,这个取决于你的系统)
我配置的是opencv2.3+VS2008,下载地址http://www.opencv.org.cn/index.php/Download,有两种方法安装:
(1)下载OpenCV for Windows,源代码需编译,需要下载CMakehttp://www.cmake.org/cmake/resources/software.html
CMake打开需编译的OpenCV2.3源代码,配置好Source和Build文件路径后,点Configure一次,选择你需要的模块(模块必须要存在),再点一次Configure,检查是否有错误,如果没有点击Generate。
如图所示(我用的是同一路径)
插曲:比如你需要(如果你不需要当然不需要安装)
Qt 下载 http://qt.nokia.com/downloads-cn
(其安装配置见a.http://hi.baidu.com/yibobin/blog/item/5a3098ee801211f6b3fb9551.html
b.http://hi.baidu.com/yibobin/blog/item/fe810efce0875a9ab801a036.html 和 http://hi.baidu.com/yibobin/blog/item/f0f355ee7abae23e2cf53401.html)
CuDa 下载http://developer.nvidia.com/cuda-toolkit-40 (如果是64位机器和操作系统,可以安装64位,其也包含32位)
(其安装配置见http://hi.baidu.com/yibobin/blog/item/6969f7d384f0601c3bf3cfea.html)
接下来,就是编译OpenCV2.3的源文件了,在CMake之后,会在你CMake Build的路径文件夹中生成OpenCV.sln,如图所示:
生成解决方案即可,不过需要生成Debug和Release两个版本。如果你人品很好,上面的都一切OK的话,接下来进行VS2008的配置:
首先,将CMake Source路径下文件中的modules下这些文件夹中(如下图所示)的\include\opencv2下的文件夹拷贝到CMake Build路径下文件中的\include\opencv2中。
然后,将D:\OpenCV-2.3.0\bin\Debug和D:\OpenCV-2.3.0\bin\Release放入系统环境变量,配置VS2008的选项->项目和解决方案,如下图所示:
将下面的加入包含文件中:D:\OpenCV-2.3.0\include 和 D:\OpenCV-2.3.0\include\opencv
再将下面的加入库文件中:D:\OpenCV-2.3.0\lib\Debug 和 D:\OpenCV-2.3.0\lib\Release
最后,就可以编写程序试试了,大功告成一大部分!
(2)另一种方法下载下面两个文件,然后按照readme配置好,这是官方已经编译好的,解压下面两个文件,讲支持GPU的解压文件拷贝到superpack解压后的文件夹中,注意拷贝的位置要正确!
OpenCV for Windows(已使用VC2008编译,支持GPU运算) OpenCV for Windows,superpack2. 图片和视频相互转换
为了方便,我们使用自然数进行图片命名!
(1)Video to Image
CvCapture *capture = cvCaptureFromAVI("a1.avi"); // 读取视频
cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, 10500); // 设置属性,我们从10500帧开始
int num_frm = cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT); // 获取总的帧数
int count = 10500; // 设置开始抓取的帧
while( cvGrabFrame(capture) && count <= 21000) // 抓当前帧
{
IplImage* pFrame = cvRetrieveFrame(capture);// 取回由函数cvGrabFrame抓取的图像
char test[100]; // 存放文件名
sprintf(test,".\\2\\%d%s",count,".jpg"); // 文件名格式
cvSaveImage(test,pFrame); // 保存图像文件
count++; // 抓下一帧,回到while中的cvGrabFrame
}
cvReleaseCapture(&capture); // 释放CvCapture结构
(2)Image to Video
int i = 10500;// 存放的文件名开始
IplImage* img = 0; // 存放图像
char image_name[13]; // 存放图像名
printf("------------- image to video ... ----------------\n");
//初始化视频编写器,参数根据实际视频文件修改,注意有些格式是不能生成的,或生成无用,请参考相关Codec
CvVideoWriter *writer = 0; // 写视频结构
int isColor = 1; // 如果非零,编码器将希望得到彩色帧并进行编码;否则,是灰度帧(只有在Windows下支持这个标志)。
int fps = 25; // 图像帧率,格式工厂会让你很轻松的了解视频相关信息
int frameW = 480; // 帧宽,根据你需要的大小修改
int frameH = 360; // 帧高,同上
writer=cvCreateVideoWriter("out.avi",CV_FOURCC('D','I','V','X'),fps,cvSize(frameW,frameH),isColor); // 创建
printf("\tvideo height : %d\n\tvideo width : %d\n\tfps : %d\n", frameH, frameW, fps);
//创建窗口
cvNamedWindow( "mainWin", CV_WINDOW_AUTOSIZE );
while(i
sprintf(image_name, "%s\\%d%s", "Output3", i++, ".jpg");
img = cvLoadImage(image_name); // 读取图像
if(!img)
{
printf("Could not load image file...\n");
exit(0);
}
cvShowImage("mainWin", img); // 显示图像
char key = cvWaitKey(20);
cvWriteFrame(writer, img); //将该帧图像写入视频
cvReleaseImage(&img); // 释放图像内存
}
cvReleaseVideoWriter(&writer); // 释放结构
cvDestroyWindow("mainWin"); // 销毁窗口