你知道微视背后的视频特效技术是怎样做出来的吗?-程序员宅基地

技术标签: 人工智能  

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由腾讯视频云终端团队发表于云+社区专栏

常青, 2008 年毕业加入腾讯,一直从事客户端研发相关工作,先后参与过 PC QQ、手机QQ、QQ物联 等产品项目,目前在腾讯视频云团队负责音视频终端解决方案的优化和落地工作,帮助客户在可控的研发成本投入之下,获得业内一流的音视频解决方案,目前我们的产品线包括:互动直播、点播、短视频、实时视频通话,图像处理,AI 等等。

从眼睛的进化说起

大约在5亿4千万年前的寒武纪,地球上一部分生物体开始进化出了感光细胞,这种细胞可以感应光线的强弱,并且直接驱动本体的运动细胞采取必要的规避动作,以确保脆弱的细胞不被紫外线所伤。

后来单个的感光细胞开始扎堆聚集并且形成了凹陷,随着凹陷程度的逐步加深,这些感光细胞也就渐渐地汇聚成了一个前部有孔隙的球状结构,“眼球”的雏形也就由此形成了。

img

随着球形的眼睛结构渐渐成型,中学物理课本中的“小孔成像”原理也就越来越能发挥作用:只要开孔足够小,光线就能准确地到达这些聚集的感光细胞进而成像,眼前的物体也就开始变得边界清晰。代表腾讯文化吉祥物之一的鹦鹉螺,就是采用了这种“以小为美”的进化策略,而且一直坚持到现在。

但是这种越来越小的策略也会导致光线进入量越来越小,所以鹦鹉螺们的世界想必是很昏暗的。我们的祖先可不希望放弃一个光明的世界,所以,我们给自己的眼睛安装了一个足够高级的光学部件 —— 晶状体,以期拥有一个光明而清晰地世界。

然而,当大家都能把世界看得很清楚的时候,色彩分辨能力也就演变成了新一轮的军备竞赛。

当我们的祖先踩着那些坚称“我就想健健康康地当个素食主义者”的同类尸体艰难前行的时候,他们并不知道,让自己活得更久的原因,竟然是因为那双能区分树叶是嫩叶还是成熟叶片的眼睛。因为成熟的叶片常常包含大量的植物性毒素,会让进食者身体遭受很大的伤害。所以,我们都是那一波“好色的”猴子的后代。

而眼睛对色彩的分辨能力,不仅在远古时代让我们活了下来,也让今天衣食无忧的我们,能看到更多色彩斑斓的效果。比如短视频的移形换影特效,其本质原理就是一个充分利用色彩的小把戏。

视频内容

三原色的修改和组合

人体有三种视觉锥细胞,所以我们看到的颜色都是由三原色组成的,并不是说世界上就只有这些颜色,而是更加绚丽的色彩空间我们也感知不到。

因此,液晶显示器的成像原理上也就是基于 R(红)G(绿)B(蓝) 三原色的组合而实现的,腾讯云短视频(UGSV)的移形换影特效,就是在这三种颜色空间上做了一些文章:

先以一幅静态的图片来举例:

imgDoloris

现在把图片中红色的分量去掉,放大10%,再移动一些距离

imgDoloris-strip-red

再把蓝色的分量去掉,放大10%,并移动一些距离

imgDoloris-strip-blue

再把绿色的分量去掉,放大10%,并移动一些距离

imgDoloris-strip-green

然后将这三副图片以33%的透明度和源图叠加到一起,形成一种移形幻影的效果

imgDoloris-blend

交给计算机来实现

上面这些图片是我用图片处理软件简单处理后得到的,但如果是视频文件,显然要交给计算机自动解决,如何做到呢?

首先我们先给这幅图片定义坐标,为了方便处理我们将图片的中心点定义为 (0,0),图片的XY轴最大值为 1,如下图所示:

img坐标定义

然后开始处理上面提到的两个变换,一个是放大,一个是移动。

  • 放大 如果定义图片上的任意象素坐标是(x,y),放大 s倍后的坐标就是 (x',y') = s(x,y) = (sx, sy)
  • 移动 如果定义图片上的任意象素坐标是(x,y),将其移动(?x,?y),移动后的坐标就是(x',y') = (x+?x, y+?y)
  • 合并 将上面两个公式进行合并,得到的新坐标点就是 (x',y') = (s(x+?x), s(y+?y))
  • 叠加 然后我们要将修改过的图片叠加到原图上,alpha叠加的公式是 src * (1 - alpha) + overlay * alpha

基于OpenGL的版本

短视频的特效处理,每秒钟要处理几十张甚至更多的视频画面,所以简单的 C 语言处理算法并不能满足性能上的要求,我们需要使用手机的硬件加速能力,目前除了常见的 OpenGL 等 API 之外,还有如 Vulkan, DirectX, Metal 等可选方案。就目前而言,OpenGL 在各平台上通用性最好,网上的资料也比较丰富,不论是桌面平台还是移动平台都有支持,本文就以 OpenGL 来讲讲特效的实现。

实现移形换影特效的时候,我们会用到 OpenGL 的 Fragment Shader, Fragment Shader 作用就是返回图像各点的色值,Fragment Shader也有一套自己的编程语言,叫 Shading Language 简称GLSL, GLSL 和 C 很像,增加了一些向量的数据类型,和一些图像相关的处理函数。Shading 和 C 比起来有一个比较特殊的地方是不支持隐含的类型转换,比如浮点点整型的转换(在使用浮点数时,一定要加上小数点,如 1.0)。

篇幅原因,我不在这里把所有的特效代码都一一列举了,仅附上放大和位移的部分实现:

varying vec2 textureCoordinate;
uniform sampler2D inputImageTexture;

void main() {
    vec2 offset = vec2(0.05, 0.05);
    float scale = 1.1;
    vec2 coordinate;
    coordinate.x = (textureCoordinate.x - offset.x) / scale;
    coordinate.y = (textureCoordinate.y - offset.y) / scale;
    gl_FragColor = texture2D(inputImageTexture, coordinate);
}

考虑到不是所有读者都学过 Shading Language,这里做一个简单的解读:

  • 我们在这里定义了一个变量 coordinate,这个就是前面提到的(x,y),它的值就是 ((x - ?x)/s, (y-?y)/s)
  • 函数 texture2D 的作用就是从图片中获取某个坐标的颜色。这里从 inputImageTexture 中的 coodinate 坐标点获取了颜色。
  • gl_FragColor, 这是 Fragment Shader 的输出的值, gl_FragColor是一个GLSL预定义的全局变量, 类型是vec4既 (r,g,b,a) 这四个量,也就是一个 RGBA 颜色。
  • 程序运行后在textureCoordinate这个坐标就会显示gl_FragColor这个颜色。

上面讲了单幅图的处理,对于视频我们可以做些更有意思的效果,比如我们可以把当前帧和上一帧的图片进行叠加,这样就可以作出一些更有意思的效果。

img

更多特效

本文介绍了腾讯云短视频(UGSV)众多视频特效中的一种,如果要实现更加复杂的特效,还是需要继续深入研究 OpenGL 和人脸识别等相关领域的知识,这需要一段时间的学习和努力,也不可避免的需要踩很多坑。

那有没有只需几分钟,就能一马平川地搭快速搭建建带有各种神奇特效的短视频应用速成方案呢?

此文已由作者授权腾讯云+社区发布,更多原文请点击

问答
文字识别在格式上有什么要求?
相关阅读
教你1天搭建自己的“微视”
教你从0到1搭建小程序音视频
教你快速搭建一场发布会直播方案
云学院 · 课程推荐 | 知乎KOL,与你分享机器学习中如何做选择

搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

海量技术实践经验,尽在云加社区

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33725515/article/details/86012017

智能推荐

fluent里常见基础问题(转)_fluent不同算法对结果影响-程序员宅基地

文章浏览阅读8.4k次,点赞9次,收藏104次。1 什么叫松弛因子?松弛因子对计算结果有什么样的影响?它对计算的收敛情况又有什么样的影响?  1、亚松驰(Under Relaxation):所谓亚松驰就是将本层次计算结果与上一层次结果的差值作适当缩减,以避免由于差值过大而引起非线性迭代过程的发散。用通用变量来写出时,为松驰因子(Relaxation Factors)。《数值传热学-214》  2、FLUENT中的亚松驰:由于FLUENT所解..._fluent不同算法对结果影响

Application Loader上传中断,提示Cannot proceed with delivery: an existing transporter instance is currently_error: cannot proceed with delivery: an existing t-程序员宅基地

文章浏览阅读1k次。把Application Loader(XCode->Organizer->Archived Applications->Submit)中正在上传的文件中断或者删除,再次Submit提示:Cannot proceed with delivery: an existing transporter instance is currently uploading this package。无论如_error: cannot proceed with delivery: an existing transporter instance is cur

typescript的基本结构_Vue3.0 前的 TypeScript 最佳入门实践-程序员宅基地

文章浏览阅读111次。Vue3.0 前的 TypeScript 最佳入门实践前言其实Vue官方从2.6.X版本开始就部分使用Ts重写了。我个人对更严格类型限制没有积极的看法,毕竟各类转类型的骚写法写习惯了。然鹅最近的一个项目中,是TypeScript+ Vue,毛计喇,学之...…真香!注意此篇标题的“前”,本文旨在讲Ts混入框架的使用,不讲Class API1. 使用官方脚手架构建npm install -g @vu..._vue3.0 typescript目录结构

Science Advances: 中科院微生物所叶健团队揭示双生病毒调控植物免疫平衡制约机制...-程序员宅基地

文章浏览阅读601次。病毒,作为非细胞的生物形式,只能在活细胞内增殖,专性活细胞内寄生。我们居住的星球病毒数量惊人,大约有1031个,其基因头尾相连可长达2.5亿光年。现代微生物学的奠基人路易斯巴斯德用病毒(..._editor daniel j kliebenstein

Java导出Word文档(可设置字体)_java list数据生成word自定义字体大小和字体颜色-程序员宅基地

文章浏览阅读7.5k次。原作者:兰博基尼http://hujinfan.iteye.com/blog/847029导出内容导Word文档中,可设置字体,亲测可用。importjava.io.FileOutputStream;import java.io.IOException;import java.util.List;importcom.lowagie.text.Document;impo_java list数据生成word自定义字体大小和字体颜色

X1 grok-1 开源大语言模型下载_grok-1下载-程序员宅基地

文章浏览阅读795次,点赞11次,收藏4次。我们正在发布我们的大型语言模型 Grok-1 的基本模型权重和网络架构。Grok-1 是一个 3140 亿参数的专家混合模型,由 xAI 从头开始训练。_grok-1下载

随便推点

Notepad++配置C语言编译环境-程序员宅基地

文章浏览阅读4k次,点赞5次,收藏12次。今天和大家分享一个使用Notepad++配置C语言编译环境的方法,因为本人是一个C语言新手,一般写个小程序用文本编辑器就够用。前提: 下载mingw 或者 Cygwin 或 tdm-gcc 里面有C语言编译器,然后配置环境变量。 https://sourceforge.net/projects/mingw-w64/files/?source=navbar首先: ...

excel文件可以直接转换成图片格式吗?excel文件怎样才能快速转换成图片?excel文件快速转换成图片的方法_excel图片地址转图片-程序员宅基地

文章浏览阅读836次,点赞24次,收藏17次。本文介绍了将Excel文件转换成图片格式的五种方法,包括使用汇帮PDF转换器、Excel内置功能、屏幕截图工具、复制粘贴和另存为图片。转换前需备份文件,选择合适的图片格式和分辨率,注意第三方软件的安全性。转换后便于在不同设备和平台上查看和分享Excel数据_excel图片地址转图片

Linux使用cups进行打印_cups/cups.h-程序员宅基地

文章浏览阅读2.2k次。复制的代码,还没有试过。#include <cups/cups.h>//...int print_label( const char *text, const char *printer_name, const char *job_name ){ int jobId = 0;jobId = cupsCreateJob( CUPS_HTTP_DEFAULT,..._cups/cups.h

在腾讯云上创建您的SQL Cluster(1)_腾讯云 搭建sql集群-程序员宅基地

文章浏览阅读431次。在国内公有云厂商上搭建一套SQL Cluster的难度相信做Windows的童鞋都会很清楚,并非它的搭建有多少难度,只是很多细节需要注意。腾讯云,QCloud,为什么选择QCloud来做这个实验,除了QCloud是我的东家(这里我没收任何广告费啊),其实QCloud对Windows原生态保留得最好,所以很多种Windows实验(解决方案)在QCloud都是支持的。所以,今天我就来讲_腾讯云 搭建sql集群

[论文]CVPR2019论文GIoU解读_giou论文-程序员宅基地

文章浏览阅读3.6k次,点赞2次,收藏15次。本文是对 CVPR2019 论文《Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression》的解读: 论文地址:https://arxiv.org/abs/1902.096301.Motivation 包围框回归是2D/3D 视觉任务中一个最基础的模块,不管..._giou论文

相对熵/KL散度(Kullback–Leibler divergence,KLD)-程序员宅基地

文章浏览阅读819次。相对熵(relative entropy)又称为KL散度(Kullback–Leibler divergence,简称KLD),信息散度(information divergence),信息增益(information gain)。 KL散度是两个概率分布P和Q差别的非对称性的度量。 KL散度是用来度量使用基于Q的编码来编码来自P的样本平均所需的额外的比特个数。 典型情况..._kull-back entropy

推荐文章

热门文章

相关标签