点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

用手势导航可以完成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 = trainingif not training: # automatically set the buttons values if not training modeself.set_buttons()else:self.n = nself.bbox_switch = []self.bbox_body = bbox_bodyself.center_point = get_centroid(self.bbox_body) # center point of faceself.buttons_bbox_init()self.action = Actions(self.center_point) # calling the Actions objectdef set_buttons(self):self.bbox_body, self.center_point, self.n, self.bbox_switch = buttons_datadef buttons_bbox_init(self): # to setup the regions of action (bbox of switch)self.switches = [] # the switch objectself.bbox_center = [] # the coordinates of bbox of switch wrt to the facefor 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_yreturn dx, dy, w, h# updates to the new position of bbox switch, wrt to facedef 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_yreturn x, y, w, hdef run(self, frame, curr_center):self.curr_center = curr_centerfor 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:break        copy = 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 Keybreakcv2.destroyAllWindows()
fvs.release()

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

Switch.py->

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

按钮-此类用于:

  1. 存储所有Switch对象

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

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

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

注意:

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

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

结论

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

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

用OpenCV玩《铁拳》!!!相关推荐

  1. OpenCV 玩九宫格数独(二):knn 数字识别

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:刘潇龙 前言 首先需要说明,这里所说的数字识别不是手写数字识别! 但凡对机器学习有所了解的人,相信看到数 ...

  2. OpenCV玩九宫格数独(三):九宫格生成与数独求解

    前言 在此之前,OpenCV玩九宫格数独(一)和(二)分别介绍了如何从九宫格图片中提取出已知数字和如何用knn训练数字识别模型.在这些前期工作都已经完成的基础上,接下来我们需要做什么呢? 我们要做的有 ...

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

    作者 | 小白 来源 | 小白学视觉 用手势导航可以完成GTAV,那么这一思想也能带入到别的游戏中.因此,我们的第一选择是打格斗游戏,并且该类别中最好的游戏之一是<铁拳>(SFTK).主要 ...

  4. 50 行代码,看 Python + OpenCV 玩转实时图像处理!

    本文来自博客专栏<Python> 本专栏专注于Python项目实战开发应用 初学OpenCV图像处理的小伙伴肯定对什么高斯函数.滤波处理.阈值二值化等特性非常头疼,这里给各位分享一个小项目 ...

  5. OpenCV玩微信小游戏星途WeGoing

    游戏模式 这是一个2D插画风格的益智游戏,玩家可以点击屏幕控制控制飞船在星球间飞跃,刚开始控制不好可能会撞上星球. 工具介绍 Python 3.5 Android 手机 Adb 驱动 原理说明 通过O ...

  6. OpenCV实践之路——opencv玩数独之一九宫格轮廓提取与透视变换

    本文由@星沉阁冰不语出品,转载请注明作者和出处. 文章链接:http://blog.csdn.net/xingchenbingbuyu/article/details/50783585 微博:http ...

  7. OpenCV玩九宫格数独(零)——预告篇

    九宫格 数独源于18世纪的瑞士,又称九宫格,有九行.久列和九宫.玩家需要在九宫格中,根据已知的数字,利用逻辑和推理能力,填出所有的空格中应有的数字.填的时候要求每行.每列和每宫都要不重复地包含数字0- ...

  8. OpenCV玩九宫格数独(二):knn数字识别

    参考: 1.http://blog.csdn.net/xingchenbingbuyu/article/details/70208199 2.https://github.com/LiuXiaolon ...

  9. Vscode上使用opencv(C++接口,Windows篇)

    Vscode上使用opencv(C++接口,Windows篇) opencv是任何一个学习或者对视觉算法感兴趣的同学几乎都会用的一个库,Python接口的opencv玩了一阵子了,最近心血来潮,想要玩 ...

最新文章

  1. 如何解决android 通知栏不显示的问题
  2. 如何显示已上演的更改?
  3. Hibernate的dynamic-insert和dynamic-update的使用
  4. 【百家稷学】图像识别,模型设计,人脸图像,摄影图像直播回放与资料下载(有三的书直播分享)...
  5. URL Collection
  6. 像@Transactional一样利用注解自定义aop切片
  7. 最新的ndkr20编译c_NDKr20使用clang编译ffmpeg
  8. 小说平台系统开发(PHP)
  9. C语言学生宿舍水电费信息管理系统
  10. c语言程序设计行李管理系统,行李全流程管控C位登场,让你Cue到行李人的努力了嘛?...
  11. 阿根廷-10月摩托车行业实现正增长(+23.4%)
  12. Linux下的motion detection(最简单的办公室监控系统)
  13. DSPE-PEG-cRGD,磷脂-聚乙二醇-环肽RGD,靶向穿膜肽RGD环肽供应
  14. html的ul和li元素
  15. #pragma warning 启用和禁用warning
  16. ChatGPT桌面应用程序
  17. 话说笔记(V1.0.0)的设计和实现
  18. 海思Hi3798MV200机顶盒芯片处理器简介
  19. python系统工作原理_Python之路——堡垒机原理及其简单实现
  20. 《果壳中的宇宙》回顾

热门文章

  1. 这可能是史上最全的Python算法集!
  2. 百度15篇论文被AAAI 2019收录
  3. 中小学AI教育靠谱吗?50%教师教学经验不足1年
  4. 那篇《中国AI觉醒》的文章,让西方的吃瓜群众们对中国展开了疯狂膜拜…不信你看
  5. 关闭线程池 shutdown 和 shutdownNow 的区别
  6. 如何轻松搞定 CRUD 的创建人、修改人、时间等字段的赋值
  7. JDK 序列化, 碰到serialVersionUID 不一致问题,怎么处理?
  8. G1调优很难?记住这些经验技巧~
  9. 在家搭建大数据分布式计算环境!
  10. 山东省百万奖金赛事来了!