EmguCV学习——视频与图片互转
其实视频转图片在上篇文章中已经有些眉目了,其实就是按帧读取视频,然后把帧保存就ok。然后自己再加个进度条美化一下。。。这代码简单易懂,还是直接上代码吧。
视频转图片
/// <summary>
/// 视频转换为图片
/// </summary>
/// <param name="path"></param>
public void Video2Image(object path)
{
try
{
//判断文件夹是否存在
if (!Directory.Exists(filepath + filename + "\\"))
{
try
{
//不存在 创建文件夹
Directory.CreateDirectory(filepath + filename + "\\");
}
catch { }
} IntPtr CatchFrame = CvInvoke.cvCreateFileCapture(path.ToString());
// 得到总帧数
var count = CvInvoke.cvGetCaptureProperty(CatchFrame, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_COUNT);
// 视频宽度
int wd = (int)CvInvoke.cvGetCaptureProperty(CatchFrame, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH);
// 视频高度
int hg = (int)CvInvoke.cvGetCaptureProperty(CatchFrame, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT);
//// 当前帧位置
//CvInvoke.cvGetCaptureProperty(CatchFrame, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_POS_FRAMES);
//// 帧频
//CvInvoke.cvGetCaptureProperty(CatchFrame, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FPS); IntPtr FrameImg;
int i = ; IntPtr grayImg = CvInvoke.cvCreateImage(new Size(wd, hg), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, );
while ((FrameImg = CvInvoke.cvQueryFrame(CatchFrame)) != IntPtr.Zero)
{
//此处我是转为灰度图,保存灰度图,小伙伴可以直接保存FrameImg
CvInvoke.cvCvtColor(FrameImg, grayImg, Emgu.CV.CvEnum.COLOR_CONVERSION.BGR2GRAY); string picname = filepath + filename + "\\image" + (++i) + ".jpg"; CvInvoke.cvSaveImage(picname, grayImg, IntPtr.Zero); } }
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
} }
好吧,重要的是图片转视频,这里涉及到解码器。我需要转换的是mp4格式的视频,所以我选择的解码器为Xvid。
/// <summary>
/// 图片转换为视频
/// </summary>
public void Image2Video()
{
try
{
var files = Directory.GetFiles(filepath, "*.jpg");
int count = files.Count();
int isColor = ;
//帧频
int fps = ;
int i = ;
string picname = files[];
Bitmap map = new Bitmap(picname);
int frameW = map.Width;
int frameH = map.Height;
string videoname = filepath + "\\out.mp4";
var writer = CvInvoke.cvCreateVideoWriter(videoname, CvInvoke.CV_FOURCC('X', 'V', 'I', 'D'), fps, new System.Drawing.Size(frameW, frameH), isColor);
map.Dispose();
CvInvoke.cvNamedWindow("mainWin");
while (i < count)
{
picname = files[i];
var img = CvInvoke.cvLoadImage(picname, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR);
if (img == null)
{
CvInvoke.cvReleaseImage(ref img);
continue;
}
CvInvoke.cvShowImage("mainWin", img);
bool flag = CvInvoke.cvWriteFrame(writer, img);
if (!flag)
{
CvInvoke.cvReleaseImage(ref img);
continue;
}
CvInvoke.cvWaitKey();
CvInvoke.cvReleaseImage(ref img);
i++;
}
CvInvoke.cvReleaseVideoWriter(ref writer);
CvInvoke.cvDestroyWindow("mainWin");
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
That's all!
种一棵树最好的时间是十年前,其次是现在。
EmguCV学习——视频与图片互转的更多相关文章
- EmguCV学习——简单使用
关于EmguCV我就不多说了,是对应于OpenCV的一套net库. 公司是视觉方面的业务,我又不会c++(好想会啊,正在学习中).由于各种需求,自己觉得对c++不是特别感冒,所以选用了net下的ope ...
- <a href='javacript:' title='{$str}'>是什么意思(多看学习视频)
<a href='javacript:' title='{$str}'>是什么意思(多看学习视频) 一.总结 一句话总结: 1.javascript:是什么? 伪协议,后面接javascr ...
- 支持向量机(SVM)相关免费学习视频集锦
http://www.matlabsky.com/thread-36823-1-1.html [其它] 支持向量机(SVM)相关免费学习视频集锦 [复制链接] faruto 签到天数: ...
- 学习视频更新管理,对于前面数据库视频资料,以及.net资料失效感到抱歉
首先,对不起,各位网友,我知道也都是好学的的人才会来查找视频,抱歉视频失效了.以后有需要的可以常联系我,有错误定当及时改正.如有延误多多包含. 上一次发的.net学习视频失效了,我决定帮大家多找一些学 ...
- 仿照微信的效果,实现了一个支持多选、选原图和视频的图片选择器,适配了iOS6-9系统,3行代码即可集成.
提示:如果你发现了Bug,请尝试更新到最新版.目前最新版是1.6.4,此前的版本或多或少存在一些bug的~如果你已经是最新版了,请留一条评论,我看到了会尽快处理和修复哈~ 关于升级iOS10和Xcdo ...
- Orchard中文学习视频录制完成
Orchard学习视频已登录百度传课: http://www.chuanke.com/3027295-124882.html http://pan.baidu.com/s/13zc0u 1.orcha ...
- IOS 视频分解图片、图片合成视频
在IOS视频处理中,视频分解图片和图片合成视频是IOS视频处理中经常遇到的问题,这篇博客就这两个部分对IOS视频图像的相互转换做一下分析. (1)视频分解图片 这里视频分解图片使用的是AVAssetI ...
- Gruntjs构工具学习视频
在这里推荐一个Gruntjs的学习视频,非常不错! http://www.imooc.com/learn/30
- [置顶] iOS学习笔记47——图片异步加载之EGOImageLoading
上次在<iOS学习笔记46——图片异步加载之SDWebImage>中介绍过一个开源的图片异步加载库,今天来介绍另外一个功能类似的EGOImageLoading,看名字知道,之前的一篇学习笔 ...
随机推荐
- JS练习:商品的左右选择
代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...
- DSP28035的编程初步--GPIO操作
明白DSP编程的基本流程,熟悉DSP28035的GPIO的使用.代码执行流程:首先是系统时钟的选择.其次是PIE中断向量表的初始化.一些外设的初始化操作While(){}根据EXPERIMENTER’ ...
- 7 numpy 傅里叶,提取图片轮廓
任务:提取照片中轮廓 本次处理图片:我的女神之一 江一燕 导入模块: #jyy.show() 会打开本地图片浏览器 使用傅里叶反转 获取实部,舍弃虚部 去除小数部分 将一维数 ...
- Marshal.ReleaseComObject() vs. Marshal.FinalReleaseComObject()
很简单,不翻译了. If you are using COM components on your .NET code, you might be already aware of the Marsh ...
- ansible common modules
##Some common modules[cloud modules] [clustering modules] [command modules]command - executes a comm ...
- assertion: 18 { code: 18, ok: 0.0, errmsg: "auth fails" }
MongoDB Version: 2.4.7 Mongodump: $ bin/mongodump -u admin -p admin -d test -o ./tmp/ connected to: ...
- BZOJ——T 1801: [Ahoi2009]chess 中国象棋
http://www.lydsy.com/JudgeOnline/problem.php?id=1801 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: ...
- 装饰器 转载自 http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html
今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...
- HDU 4534
AC自动机+状态DP. 虽然很明显的AC自动机+状态DP题,但要分析问题上还是欠缺一点了.一直在犹豫枚举每一个字符选或不选的状态会不会超时,以为会达到状态有2^n,但其实根本没有.因为有很多状态是可以 ...
- mvn 仓库
http://mvnrepository.com/artifact/org.postgresql/postgresql/9.3-1103-jdbc41 ------------------------ ...