视频抽帧为图片和一系列图片转换为视频

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。
如图所示(我用的是同一路径)

视频抽帧为图片和一系列图片转换为视频_第1张图片

插曲:比如你需要(如果你不需要当然不需要安装)
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,如图所示:

视频抽帧为图片和一系列图片转换为视频_第2张图片

生成解决方案即可,不过需要生成Debug和Release两个版本。如果你人品很好,上面的都一切OK的话,接下来进行VS2008的配置:
首先,将CMake Source路径下文件中的modules下这些文件夹中(如下图所示)的\include\opencv2下的文件夹拷贝到CMake Build路径下文件中的\include\opencv2中。

视频抽帧为图片和一系列图片转换为视频_第3张图片

然后,将D:\OpenCV-2.3.0\bin\Debug和D:\OpenCV-2.3.0\bin\Release放入系统环境变量,配置VS2008的选项->项目和解决方案,如下图所示:

视频抽帧为图片和一系列图片转换为视频_第4张图片

将下面的加入包含文件中: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,superpack
其余在VS2008下配置如上,即(1)中方法。

2. 图片和视频相互转换
为了方便,我们使用自然数进行图片命名!

(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"); // 销毁窗口

3. 实验结果

视频抽帧为图片和一系列图片转换为视频_第5张图片


你可能感兴趣的:(CV)