牛逼!用 12 万行代码堆出来个 "蔡徐坤",编译还能通过!

公众号关注 “GitHubDaily”

设为 “星标”,每天带你逛 GitHub!

转自量子位

有个程序猿,用12万行代码堆出来个「蔡徐坤」,编译还能通过?!

不是简单的灰度字符画!也不是控制台控制颜色!而是在唱、跳、rap的代码!

连肩带,都是有灵魂的。

这样的作品,来自B站UP主NyeJu。他利用代码编辑器为不同关键词显示不同的颜色的原理,生成代码,然后滑动形成视频。

这项技术的关键在于:

在正确的位置上放上符合规范的代码,显示不同的颜色。

也就是说,整个操作纯人工打造!

并且,这份代码是可以编译通过的,0 error:

一经发出,网友纷纷表示:希望编译器没事。

还有盆友说:希望肝没事。

12万行代码你太美

当然也有盆友发出了这样的惊叹:纯手敲?!UP太强了!

不过UP主虽是真·肝帝无疑,但还没有魔鬼到这个地步。

UP主也简单介绍了一下自己的操作思路。

首先,选择一个配色主题,比如UP主用的是Code Blue,并且需要获取每一种关键词的颜色。

然后,把原视频切分成一堆图片,识别每张图片的像素,匹配到最相近的关键词颜色上,记录下(颜色,长度)。

根据(颜色,长度)生成对应的代码。这涉及到两个步骤:

  • 定义一系列的pattern,比如「粉、红、白」就是声明,「灰、透明」就是注释;

  • 用pattern去匹配(颜色,长度),匹配成功就进行转换。

而UP主的这个视频能做到如此流畅,是因为他为原视频的每一帧都生成了代码。

最后,让这12万行代码滑动起来,开头那般的唱、跳、rap视频就制作成功了。

即便如此,B站现场的小伙伴们还是嗅到了爆肝的气息,比如评论区就有5级号提供了一个清新的思路:没用专业团队当素材,可能是因为UP肝了一整年。

于是,带着小伙伴们的好奇采访了一下UP主NyeJu本人。

NyeJu表示,整个项目的完成其实只用了大概一周多的时间,毕竟12万行代码不是手敲,而是生成的。

另外,NyeJu也解释说,没有选择现在更火的其他素材,是因为蔡徐坤的素材比较干净,颜色数量也比较适中。

其他的素材都不是很合适,比如像「黑人抬棺」颜色就有点多,「bad apple」的话又太少。(本人对蔡徐坤没有任何恶意。)

评论区也有盆友补充解释了一下其中的难点:可以编译通过我惊了。

对此,NyeJu说,其实项目一开始的底线就是能够编译通过,否则的话,VS Code的代码高亮会抽风。原理还是基于语法规则,比如const和static可以无限叠加,标识符和字符串可以任意长,根据这些去构造想要的颜色的长度。

One More Thing

所以,为什么会开这样一个脑洞?

在采访中,NyeJu也给出了答案:

是受「何同学」最新一个视频——《我用一万行备忘录做了个动画…》的启发,想做一个更厉害一点的。

另外,虽然展示给大家的代码是C++,NyeJu本人其实在日常的coding中用Python多一点,这个项目的C++代码也是用Python生成的。

最后,奉上完整视频~

---

由 GitHubDaily 原班人马打造的公众号:GitCube,现已正式上线!
接下来我们将会在该公众号上,为大家分享优质的计算机学习资源与开发者工具,坚持每天一篇原创文章的输出,感兴趣的小伙伴可以关注一下哈!

根据提供的引用内容,我们可以使用Python中的OpenCV和NumPy库来实现徐坤跳舞的代码。具体步骤如下: 1.导入所需库 ```python import cv2 import numpy as np ``` 2.读取视频文件 ```python cap = cv2.VideoCapture('cai.mp4') ``` 3.定义人体姿态估计模型 ```python protoFile = "pose_deploy_linevec.prototxt" weightsFile = "pose_iter_440000.caffemodel" net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile) ``` 4.定义舞蹈动作 ```python dance_moves = [ "left_hand_up", "right_hand_up", "left_leg_up", "right_leg_up", "left_hand_down", "right_hand_down", "left_leg_down", "right_leg_down" ] ``` 5.定义舞蹈动作序列 ```python dance_sequence = [ "left_hand_up", "right_hand_up", "left_leg_up", "right_leg_up", "left_hand_down", "right_hand_down", "left_leg_down", "right_leg_down" ] ``` 6.定义舞蹈动作序列索引 ```python move_index = 0 ``` 7.循环读取视频帧并进行人体姿态估计 ```python while True: ret, frame = cap.read() if not ret: break frameWidth = frame.shape[1] frameHeight = frame.shape[0] # 进行人体姿态估计 inpBlob = cv2.dnn.blobFromImage(frame, 1.0 / 255, (368, 368), (0, 0, 0), swapRB=False, crop=False) net.setInput(inpBlob) output = net.forward() H = output.shape[2] W = output.shape[3] # 获取人体关键点 points = [] for i in range(len(dance_moves)): probMap = output[0, i, :, :] minVal, prob, minLoc, point = cv2.minMaxLoc(probMap) x = (frameWidth * point[0]) / W y = (frameHeight * point[1]) / H if prob > 0.1: points.append((int(x), int(y))) else: points.append(None) # 绘制人体关键点 for pair in POSE_PAIRS: partA = pair[0] partB = pair[1] if points[partA] and points[partB]: cv2.line(frame, points[partA], points[partB], (0, 255, 255), 2) cv2.circle(frame, points[partA], 8, (0, 0, 255), thickness=-1, lineType=cv2.FILLED) # 显示舞蹈动作名称 cv2.putText(frame, dance_sequence[move_index], (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) # 播放下一个舞蹈动作 if cv2.waitKey(1) & 0xFF == ord('q'): break if move_index == len(dance_sequence) - 1: move_index = 0 else: move_index += 1 cv2.imshow('Cai Xu Kun Dance', frame) cap.release() cv2.destroyAllWindows() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值