用 OpenCV 玩《铁拳》是什么感觉?

news/2024/11/16 6:32:10/

22f14dca6aff08f52b82a75cd75fec2c.gif

作者 | 小白

来源 | 小白学视觉

用手势导航可以完成GTAV,那么这一思想也能带入到别的游戏中。因此,我们的第一选择是打格斗游戏,并且该类别中最好的游戏之一是《铁拳》(SFTK)。主要概念很简单,无论人类玩家会采取什么行动(例如拳打),游戏中的玩家都会复制相同的动作。因此,为了实现这个想法,我们想出了两种方法。

首先,一种是较为复杂的方法:把我们的200+图像做不同的动作(如冲压,跳跃)等,然后用它来训练模型,以不同的姿势或者动作之间进行分类,并模拟它在游戏。但是这种方法存在一些问题。

显而易见,我们必须给自己拍很多张照片,每个类别中要有200张以上。这将非常忙碌,并且为了概括起见,我们还需要不同大小,背景和光照条件不同的人的图像。这可能会花费很多时间。

第二种方法是简单地使用我们以前在Virtual Switch and Gesture Gaming中的项目中的想法,为了概念验证,我们决定采用第二种方法。


概念

其工作背后的主要概念非常容易,只是有一个虚拟开关,只要按下该开关,就可以模拟游戏中相应的动作(踢)。

步骤

  1. 跟踪脸部。

  2. 将边界框wrt移到bbox面。

  3. 使用特定区域作为专用于特定操作的虚拟交换机

Bbox(边界框)是用于指代感兴趣区域(矩形/框内)的术语。

我们跟踪人脸,并且虚拟开关框相对于人脸移动。因此,为了在游戏中移动而使用的逻辑是:

  1. 当我们前进一定的门槛时,玩家也将开始前进,反之亦然。

  2. 我们存储一条穿过脸部中心的水平线。如果我们跳跃并越过中心线一个阈值,则玩家也会跳跃。同样,当我们走到线下时,玩家将蹲下。

Setup.ipynb->

在此笔记本中,我们将定义人类玩家开始的初始位置。因此,将通过跟踪算法从该位置跟踪他。首先,设置相机并将其放置在固定位置。然后,我们将只跟踪面部来跟踪人类玩家在游戏中的位置,因此执行“面部”框单元格,然后:

  1. 从开始的位置做准备。

  2. 计时器结束后,在脸部周围放置一个bbox。

现在,如果您还想为新操作添加新的开关,则可以运行“按钮”单元,然后:

  1. 设置n。这是总数。要添加的开关数量。

  2. 保持脸部收件箱为准,并进行操作(例如踢)。然后在您要分配用于踢脚动作的区域周围打一个方框。

  3. 要保存以供以后使用,请复制打印的输出并将其粘贴到Switch.py上。

请注意,开关0将映射到操作键0。因此,将操作映射到类Action中的键。

class Buttons:
def __init__(self, n=0, bbox_body=(), training=False):
self.training = training
if not training: # automatically set the buttons values if not training mode
self.set_buttons()
else:
self.n = n
self.bbox_switch = []
self.bbox_body = bbox_body
self.center_point = get_centroid(self.bbox_body) # center point of face
self.buttons_bbox_init()
self.action = Actions(self.center_point) # calling the Actions object
def set_buttons(self):
self.bbox_body, self.center_point, self.n, self.bbox_switch = buttons_data
def buttons_bbox_init(self): # to setup the regions of action (bbox of switch)
self.switches = [] # the switch object
self.bbox_center = [] # the coordinates of bbox of switch wrt to the face
for i in range(self.n):
if not self.training: # copy the switch data, if already done the setupbbox = self.bbox_switch[i]s = Switch(self.bbox_body, bbox)
else: # else, select the region for switchs = Switch(self.bbox_body)
self.bbox_switch.append(s.bbox)
self.switches.append(s)
self.bbox_center.append(self.bbox_wrt_center(s.bbox)) #now bbox is wrt origin            
if self.training: # prints the values of bbox of body and switchprint(f'bbox_body = {self.bbox_body} \nbbox_switch = {self.bbox_switch}')
# Calculates the distance of bbox from center point (face). Then this is used to get new position
# of switch when the positoin of face changes.
def bbox_wrt_center(self, bbox):center_x, center_y = self.center_point #starting center point, find switch pos, wrt starting bboxx, y, w, h = bboxdx, dy = x - center_x, y - center_y
return dx, dy, w, h
# updates to the new position of bbox switch, wrt to face
def bbox_update(self, bbox):curr_x, curr_y = self.curr_center #cetner curr point of bodydx, dy, w, h = bboxx = dx + curr_xy = dy + curr_y
return x, y, w, h
def run(self, frame, curr_center):
self.curr_center = curr_center
for i in range(self.n):s, bbox = self.switches[i], self.bbox_center[i]s.bbox = self.bbox_update(bbox)pressed = s.update(frame)
if pressed:
self.action.press_val(i)
self.action.action_movement(curr_center)

Gameplay.ipynb->

我们将初始化按钮对象,其中将包含所有虚拟交换机,通过训练为False将使其使用默认值。

button = Buttons(training=False)
tracker = cv2.TrackerCSRT_create()
fvs = cv2.VideoCapture(path)
TIMER_SETUP = 3
t = time.time()
while True:frame = get_framecv2(fvs)    curr = (time.time() - t)
if curr > TIMER_SETUP or frame is None:
breakcv2.putText(frame, str(int(TIMER_SETUP - curr)+1), (225,255), cv2.FONT_HERSHEY_SIMPLEX, 1.5, COLOR_RED, 4)cv2.putText(frame, 'Keep your face inside the box', POS_SCREEN, cv2.FONT_HERSHEY_SIMPLEX, 1, COLOR_RED, 4)drawbox(True, bbox, frame)    cv2.imshow("Tracking", frame)cv2.waitKey(1)
tracker.init(frame, BB)
#After the timer finishes, now your actions will be recorded, and will be mapped to key in game.
while True:frame = get_framecv2(fvs)
if frame is None:
breakcopy = frame.copy()_, bbox = tracker.update(frame) drawbox(True, bbox, frame)button.run(frame, get_centroid(bbox))    cv2.imshow("Tracking", frame) # orig video framesk = cv2.waitKey(1)
if k == 13: #13 is the Enter Key
break
cv2.destroyAllWindows()
fvs.release()

唯一的变化是,我们将当前帧传递给button对象,该对象将跟踪位置的变化以及与所按下的虚拟开关相对应的游戏中要执行的动作。

Switch.py->

该脚本包含所有基本功能,交换机—此类用于实现虚拟交换机。

按钮-此类用于:

  1. 存储所有Switch对象

  2. 通过当前帧来决定要按下哪个开关。

bbox_wrt_center:此函数用于计算开关wrt到脸部中心的坐标。这样做是为了在我们移动时,开关也相应地移动。运行—此功能获取当前帧,并将其传递到开关。如果按下任何开关(返回True),则在游戏中按下与该开关相对应的动作。

动作:此类用于将Switch与游戏中相应的动作键(打孔,向左移动)映射。注意—我们尚未在其他PC上进行过测试,因此,如果某项操作在您的PC上不起作用,请尝试为Pressley和ReleaseKey之间的时间间隔设置不同的值。

注意:

  1. 确保视频质量良好并且光线充足。由于它是通过计算噪声来工作的,因此低图像质量或低光照可能会导致某些异常。

  2. 您可以使用背景减法器的history参数,并根据需要更改开关的阈值。

结论

因此,这是我们尝试使用图像处理技能来创建一种有趣的玩《铁拳》游戏的方法。这只是对该想法的实验,将来,我们可能会使用一些更好的技术来获得更好的结果。

fb1bec2aa7dfb67a3034509046505f91.gif

技术

强大的Gensim库用于NLP文本分析

资讯

何同学又上热搜了,这次为什么?

技术

介绍一个效率爆表的探索性插件

技术

用Python打造一个语音合成系统

008a17aad01d9add8bb678a6dce92d75.png

分享

cbc23c446c6ffe1b8ad2cb8b8e10a5b7.png

点收藏

6f0895221b6b640732eb55f5286acaed.png

点点赞

b257cce01b5bea53462b44fafdc1dd30.png

点在看


http://www.ppmy.cn/news/590930.html

相关文章

爱上铁拳男人

没有其它爱好,除了运动之外,最爱的就是看电影了。昨天在迅雷上下载了“铁拳男人”(分数还蛮高的,又有OSCAR影帝罗素克劳,心想应该不错),看完之后感动无比,只有一个感受,嫁…

计算机英语词汇mp3,【听单词】常用半导体英语词汇大全52,半导体专业英语单词MP3...

circular wave 圆形波。 digital simulation computer 数字仿真计算机。 dynamic pressure of fluid element 流体单元动压。 equisignal radio beacon 等信号无线电信标。 zero line 基准线,中性线。 bar insulation 条绝缘。 fixed armature 固定电枢。 equivocation 模糊度。…

bzoj 4334 铁拳

Description 经过了可怕的第三次世界大战后,国家政府崩溃,各大财团趁机夺取掌控世界。长年战争后,八大财团幸存并割据一方,其中最强的当属掌控北美的铁拳。 在铁拳财团所维护的文明区域中,有一项最为光荣、重要的赛事—…

java怒之铁拳,经典游戏《怒之铁拳》那些有趣的设定,资深玩家也未必都见过...

说到《怒之铁拳》系列,相信很多小伙伴都玩过的。而最近让玩家们最振奋的则是《怒之铁拳4》发行了。新版本的出现,让早已对动作过关游戏失去兴趣的我们,重新燃起战斗的欲望。 话说当年刚接触这个系列的时候,我就被游戏玩法和画面深…

java怒之铁拳,经典游戏《怒之铁拳》那些有趣的设定,资深玩家们表示白玩了...

原标题:经典游戏《怒之铁拳》那些有趣的设定,资深玩家们表示白玩了 说到《怒之铁拳》系列,相信很多小伙伴都玩过的。而最近让玩家们最振奋的则是《怒之铁拳4》发行了。新版本的出现,让早已对动作过关游戏失去兴趣的我们&#xff0…

python入门3

python入门3 函数 1.Python中的函数 函数的意义:  1.对输入进行变换映射后输出  2.过程化 VS 结构化函数的创建及结构:  定义函数名  参数  函数体  返回 :  有无返回  return与yield的区别(用yield后函数就变成一个生成器…

正则表达式高阶(三)

前言 很久没写文章了,今年由于种种原因年初休息了两个月,后面又由于今年的环境被休息了两个月,端午节过后终于开始上班了,只是这个班比想象中要忙很多。趁着晚上这会儿不想撸代码,便把最近撸代码时的一些正则的心得记…

Python 解析 XML

1 简介 XML 全称 Extensible Markup Language,中文译为可扩展标记语言。XML 之前有两个先行者:SGML 和 HTML,率先登场的是 SGML, 尽管它功能强大,但文档结构复杂,既不容易学也不易于使用,因此几…