社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用Python玩GTA 5—使用OpenCV读取游戏面面

马哥Linux运维 • 8 年前 • 1302 次点击  

原文名称:Reading game frames in Python with OpenCV - Python Plays GTA V
原文链接:
https://pythonprogramming.net/game-frames-open-cv-python-plays-gta-v/
原文作者:@Harrison
本文是Harrison《Python Plays GTA V》系列教程第一篇。

当OpenAI's Universe(Universe)出现后,很多文章都在鼓吹大量的游戏(甚至GTA5)已经做好了迎接AI时代的准备。我当时跃跃欲试,然而GTA5最终被神神秘秘的清除出Universe,连个解释都没有。

后来我短暂的放弃了这个念头,但偶尔想起来依然有点抑制不住的小激动。所以我还是决定在这件事情上多花点功夫,同时好好思考这件事情到底是不是非得用OpenAI不可。OpenAI的好处在于针对一些简单的游戏项目可以实现每分钟上千次的迭代训练,但是GTA5这种游戏嘛,情况就不一样了。

我们来说一下为什么选择GTA5。至少对我来说,GTA5是一个有无数理由让我去进行练习的绝佳环境。在这个开放世界里你几乎没有不能做的事情——举一个最简单的例子:自动驾驶汽车。在游戏中,我们可以用MOD控制时间、天气、交通、速度、遇到的紧急状况等等等等。这是个完全的、可以量身订制(有时需要MOD)的世界。

我的教程有时候经过充足的计划、有些计划过一点、有的完全没有计划过。这个项目就是完全没有计划的教程之一。我知道不是所有人都有GTA5,不过我想你可以使用其他类似的游戏来和我一起学习这个项目——我们有很多游戏都可以拿来使用。(如果使用其他游戏)你需要对某些部分进行调整以使其正常运行,所以你可能得有点基础才行。

我的初步目标是创造一个自动驾驶汽车,所以任何一个有公路和汽车的游戏都可以拿来用。我用来接入游戏的方法几乎可以在其他所有游戏中也使用,如果你选择了更简单的游戏,那就省事多了。因为GTA5的高度拟真,阳光会让电脑识别变得更加具有挑战性。

我可能也会尝试其他游戏——因为我相信我们可以通过简单示范来教AI怎么玩。通过卷积神经网络处理信息,然后让AI进行练习就行。

我的初步判断是:

尽管Python并没有现成的库可用,不过
1.我们可以读取屏幕图像
2.我们可以模拟按键

这两项足够我们处理常规事务,不过对于深度学习来说,我们可能还想要记录游戏世界的进程。好在现在的大部分游戏已经完全可视化,这已经不再是个难题,我们可以通过追踪鼠标和按键,这一切都为深度学习提供了条件。

我猜这一路不会一帆风顺,但至少会很有趣。我的担忧主要集中在项目推进的速度上。我们可以做,最少是值得做。

总而言之,这是一个大项目,如果我们不拆分来做,显然就超纲了。所以我们来一点一点的尝试,第一步的目标是:

  • 找个像样的FPS工具以访问游戏画面,能用就行的那种。我们的要求是能看就行。

  • 确保键盘输入的指令可用。我觉得这很简单,但是必须得试试才知道。

  • 尝试手柄输入。特别是转向、刹车等操作。

  • 尝试使用OpenCV。希望不会遇到大问题。

  • 在简单的道路环境下实现自动驾驶。

好了,第一步,我们如何实现读取屏幕画面?我一直在想可以做,但还真没想过怎么做。所以,Google!我找到不少案例,不过大部分都不能用,只有这个还算可以:Screen Capture with OpenCV and Python-2.7

注意:导入的时候似乎有点错误,ImageGrab是PIL的一部分。

果然出错了,我们改一下:

什么鬼?dtype明显应该是字符串,而不是什么没定义的变量名。这哥们写完代码到底运行了没?

这回终于正常了。不过这段代码太长,而且太慢。改一下吧。

这个看着还不错,就是太慢了,每秒大概只能有个2-3帧的样子。再改一下试试。

还是2-3帧。所以问题不是出在imshow函数上。

好了,现在的成绩是:

loop took 0.05849909782409668 seconds 
loop took 0.044053077697753906 seconds 
loop took 0.04760456085205078 seconds 
loop took 0.04805493354797363 seconds 
loop took 0.05989837646484375 seconds

我们还需要一个numpy数组给OpenCV的imshow函数使用。相对于重新编写.getdata,我还是选择把ImageGrab.grab(bbox=(0,40,800,640))转化为numpy数组。重写是没必要的。

做了这么多事,现在大概有个每秒12-13帧的样子。这个成绩不算好,但是够用了。

——————————————————————————————————————

第一篇翻译完啦~关于配套的还有一部视频(配套视频详见原文),本来想做个字幕出来的...但是...我这初中英语水平实在是应付不来了...有机会再做吧~(考虑后面利用语音识别做个机翻)

翻译这篇文章一方面是对Python的兴趣,另一方面也算是锻炼自己的英文水平了。巧的是,这两个技能水平都不高,所以如果看到错误,欢迎指正~

作者:地球的外星人君

来源:https://zhuanlan.zhihu.com/p/28164389



————广告时间————

《马哥Linux云计算及架构师》网络课程,由知名Linux布道师马哥创立,经历了8年的发展,联合阿里巴巴、唯品会、大众点评、腾讯、陆金所等大型互联网一线公司的马哥课程团队的工程师进行深度定制开发,课程采用 Centos7.2系统教学,加入了大量实战案例,授课案例均来自于一线的技术案例。

开课时间:随到随学

课程咨询请长按即可咨询


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/bUXfsOdpWE
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/2830
 
1302 次点击