Threejs实现数字人绿幕视频背景透明播放,Shader绿幕视频抠像

这篇具有很好参考价值的文章主要介绍了Threejs实现数字人绿幕视频背景透明播放,Shader绿幕视频抠像。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人主页: 左本Web3D,更多案例预览请点击==》 在线案例
个人简介:专注Web3D使用ThreeJS实现3D效果技巧和学习案例
💕 💕积跬步以至千里,致敬每个爱学习的你。喜欢的话请三连,有问题请私信或者加微信

        在数字人应用中,绿幕技术是一种常见的技术,也是实现数字人绿幕视频背景透明播放的基础。所谓绿幕,就是在录制数字人视频时,用绿色背景替代实景背景,并在后期制作中将这个绿色背景抠掉,留下数字人在实景背景下的视频,实现数字人的半透明化,或者将数字人放到任意背景中,从而实现很多炫酷的视觉效果。

Threejs实现数字人绿幕视频背景透明播放,Shader绿幕视频抠像,音视频,three.js,web3
加入场景后
Threejs实现数字人绿幕视频背景透明播放,Shader绿幕视频抠像,音视频,three.js,web3
原视频

        

        绿幕视频背景抠像的过程,需要使用专门的图像处理算法,根据指定的颜色值(例如绿色),从整个视频流中抠掉这个颜色值的像素,留下其他颜色的像素。在Three.js中,我们可以使用Shader来实现绿幕视频背景抠像。

下面的代码为实现绿幕视频抠像的Shader代码,包含顶点着色器和片元着色器两部分。

顶点着色器代码(id为“vertexShader”)处理顶点信息,将3D坐标从模型空间转换到裁剪空间,通过gl_Position设置输出的坐标。

片元着色器代码(id为“fragmentShader”)则是从videoTexture纹理中取出像素颜色,并将其转换为灰度值,接着计算绿色屏幕的值(通过绿色通道值减去红色和蓝色通道的值得到),然后根据指定的阈值进行抠像处理,将背景颜色设为透明。

其中,uniform keyword用来声明从CPU将数据传送到GPU的值,其中videoTexture是绿幕视频的纹理,在GPU和CPU之间传输数据,threshold是指定的阈值,用于调整抠像的精度和背景的透明度,其值越大,抠除的颜色范围也越大,画面中被抠掉的颜色更多,生成的抠像效果可能不太好;其值越小,抠掉的颜色范围更小,生成的抠像效果更加精细,但可能会留下一些边缘颜色。

最后,gl_FragColor输出转换后的颜色值和alpha值,其中alpha值表示背景透明度,用于实现从实景背景到数字人绿幕视频的渐变效果。

<script type="x-shader/x-vertex" id="vertexShader">
	varying vec2 vUv;
	void main() {
		vUv = uv;
		gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
	}
</script>

<script type="x-shader/x-fragment" id="fragmentShader">
	uniform sampler2D videoTexture;
	uniform float threshold;
	varying vec2 vUv;
	void main() {
		vec4 color = texture2D(videoTexture, vUv);
		float greenScreen = color.g - max(color.r, color.b);
		float alpha = 1.0 - smoothstep(threshold - 0.05, threshold + 0.05, greenScreen);
		gl_FragColor = vec4(color.rgb, alpha);
	}
</script>

在Three.js中使用上面Shader代码实现绿幕视频抠像。首先,我们需要创建一个PlaneGeometry(平面几何体)作为显示绿幕视频的载体。平面大小根据视频比例设置,接下来,我们创建一个ShaderMaterial(Shader材质),并为其设置一些属性,如uniforms、vertexShader、fragmentShader等。uniforms是一个结构体,用于存储需要在Shader中使用的uniform变量。这里,我们将绿幕视频纹理设置为videoTexture,并将其值设置为通过HTML5 video元素创建的THREE.VideoTexture对象。threshold变量用于指定阈值,其值为0.05。vertexShader和fragmentShader分别表示顶点着色器和片元着色器的代码。我们通过document.getElementById获取到对应的HTML元素,然后将其textContent作为着色器代码传递给ShaderMaterial。side属性用于决定平面几何体的哪一面显示,这里设置为THREE.DoubleSide表示两面都显示。transparent属性用于启用透明度,因为数字人绿幕视频要与场景进行融合,需要将背景设置为透明。最后,我们创建一个Mesh(网格)对象,并将PlaneGeometry和ShaderMaterial作为其参数传递进去,然后将其添加到场景中。这样,绿幕视频就会在场景中显示,并通过Shader实现抠像处理使其背景透明进行播放。

const video_content = document.getElementById("video_content");

var geometry = new THREE.PlaneGeometry(0.5625, 1);
var material = new THREE.ShaderMaterial({
    uniforms: {
        'videoTexture': {
            value: new THREE.VideoTexture(video_content)
        },
        threshold: {
            value: 0.05
        },
    },
    vertexShader: document.getElementById('vertexShader').textContent,
    fragmentShader: document.getElementById('fragmentShader').textContent,
    side: THREE.DoubleSide,
    transparent: true
});

var mesh = new THREE.Mesh(geometry, shaderMaterial);
scene.add(mesh);文章来源地址https://www.toymoban.com/news/detail-685786.html

到了这里,关于Threejs实现数字人绿幕视频背景透明播放,Shader绿幕视频抠像的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用ffmpeg制作透明背景的视频

      最近我们尝试在网页上叠加数字人讲解的功能,发现如果直接在网页上放一个矩形的数字人视频,效果会很差,首先是会遮挡很多画面的内容,其次就是不管使用任何任务背景,画面都和后面的网页不是很协调,如图所示:   如果能去掉视频的背景,只展示人物效果就

    2024年02月05日
    浏览(49)
  • threeJs实现3D地球-旋转-自定义贴图-透明发光

    //---html (angular)---         //---ts--- 效果图:

    2024年04月17日
    浏览(41)
  • 在Unity中使用FFmpeg将视频绿色背景处理为透明背景

    官方下载地址:Download FFmpeg  这里演示windows版的下载 建议下载shared压缩包   找到bin目录,复制路径   设置环境变量: 状态栏左下角,右键开始菜单:系统——高级系统设置——环境变量——path——编辑  然后选择新建,粘贴刚刚复制的bin目录路径,点击保存即可; 然后

    2024年01月18日
    浏览(50)
  • 【unity】在unity中播放透明视频

    1、首先需要下载一个播放视频的插件【AVProVideo】 下载地址: 链接:https://pan.baidu.com/s/1EZW3rUqbuHtzL71jUC_fzg?pwd=0mkn  提取码:0mkn  2、导入unity中后会有3个文件 注:StreamingAssets是推荐存放视频的文件 3、准备透明视频 在AVProVideo播放的透明视频需要是一个左右镜像的视频,左边为

    2024年02月15日
    浏览(39)
  • 想要透明拼接屏展现更加效果,视频源是技术活,尤其作为直播背景

    随着科技的飞速发展,视频制作和显示技术也在不断进步。透明拼接屏视频作为一种新型的视频形式,在许多场合都得到了广泛的应用。尼伽小编将深入探讨透明拼接屏视频的制作过程、要求、清晰度,以及目前常作为直播背景的优势。 一、透明拼接屏视频的制作 透明拼接

    2024年01月25日
    浏览(50)
  • threejs 透明贴图,模型透明,白边

    使用Threejs加载模型时,模型出现了上面的问题。模型边缘部分白边,或者模型出现透明问题。 出现这种问题是模型制作时使用了透明贴图。threejs无法直接处理透明贴图。 方法一 场景一 模型有多个贴图时(一个透贴和其他贴图) 场景二 一个透明贴图 场景三 有时模型有透明

    2024年02月07日
    浏览(42)
  • 【CSS】透明背景的圆角渐变边框实现方案

    css的渐变边框可以用下面方式实现 css的圆角边框可以用下面方式实现 那想要实现一个圆角的渐变边框呢,可能会以为,两个都用上不就可以了,但事实是,这两个属性并不兼容,所以要实现一个圆角的渐变边框,就得需要曲线救国的方法了 最终效果图    

    2024年02月13日
    浏览(73)
  • 移动端网站背景视频自动播放兼容方案-jsmpeg

    移动端视频背景播放视频用video会有很多问题,qq浏览器,百度浏览器等会将视频固定在最上方等等问题,因此利用ffmpeg将视频转换成ts文件,用jsmpeg进行播放。 1、先下载jsmpeg: https://gitee.com/webrtcsfu/jsmpeg 2、在里面找windows64的 然后下载 ffmpeg-master-latest-win64-gpl: https://github.

    2023年04月09日
    浏览(30)
  • 在Android中Unity3D透明背景的实现

    在Unity中,可以通过Window-Rendering-lighting-在属性面板中选择Environment,修改 Skybox Material 为 None 来去掉天空盒。 但去掉天空盒的效果是这样的: 这样的效果明显不是预期的效果。 去掉天空盒并不代表背景被透明,还需要设置Camera的背景。 需要设置黑色透明度0,即ARGB为(0,

    2023年04月08日
    浏览(92)
  • 端午节使用Threejs实现数字人3D粽子

    个人主页: 左本Web3D,更多案例预览请点击==》 在线案例 个人简介:专注Web3D使用ThreeJS实现3D效果技巧和学习案例 💕 💕积跬步以至千里,致敬每个爱学习的你。喜欢的话请三连,有问题请私信或者加微信   1,功能介绍 Threejs实现加载粽子模型,使用AI生成数字人并进行介

    2024年02月16日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包