EmguCV学习——视频与图片互转

其实视频转图片在上篇文章中已经有些眉目了,其实就是按帧读取视频,然后把帧保存就ok。然后自己再加个进度条美化一下。。。这代码简单易懂,还是直接上代码吧。

视频转图片

 1         /// <summary>
 2         /// 视频转换为图片
 3         /// </summary>
 4         /// <param name="path"></param>
 5         public void Video2Image(object path)
 6         {
 7             try
 8             {
 9                 //判断文件夹是否存在
10                 if (!Directory.Exists(filepath + filename + "\\"))
11                 {
12                     try
13                     {
14                         //不存在 创建文件夹
15                         Directory.CreateDirectory(filepath + filename + "\\");
16                     }
17                     catch { }
18                 }
19 
20                 IntPtr CatchFrame = CvInvoke.cvCreateFileCapture(path.ToString());
21                 // 得到总帧数
22                 var count = CvInvoke.cvGetCaptureProperty(CatchFrame, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_COUNT);
23                 // 视频宽度
24                 int wd = (int)CvInvoke.cvGetCaptureProperty(CatchFrame, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH);
25                 // 视频高度
26                 int hg = (int)CvInvoke.cvGetCaptureProperty(CatchFrame, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT);
27                 //// 当前帧位置
28                 //CvInvoke.cvGetCaptureProperty(CatchFrame, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_POS_FRAMES);
29                 //// 帧频
30                 //CvInvoke.cvGetCaptureProperty(CatchFrame, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FPS);
31 
32                 IntPtr FrameImg;
33                 int i = 0;
34                 
35                 IntPtr grayImg = CvInvoke.cvCreateImage(new Size(wd, hg), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
36                 while ((FrameImg = CvInvoke.cvQueryFrame(CatchFrame)) != IntPtr.Zero)
37                 {
38                     //此处我是转为灰度图,保存灰度图,小伙伴可以直接保存FrameImg
39                     CvInvoke.cvCvtColor(FrameImg, grayImg, Emgu.CV.CvEnum.COLOR_CONVERSION.BGR2GRAY);
40                    
41                     string picname = filepath + filename + "\\image" + (++i) + ".jpg";
42                     
43                     CvInvoke.cvSaveImage(picname, grayImg, IntPtr.Zero);
44 
45                 }
46                 
47             }
48             catch (Exception ex)
49             {
50                 MessageBox.Show(ex.ToString());
51             }
52 
53         }    

好吧,重要的是图片转视频,这里涉及到解码器。我需要转换的是mp4格式的视频,所以我选择的解码器为Xvid。

 1         /// <summary>
 2         /// 图片转换为视频
 3         /// </summary>
 4         public void Image2Video()
 5         {
 6             try
 7             {
 8                 var files = Directory.GetFiles(filepath, "*.jpg");
 9                 int count = files.Count();
10                 int isColor = 1;
11                 //帧频
12                 int fps = 5;
13                 int i = 0;
14                 string picname = files[0];
15                 Bitmap map = new Bitmap(picname);
16                 int frameW = map.Width;
17                 int frameH = map.Height;
18                 string videoname = filepath + "\\out.mp4";
19                 var writer = CvInvoke.cvCreateVideoWriter(videoname, CvInvoke.CV_FOURCC('X', 'V', 'I', 'D'), fps, new System.Drawing.Size(frameW, frameH), isColor);
20                 map.Dispose();
21                 CvInvoke.cvNamedWindow("mainWin");
22                 while (i < count)
23                 {
24                     picname = files[i];
25                     var img = CvInvoke.cvLoadImage(picname, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR);
26                     if (img == null)
27                     {
28                         CvInvoke.cvReleaseImage(ref img);
29                         continue;
30                     }
31                     CvInvoke.cvShowImage("mainWin", img);
32                     bool flag = CvInvoke.cvWriteFrame(writer, img);
33                     if (!flag)
34                     {
35                         CvInvoke.cvReleaseImage(ref img);
36                         continue;
37                     }
38                     CvInvoke.cvWaitKey(20);
39                     CvInvoke.cvReleaseImage(ref img);
40                     i++;
41                 }
42                 CvInvoke.cvReleaseVideoWriter(ref writer);
43                 CvInvoke.cvDestroyWindow("mainWin");
44             }
45             catch (Exception e)
46             {
47                 MessageBox.Show(e.ToString());
48             }
49         }            

That's all!

种一棵树最好的时间是十年前,其次是现在。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

Silverlight Telerik控件学习:TreeView数据绑定并初始化选中状态、PanelBar的Accordion效果、TabPanel、Frame基本使用

实际开发中控件的数据源肯定是动态绑定的,不可能在xaml里写死item项。既然要绑定,就先来几个实体类: ? 上面是类图,各类的代码如下:  Business...

2998
来自专栏游戏杂谈

CURLcode的定义

http://curl.haxx.se/libcurl/c/libcurl-errors.html

3492
来自专栏算法+

3D Lut 电影级调色算法 附完整C代码

长话短说,3d lut(全称 : 3D Lookup table )它是通过建立一个颜色映射表,对图像的色调进行重调的算法。

1K10
来自专栏菩提树下的杨过

PixelBender(着色器)初体验

只要是玩过photoshop的人,一定会对ps中的各式各样、功能强大的滤镜(filter)留下深刻的印象。 Adobe是靠图形处理软件起家的,这方面一直是它的强...

2906
来自专栏c#开发者

在DataGrid中选择,确认,删除多行复选框列表

在DataGrid中选择,确认,删除多行复选框列表 Selecting, Confirming & Deleting Mul...

3787
来自专栏PPV课数据科学社区

【学习】七天搞定SAS(三):基本模块调用

搞定基本的函数之后,开始鼓捣SAS里面的模型。也就是说,要开始写PROC了。说实话,越学SAS,越觉得SAS像Stata...无论是从输出的样式,还是语法。好不...

3325
来自专栏linux驱动个人学习

高通msm8909耳机调试

1、DTS相应修改: DTS相关代码:kernel/arch/arm/boot/dts/qcom/msm8909-qrd-skuc.dtsi: 1 s...

1.1K5
来自专栏WOLFRAM

by 落霜枫舞

1563
来自专栏GIS讲堂

Openlayers中热力图的实现

Heatmap 是用来呈现一定区域内的统计度量,最常见的网站访问热力图就是以特殊高亮的形式显示访客热衷的页面区域和访客所在的地理区域的图示。Heatmap.j...

5243
来自专栏向治洪

react-native城市列表组件

城市列表选择是很多app共有的功能,比如典型的美图app。那么对于React Native怎么实现呢? ? 要实现上面的效果,首先需要对界面的组成简单分析...

83610

扫码关注云+社区

领取腾讯云代金券