视频特效制作:如何给视频添加边框、水印、动画以及3D效果

ffmpeg生成裸眼3D、伪3D视频 2D视频转伪3D视频,可用平行眼直接观看 阅读详情

第一节:给视频添加边框

今天第一节先讲解如何为一个视频添加边框和动画,首先说明的是,这种边框和动画并不能直接修改视频的某一帧给他增加边框或者产生动画效果,这种动画更像是给视频的上面加一个calayer,然后控制这个layer产生动画效果。因为具体到某一帧的这种操作不是iphone应该做的他也做不到。

我们先来看一张图,了解一下给video增加动画的原理。

12.png

动画层的原理

你可以看到videoLayer这个东西,其实这个layer就是负责显示我们的视频,和他同级的是一个叫animationLayer的东西,我们能够掌控并且玩出花样的其实是这个叫animationLayer的东西,因为这个animationLayer可以由我们自己创建。

这里看一个图

VideoEditing.jpg

动画层的原理

这是原文中添加边框的效果。大家可以思考下原理是什么?

其实很简单,和我们videoLayer同级别的layer叫animationLayer(就是上图的background),他们共同有个父类叫做parentLayer,那么增加边框无非是把animationLayer这个layer找个边框的图片,然后把他放到videoLayer的下面,然后把videoLayer(crop也就是裁剪)的尺寸控制到刚好能显示animationLayer的四边,这样,不就成了带边框的效果么。

我找了一张带边框的图片。

54.jpg

带边框的图片

我们这时候创建一个CALayer,然后呢把这个layer的内容设置为图片内容。内容如下。

1
2
3
4
CALayer *backgroundLayer = [CALayer layer];
[backgroundLayer setContents:(id)[borderImage CGImage]];
backgroundLayer.frame = CGRectMake(0, 0, size.width, size.height);
[backgroundLayer setMasksToBounds:YES];

我们创建好了背景layer,那么需要创建videoLayer了,这时候设置calayer的frame需要注意,这时候你为了让videoLayer能够显示background layer的四边,所以需要这么设置。

1
2
3
  CALayer *videoLayer = [CALayer layer];
videoLayer.frame = CGRectMake(_widthBar.value, _widthBar.value,
                             size.width-(_widthBar.value*2), size.height-(_widthBar.value*2));

_widthBar.value就是我们边框的宽度,所以这句话的意思就是设置videoLayer的frame使其能够正确显示background layer的四边。

这时候,我们设置好了背景layer和videolayer那么怎么让系统知道,从而在编辑video的时候用到这些设置呢。需要使用这个方法。

1
2
3
4
  [parentLayer addSublayer:backgroundLayer];
    [parentLayer addSublayer:videoLayer];
   composition.animationTool = [AVVideoCompositionCoreAnimationTool
                            videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];

这里的composition就是AVMutableVideoComposition,如果不知道是什么东西,看上一篇blog。 这里主要是告诉系统我们的layer层是parentLayer,在parentLayer里负责video显示的使我们的videoLayer。

其实你看到这里可以打开demo,找到这个类,然后修改一下parentLayer添加backgroundLayer和videoLayer的顺序,看看是什么情况。或者自己找几张图片,创建几个layer,把calayer的内容设置为图片,然后加到parentLayer里,看看有什么变化,总之需要自己多尝试。

65.png

这种是怎么做的呢?

这种又是怎么做的呢?自己思考下。

第二节,如何给视频添加水印

其实看完第一部分,添加水印的步骤已经呼之欲出,无非就是把我们自己建的水印放在一个layer上,然后把这个layer添加到videolayer的上面不就行了么。代码如下,注意注释内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 1 - 这个layer就是用来显示水印的。
CATextLayer *subtitle1Text = [[CATextLayer alloc] init];
[subtitle1Text setFont:@ "Helvetica-Bold" ];
[subtitle1Text setFontSize:36];
[subtitle1Text setFrame:CGRectMake(0, 0, size.width, 100)];
[subtitle1Text setString:_subTitle1.text];
[subtitle1Text setAlignmentMode:kCAAlignmentCenter];
[subtitle1Text setForegroundColor:[[UIColor whiteColor] CGColor]];
// 2 - The usual overlay
CALayer *overlayLayer = [CALayer layer];
[overlayLayer addSublayer:subtitle1Text];
overlayLayer.frame = CGRectMake(0, 0, size.width, size.height);
[overlayLayer setMasksToBounds:YES];
CALayer *parentLayer = [CALayer layer];
CALayer *videoLayer = [CALayer layer];
parentLayer.frame = CGRectMake(0, 0, size.width, size.height);
videoLayer.frame = CGRectMake(0, 0, size.width, size.height);
// 这里看出区别了吧,我们把overlayLayer放在了videolayer的上面,所以水印总是显示在视频之上的。
[parentLayer addSublayer:videoLayer];
[parentLayer addSublayer:overlayLayer];
composition.animationTool = [AVVideoCompositionCoreAnimationTool
                              videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];

SubtitleImage.png

水印内容

第三节:如何给视频添加动画

原理不想赘述,一切花样都在我们自己创建的layer上,因为我们用的是layer,所以自然可以使用基于CoreAnimation的动画来使我们的layer动起来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// 1
UIImage *animationImage = [UIImage imageNamed:@ "star.png" ];;
CALayer *overlayLayer1 = [CALayer layer];
[overlayLayer1 setContents:(id)[animationImage CGImage]];
overlayLayer1.frame = CGRectMake(size.width/2-64, size.height/2 + 200, 128, 128);
[overlayLayer1 setMasksToBounds:YES];
CALayer *overlayLayer2 = [CALayer layer];
[overlayLayer2 setContents:(id)[animationImage CGImage]];
overlayLayer2.frame = CGRectMake(size.width/2-64, size.height/2 - 200, 128, 128);
[overlayLayer2 setMasksToBounds:YES];
// 2 - Rotate
if  (_animationSelectSegment.selectedSegmentIndex == 0) {
CABasicAnimation *animation =
[CABasicAnimation animationWithKeyPath:@ "transform.rotation" ];
animation.duration=2.0;
animation.repeatCount=5;
animation.autoreverses=YES;
// rotate from 0 to 360
animation.fromValue=[NSNumber numberWithFloat:0.0];
animation.toValue=[NSNumber numberWithFloat:(2.0 * M_PI)];
animation.beginTime = AVCoreAnimationBeginTimeAtZero;
[overlayLayer1 addAnimation:animation forKey:@ "rotation" ];
animation = [CABasicAnimation animationWithKeyPath:@ "transform.rotation" ];
animation.duration=2.0;
animation.repeatCount=5;
animation.autoreverses=YES;
// rotate from 0 to 360
animation.fromValue=[NSNumber numberWithFloat:0.0];
animation.toValue=[NSNumber numberWithFloat:(2.0 * M_PI)];
animation.beginTime = AVCoreAnimationBeginTimeAtZero;
[overlayLayer2 addAnimation:animation forKey:@ "rotation" ];
// 3 - Fade
}  else  if (_animationSelectSegment.selectedSegmentIndex == 1) {
CABasicAnimation *animation
=[CABasicAnimation animationWithKeyPath:@ "opacity" ];
animation.duration=3.0;
animation.repeatCount=5;
animation.autoreverses=YES;
// animate from fully visible to invisible
animation.fromValue=[NSNumber numberWithFloat:1.0];
animation.toValue=[NSNumber numberWithFloat:0.0];
animation.beginTime = AVCoreAnimationBeginTimeAtZero;
[overlayLayer1 addAnimation:animation forKey:@ "animateOpacity" ];
animation=[CABasicAnimation animationWithKeyPath:@ "opacity" ];
animation.duration=3.0;
animation.repeatCount=5;
animation.autoreverses=YES;
// animate from invisible to fully visible
animation.fromValue=[NSNumber numberWithFloat:1.0];
animation.toValue=[NSNumber numberWithFloat:0.0];
animation.beginTime = AVCoreAnimationBeginTimeAtZero;
[overlayLayer2 addAnimation:animation forKey:@ "animateOpacity" ];
   // 4 - Twinkle
}  else  if (_animationSelectSegment.selectedSegmentIndex == 2) {
CABasicAnimation *animation =
[CABasicAnimation animationWithKeyPath:@ "transform.scale" ];
animation.duration=0.5;
animation.repeatCount=10;
animation.autoreverses=YES;
// animate from half size to full size
animation.fromValue=[NSNumber numberWithFloat:0.5];
animation.toValue=[NSNumber numberWithFloat:1.0];
animation.beginTime = AVCoreAnimationBeginTimeAtZero;
[overlayLayer1 addAnimation:animation forKey:@ "scale" ];
animation = [CABasicAnimation animationWithKeyPath:@ "transform.scale" ];
animation.duration=1.0;
animation.repeatCount=5;
animation.autoreverses=YES;
// animate from half size to full size
animation.fromValue=[NSNumber numberWithFloat:0.5];
animation.toValue=[NSNumber numberWithFloat:1.0];
animation.beginTime = AVCoreAnimationBeginTimeAtZero;
[overlayLayer2 addAnimation:animation forKey:@ "scale" ];
}
// 5
CALayer *parentLayer = [CALayer layer];
CALayer *videoLayer = [CALayer layer];
parentLayer.frame = CGRectMake(0, 0, size.width, size.height);
videoLayer.frame = CGRectMake(0, 0, size.width, size.height);
[parentLayer addSublayer:videoLayer];
[parentLayer addSublayer:overlayLayer1];
[parentLayer addSublayer:overlayLayer2];
composition.animationTool = [AVVideoCompositionCoreAnimationTool
                            videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];
}

Animation.png

动画效果

第四节:如何给我们的视频layer做出3D效果

TiltImage.jpg

3D效果

上面的所有效果都是在我们的animatinLayer上做文章的,要知道videoLayer他本质上也是个CALayer,那么其实普通layer能做的事他也一样能做。代码如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 1 - Layer setup
CALayer *parentLayer = [CALayer layer];
CALayer *videoLayer = [CALayer layer];
parentLayer.frame = CGRectMake(0, 0, size.width, size.height);
videoLayer.frame = CGRectMake(0, 0, size.width, size.height);
[parentLayer addSublayer:videoLayer];
// 2 - Set up the transform
CATransform3D identityTransform = CATransform3DIdentity;
// 3 - 具体设置可以看demo
if  (_tiltSegment.selectedSegmentIndex == 0) {
     identityTransform.m34 = 1.0 / 1000;  // greater the denominator lesser will be the transformation
}  else  if  (_tiltSegment.selectedSegmentIndex == 1) {
     identityTransform.m34 = 1.0 / -1000;  // lesser the denominator lesser will be the transformation
}
// 4 - 给我们的video层做rotation
videoLayer.transform = CATransform3DRotate(identityTransform, M_PI/6.0, 1.0f, 0.0f, 0.0f);
// 5 - Composition
composition.animationTool = [AVVideoCompositionCoreAnimationTool
                              videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];

上面的代码很容易懂,就是给我们的video层做rotation,其实你可以改改demo里的数据,试试makescale,maketranslate之类的transform。

第五节:如何做出视频推进效果

具体内容看我的DEMO。

前4节DEMO地址:http://cdn2.raywenderlich.com/wp-content/uploads/2013/05/VideoEditing-Final2.zip

视频推进DEMO 地址:https://github.com/pingguo-zangqilong/VideoPushDemo

视频推进demo使用的时候直接点合成,不用选择视频。

FFmpeg字幕进阶:5分钟搞定ASS动态特效字幕(含代码示例) 本文详细介绍了如何使用FFmpeg和ASS格式创建动态特效字幕,包括基础参数设置、时间轴动画和高级视觉特效。通过代码示例,快速掌握文字渐隐、运动轨迹、3D旋转等专业技巧,提升视频制作质量。适合视频制作者、内容创作者和独立制片人使用。 阅读详情

相关推荐

剪映专业版教程:制作水晶立方体动画效果

本教程详解剪映专业版制作水晶立方体动画效果。核心操作:将5张9:16古风美女图裁剪为1:1比例,设背景填充-模糊;每张图设“立方体”组合动画时长2秒,复制替换片段完成图2至图5;添加“动感荧光”特效分别作用于单张图片(边框荧光流动)和轨道2全局(屏幕四周荧光流动);在每两张图交界处添加“花瓣环绕”特效时长1秒增强转场仪式感;叠加文字排版贴纸和水印文本;最后添加高清增强滤镜。该方法通过立方体动画与荧光特效配合实现水晶质感展示效果。

深耕计算机专业知识与技术。 500

Canvas使用

Canvas使用 canvas是一个可以使用脚本(通常为JavaScript)来绘制图形的 HTML 元素.例如,它可以用于绘制图表、制作图片构图或者制作简单的(以及不那么简单的)。像echarts、antv就是使用canvas来绘制图表的 标签 首先要有一个canvas标签存在于html中 <canvas id="charts" width="150" height="150">&l...

qq_42036203的博客 2872

stm32h743 FM25CL64铁电存储器踩坑记录

调试FRAM经验总结: 1、跑完FRAM读写代码之后,逻分仪发现总线上只有简单、短暂的电平变化,明显不是SPI的通信数据。 (经提醒发现连片选拉高拉低都没有执行到位) 后来发现是因为片选引脚没有初始化,所以直接拉高拉低是无效的。 2、引脚成功初始化后发现CLK、MISO、MOSI数据仍不正常。通过加打印的方式发现跑到HAL_SPI_Transmit中之后还没有执行到写SPI数据寄存器的那一步就return了。 后来经提醒发现: 上图中的指针使用方式错误 后来又发现: 打印出来发现

kuniqiw的博客 3844

如何给视频加边框

提取YUV数据ffmpeg -i input.mp4 -s 256x256 -pix_fmt yuv420p output_420.yuv 将亮度分量Y设置成255 int simplest_yuv420_border(char *url, int w, int h,int border,int num){ FILE *fp=fopen(ur...

weixin_34212189的博客 1066

MagicDraw-用例图

MagicDraw-用例图

木头征的博客 3129

SDI-12协议与STM32 进行uart通信

其中DIR_OUT_SDI是一个IO引脚,控制UART_TX_SDI是否使能,U10是三态门IC,即拉低DIR_OUT_SDI使能stm32输出,拉高DIR_OUT_SDI失能输出,串口配置8位数据位,偶校验,1位停止位,1200波特率。示波器测试得到传感器的应答信号如下:第一个是唤醒信号,拉高电平13毫秒,之后保持20毫秒低电平,第二个数据帧是激活信号,即ascii码: "0!",第三个是传感器的应答信号:"0\r\n"

weixin_42186805的博客 4401

ffmpeg给视频画边框

1、新建一个txt文件,并复制如下代码进入,然后保存。 @echo off & title cd /d %~dp0 for %%a in (*.mp4) do ( ffmpeg -i "%%~sa" -y -q:v 1 -vf drawbox=x=0:y=0:w=iw:h=ih:c=yellow:t=10 "out\%%~na.mp4" ) pause 2、把文件后缀修改为bat 。 3、把后缀为bat的文件放到要批量处理的视频文件夹里面。 4、在确保安装了ffmpe

mj412828668的博客 3903

实战解析:从Innovus到Calibre的LVS错误排查全流程

本文详细解析了从Innovus到Calibre的LVS错误排查全流程,涵盖物理验证关键步骤与工具链协同。通过实战案例分享,重点解决器件不匹配、连接性错误等常见问题,并提供GDS导出规范、网表修正策略等实用技巧,帮助工程师高效完成芯片设计物理验证。

9o8p7i6u5y的博客 1034

叶孤城大神之--视频特效制作:如何给视频添加边框、水印、动画以及3D效果

原文地址http://www.cocoachina.com/ios/20141208/10542.html

zhonggaorong的专栏 1137

ssd训练自己的数据集

基于SSD实现目标检测(训练自己的数据集)

reset2021的博客 6803

YOLOv8模型改进、剪枝、蒸馏和Web端界面的直观展示

模型蒸馏与性能提升 为了进一步优化YOLOv8模型,可以使用蒸馏技术将大型模型的知识转移到小型模型中。在模型蒸馏过程中,通过定义适当的损失函数和训练策略,学生网络可以学习教师网络的知识,并达到接近教师网络性能的效果。这样做不仅可以减少模型的存储和计算开销,还可以提高模型的推理速度和实时应用的响应能力。这样,用户可以直观地观察到模型的性能和应用的效果。为了优化YOLOv8模型并实现直观地观看检测效果或训练结果的全家通应用,本文将探讨如何通过改进、剪枝和蒸馏技术,并结合Web端界面来提升模型性能。

weixin_51988935的博客 2396

3d效果图制作傻瓜软件_3d短视频制作软件下载-3d短视频下载 v3.4 安卓版

3D短视频是一款专业制作视频的app,app里面有很多制作视频的模板,可以随意调节视频中物体的位置和属性,全新的VR视角让你的视频有一种不同的新颖感,分享到你的社交圈绝对引来一阵追捧。应用介绍3D视频制作是一款专业制作视频类的软件,主要特色是有大量炫酷的3D模板使得制作VR视角的视频变得简单而有个性。当然也支持图片模板制作视频,包含了大量的边框以及许多过渡动画使您任意搭配!更有功能强大的视频剪辑功...

weixin_39638105的博客 1251

3、全面掌握QGIS开发:从调试到应用的全方位指南

本文全面介绍了QGIS开发的各个环节,涵盖插件调试、PyQGIS API导航、插件创建与分发、独立地理空间应用开发,以及全局和项目级首选项的管理。通过详细的步骤说明、代码示例和流程图,帮助开发者系统掌握QGIS扩展与集成的核心技能,并展望了未来在功能拓展、跨平台兼容性和技术融合方面的可能性。

hill8的博客 89

前端里的button怎么去除点击自带边框_这款系统自带的视频剪辑软件,了解一下...

接触该软件之前听说过有一款Movie Maker剪辑软件就是系统自带的,不过微软已经停止更新该软件了。在新的Windows系统中(Win10)出现了新的视频剪辑软件Video Maker(视频编辑器),应该是Movie Maker的升级版,接下来咱就把软件拉出来遛遛看看是骡子是马。软件在哪里?如果你是Win7系统,你可以试着在【开始菜单】中搜索“Movie Maker”,如果搜索不到结果,那么很遗...

weixin_39954487的博客 154

Redhawk:如何gds2def?

使用redhawk gds2def功能 这其中gds_layer.map的书写方式如下: m代表metal,v代表via。 ICC/ICC2用户可以从tech file中获取layer number。 innovus用户可以从stream out layer map中获取layer number。 最后运行gds2def -m gds2def.config即可。 ...

m0_61544122的博客 5340

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

图片去字工具_【短视频】制作剪辑必备的24款工具

本文为你介绍:短视频制作工具、短视频剪辑工具、短视频制图工具等内容。短视频制作工具昨天朋友圈看到朋友发了这样一段话:俗话说,工欲善其事,必先利其器。01视频制作、剪辑APP1.剪映APP“剪映-轻而易剪”是由深圳市脸萌科技有限公司开发的,号称“抖音官方剪辑神器”;短视频制作剪辑剪映的底部基础功能和快影类似,都是剪辑、音频、贴纸、滤镜、特效、比例等,剪映导出的视频没有水印,但分享的路径非常...

weixin_39794347的博客 822

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

3种超火电影级PPT开场,跟着学,5分钟搞定高级感!

别再费劲琢磨PPT开场了!收下这3份“保姆级”配方,你只需要复制步骤,就能做出让同事眼前一亮的高级感开场。

2401_83179994的博客 1885

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

开发轻量级本地软件实现证件照尺寸调整/AI换底色/GIF生成/水印边框/套lut滤镜

PhotoMasterPro是一款桌面端轻量化影像处理工具,集成了证件照生成、色彩管理、GIF转换、水印添加等核心功能。软件采用模块化解耦架构,实现UI与引擎分离,支持多线程任务处理。关键技术包括"零拷贝"高性能渲染方案、异步防抖优化和50层撤销栈内存管理。其智能证件照模块支持多规格适配和AI智能换底,3DLUT滤镜引擎实现专业级色彩映射。软件提供两种分发方案:PyInstaller目录对齐打包法和Nuitka C++编译法,确保跨平台兼容性。

Chansrgj的博客 852

FFmpeg命令行滤镜使用

对视频的滤镜处理还是很有吸引力的,因为可以做出各种比较炫酷的视频效果。这篇学习使用FFmpeg命令行来简单的操作制作视频的滤镜效果。 Filter Filter的参数排列格式为: [输入流或标记名]滤镜参数[临时标记];[输入流或标记名]滤镜参数[临时标记名] 看一个命令行示例: ffmpeg -i input.mp4 -i logo.png -filter_complex "[...

LymanYe的博客 6252

ProCCD:复古CCD相机应用,重现经典胶片感

U300:清冷的蓝绿色调赋予照片文艺的日系电影氛围感,适合风景拍摄。- IXUS95:有着暖黄色调和独特颗粒质感,复古胶片感十足,是街拍首选。- Z30:色彩浓郁,能忠实呈现色调和细节,适用各种拍照场景。- M532:褪色和低饱和度赋予照片怀旧感;肤色表现佳,适合人物写真。

2501_90259289的博客 1680
上一篇: 最美程序媛!
下一篇: 数学之美~(01)最伟大的数学公式!
Footloose_
博客等级 码龄10年 254粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值