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!

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

时间: 2024-10-10 04:51:33

EmguCV学习——视频与图片互转的相关文章

Duanxx的Opencv学习:将视频转换为图片

这里读取一个视频,然后将视频的每一帧都保存为png格式的图片, 本文的代码下载 这里首先要解决的问题是为图片按下标生成名字: 这个函数输入的是对视频中的图像帧的计数,输出的是文件的名字,以png格式保存 名字示例:f00005.png string nameGenerate(unsigned int frameCounter) { unsigned int num = num2str1(frameCounter).length();///<获得数字的位数 assert(num <= 5);//

陈松松:学习视频制作之前,新手经常有疑问的7个问题

这是我写的第77篇原创视频营销文章 陈松松,6年视频营销实战经验 大家一听到视频制作, 都感觉老难了,也不知道从哪里知道的,还是凭自己的感觉,欢迎留言! 其实视频制作真的特别简单, 哪怕你对电脑懂的不是很多,一样可以学会,在你学习之前不要特意的去躲避它,都能学会. 在你没有接触之前, 不要轻易下结论, 也不要凭自己的感觉说这个难,说那个难, 那样你会错过很多机会. 只有自己真正的使用了才最清楚. 今天跟一位朋友私聊, 聊着聊着就聊到了视频剪辑方面, 虽然只聊了几句, 但是一下子就显现出刚开始接触

iOS实现视频和图片的上传

关于iOS如何实现视频和图片的上传, 我们先理清下思路 思路: #1. 如何获取图片? #2. 如何获取视频? #3. 如何把图片存到缓存路径中? #4. 如何把视频存到缓存路径中? #5. 如何上传? 接下来, 我们按照上面的思路一步一步实现 首先我们新建一个类, 用来储存每一个要上传的文件uploadModel.h #import <Foundation/Foundation.h> @interface uploadModel : NSObject @property (nonatomic

XenApp/XenDesktop 7.11中对于视频、图片、文字的优化的说明

在桌面虚拟化这个技术门类中,市面上一共主流有以下几种协议: Citrix的ICA/HDX协议 Teradici公司的PCoIP(VMware Horzion中主要使用的协议之一) 微软公司的RDP RedHat公司的spice 以及近两年我们能接触到的 VMware公司的Blast(VMware在Horizion 6版本以后开始提供的协议,有逐步替代PCoIP的趋势) 华为的HDP 但是无论怎么墙头变换大王旗,Citrix的ICA/HDX协议可以说多年来一直都是行业最为优秀的企业级远程交付协议.

IOS 视频分解图片、图片合成视频

在IOS视频处理中,视频分解图片和图片合成视频是IOS视频处理中经常遇到的问题,这篇博客就这两个部分对IOS视频图像的相互转换做一下分析. (1)视频分解图片 这里视频分解图片使用的是AVAssetImageGenerator,利用这个class可以很方便的实现不同时间戳下,视频帧的抓取.注意一般这种视频分解图片帧的方法都是放在子线程中的,而UI更新操作都是放在主线程中的.下面来看看核心代码: _imageGenerator = [[AVAssetImageGenerator alloc] in

libgdx学习记录19——图片动态打包PixmapPacker

libgdx中,opengl 1.x要求图片长宽必须为2的整次幂,一般有如下解决方法 1. 将opengl 1.x改为opengl 2.0.(libgdx 1.0版本后不支持1.x,当然不存在这个问题,这里针对的是0.9.9版本) 2. 使用TexturePacker将图片打包好然后作成一张大图添加进来. 第二种方法是常用方法,但是不太灵活,添加.删除某些图片不太方便,改动较大.这里可以考虑使用PixmapPacker将图片进行动态打包. 主要方法: pack(String name, Pixm

收集一些深度学习视频

<机器学习&&深度学习> 视频课程资源百度云下载. 林轩田:机器学习基石 链接:http://pan.baidu.com/s/1qXSKZP64 密码:dwie 林轩田:機器學習技法 (Machine Learning Techniques)链接:http://pan.baidu.com/s/1i5I0kZj3 密码:zwce andrew Ng视频课程和讲义链接:http://pan.baidu.com/s/1nuT7hUT2 密码:8his hinton 深度学习视频课程链

支持向量机(SVM)相关免费学习视频集锦

http://www.matlabsky.com/thread-36823-1-1.html [其它] 支持向量机(SVM)相关免费学习视频集锦    [复制链接]     faruto 签到天数: 12 天 [LV.3]偶尔看看II 电梯直达 楼主  发表于 2013-7-28 12:08:46 | 只看该作者  <Learn SVM Step by Step>系列视频-应用篇:Libsvm的下载.安装和使用http://www.matlabsky.com/thread-18080-1-1.

libgdx学习记录23——图片移动选择

模拟移动选择图片,采用相机实现. 1 package com.fxb.newtest; 2 3 import com.badlogic.gdx.ApplicationAdapter; 4 import com.badlogic.gdx.Gdx; 5 import com.badlogic.gdx.graphics.Color; 6 import com.badlogic.gdx.graphics.GL10; 7 import com.badlogic.gdx.graphics.Texture;