草庐IT

打破次元壁,让游戏角色在指尖跳舞,简易的 AR 教程

桑榆肖物 2023-05-01 原文

本文介绍如何通过 Windows 自带的 Xbox Game Bar 录制游戏视频,并通过 Python 使用 u2net 的 AI 模型对视频进行背景去除,生成含有透明通道的视频。最后结合 Html5 的相机并播放 webm 视频,实现简单的 AR 能力。

文章目录

前言

作为一个天涯明月刀游戏的端游老玩家,天刀的画质是没的说的。玩天刀的七年,我唯一最大的收获就是拐了女朋友回家。至此,双十一来临之际,我紧急把之前想写的教程赶了出来。为了让单身的少侠可以在现实世界有自己游戏角色的陪伴,不再那么孤单,我可真是操碎了心,半夜把网页赶了出来。其实单身和非单身的双十一区别不是很大,只是吃土的方式不一样罢了。话不多说,我们先来看下效果:

啊,不对,放错图了,下面这个,下面这个……

在线演示地址:https://sangyuxiaowu.github.io/Wuxia_AR/

实现思路

增强现实(AR)这个概念想必大家都不陌生,根据其定义我们只需要将虚拟信息与真实世界融合就算的上是 AR 啦,这里我们不会用到三维建模、空间注册定位、智能交互等高大上的技术,也不会用到 ARCore、ARKit、Vuforia 等相关平台,今天仅实现简单的视频叠加效果。

在最终呈现上,我们通过天涯明月刀客户端提供的天涯一瞬功能录制视频素材,然后使用 AI 去除视频中的背景,生成含有 alpha 透明通道的视频。接着设计一个网页,打开摄像头并播放这个视频,这样一来,一个简单的 AR 功能就实现了。

录制素材

在游戏中打开天涯一瞬拍照系统,使用自由镜头,将视角画面翻转 90 度,在装饰中更改画面背景为第一个,这样便于后期抠图处理。关于灯光效果等其他设置大家按照自己的喜好来设置即可,当然衣服配饰什么的,优先考虑下后期抠图的效果。

设置完成播放自己想录制的动作就可以准备录制了,这里我使用的是 Windows 系统自带的 Xbox Game Bar ,按住 Win + G 呼出录制界面,点击录制按钮即可开始录制,你也可以直接按 Win + Alt + R 使用快捷按键直接开始录制。对于 N 卡的用户,也可直使用 NVIDIA GeForce Experience 的游戏录制功能进行录制。

这里我选择的动作是晨夕杏时茶时装的春时舞,动作拖放后会重复执行,但是音乐只有一次,开始录制的时机可能会不好把握,那么动作可以在结束前开始录制,然后记得要 Ctrl + U 隐藏游戏 UI ,后期做裁剪就可以了。后期处理可以使用 必剪 等工具进行,导出 mov 格式。

视频处理

视频帧提取

视频抠图我们使用 Python 处理,当然为什么不用 After Effect 或是其他处理软件,甚至必剪都带有抠图。话不能这么说,软件自己扣了,哪轮得到我写点代码呢?

这里会用到 OpenCV 、rembg 、PIL 等库。关于 AI 去背景可以看这一篇文章:《AI一键去背景》。

#导入所需的库
import cv2
import os
import math
from PIL import Image
from rembg import remove

接下来,我们定义视频转换图片函数,先使用 cv2 将视频文件逐帧存储为 .jpg 文件

def getFrame(video_name, save_path):

    video = cv2.VideoCapture(video_name)

    # 获取视频帧率
    fps = video.get(cv2.CAP_PROP_FPS)
    print(fps)

    # 获取画面大小
    width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
    size = (width, height)

    # 获取帧数
    frame_num = str(video.get(7))
    name = int(math.pow(10, len(frame_num)))
    ret, frame = video.read()
    while ret:
        cv2.imwrite(save_path + str(name) + '.jpg', frame)
        ret, frame = video.read()
        name += 1
    video.release()
    return fps, size, frame_num

执行调用后,程序会将 video.mov 视频逐帧:

#将视频按帧保存为图片
frame_path = "./frames/"
if not os.path.exists(frame_path):
    os.makedirs(frame_path)
fps, size, frame_number = getFrame("video.mov", frame_path)
print(fps, size, frame_number)

逐帧去背景

对逐帧保存的所有图片逐个进行去除背景操作:

def getRemoveBg(frames):

    output_dir='./output/'
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    files = [frames + i for i in os.listdir(frames)]
    for fi in files:
        fisave = fi.replace("frames","output").replace("jpg","png")
        if not os.path.exists(fisave):
            input =Image.open(fi)
            output=remove(input)
            output.save(fisave)

getRemoveBg("./frames/")

图片背景处理好的放在文件夹 output,上面的逐帧抠图确实很慢,反正还要写文章,一边写一边等了,没必要现在优化成多线程了。

视频合并

在我们得到一堆透明 PNG 的序列图后,只需要通过 ffmpeg 工具将其合并成视频即可。

需要安装有 ffmpeg 软件,Windows 电脑需要配置好环境变量。

ffmpeg -r 30 -i output/1%06d.png -i music.mp3 -y output.webm

参数解释: 生成 30 帧的视频,输入一个是 png 序列,一个是 music.mp3 配乐文件,最后导出为 webm 格式。

网页效果

网页的设计非常简单,提供了强制的手机背面摄像头画面的渲染,以及 webm 视频文件的播放。操作控制按钮提供了全屏,视频文件的放大和缩小,以及开始播放功能。轻触角色会询问是否允许访问摄像头,点击允许,之后就可以点击角色,将其拖放到合适位置了。

食用教程

  1. 克隆或下载存储库 https://github.com/sangyuxiaowu/Wuxia_AR/
  2. VsCode 打开该存储库文件夹,访问 main.ipynb
  3. 下载或生成 video.mov 录制的角色视频,放到这个文件夹中
  4. 执行 main.ipynb 中的代码块
  5. 打开或部署 index.html 文件

网页视频的图片预览可替换 1000000.png 文件。

注意

需要注意的是,经过测试,因为摄像头调用和视频播放没有适配 IOS设备,另外是透明背景视频 webm 的视频编码 VP9 是一个由 Google 开发的开放格式,只有在 webkit 内核的浏览器才可以播放,所以这个网页仅有安卓用户可以正常访问,在微信中或是手机版的 Chrome,Edge 浏览器访问即可看到效果。

总结

录制的素材和春时舞的配乐大家可前往 Github 仓库,或前往 CSDN 下载

总体来说,最终的效果还算可以,就是抠图确实还是存在很大的瑕疵。

希望天刀天涯一瞬功能后期可以将背景增加一个绿幕,或者可以直接录制透明背景的视频,为少侠们创造更多的快乐和灵感。另外,N 卡的亮点,自动录制,图片模式等各种功能在 64 位出现后就一直没再支持了,现在 32 位也没有就彻底用不了了。

“掌中舞罢箫声绝,三十六宫秋夜长。”

正午的阳光真好,少侠们,带上自己的游戏角色,去尽情起舞吧!

有关打破次元壁,让游戏角色在指尖跳舞,简易的 AR 教程的更多相关文章

  1. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  2. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  3. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  4. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  5. ruby - 我需要从 facebook 游戏中抓取数据——使用 ruby - 2

    修改(澄清问题)我已经花了几天时间试图弄清楚如何从Facebook游戏中抓取特定信息;但是,我遇到了一堵又一堵砖墙。据我所知,主要问题如下。我可以使用Chrome的检查元素工具手动查找我需要的html-它似乎位于iframe中。但是,当我尝试抓取该iframe时,它​​是空的(属性除外):如果我使用浏览器的“查看页面源代码”工具,这与我看到的输出相同。我不明白为什么我看不到iframe中的数据。答案不是它是由AJAX之后添加的。(我知道这既是因为“查看页面源代码”可以读取Ajax添加的数据,也是因为我有b/c我一直等到我可以看到数据页面之后才抓取它,但它仍然不存在)。发生这种情况是因为

  6. ruby-on-rails - (Ruby,Rails) 基于角色的身份验证和用户管理...? - 2

    我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源

  7. ruby - 在 RUBY 上的 PADRINO 框架上使用 RSPEC 进行测试的教程 - 2

    我是Ruby新手,并被要求在我们的新项目中使用它。我们还被要求使用Padrino(Sinatra)作为后端/框架。我们被要求使用Rspec进行测试。我一直在寻找可以指导在Padrino上使用RspecforRuby的教程。我得到的主要是引用RoR。但是,我需要RubyonPadrino。请在任何入门/指南/引用/讨论等方面指导我。如有不妥之处请指正。可能是我没有针对我的问题搜索正确的词/短语组合。我正在使用Ruby1.9.3和Padrinov.0.10.6。注意:我还提到了SOquestion,但它没有帮助。 最佳答案 我没用过Pa

  8. python - Ruby 或 Python 的 3d 游戏引擎? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion是否有适用于这些的3d游戏引擎?

  9. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

  10. ruby-on-rails - rails 教程 : Putting flash messages in partial yields error "undefined method ` each' for nil:NilClass"? - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:FlashMessagesinPartials(Rails3)我正在做MichaelHartl的Railstutorial和listing7.26将flash消息添加到应用程序布局:...">...这很好用。但是,我试图通过在我的部分文件夹中创建一个_flash.html.erb来清理这段代码...">-->...并且比使用......在我的应用程序布局中,我的所有Rspec测试开始失败,每个测试都显示以下消息:Failure/Error:before{visitsignup_path}ActionView:

随机推荐