如何在Python中捕获并处理来自其他应用程序的实时活动?

我是一名计算机科学学生,作为个人项目,我对开发能够监控并生成关于在本地模拟器上运行的超级任天堂游戏的有用信息的软件很感兴趣。这可能包括当前生命值、当前得分等(屏幕上可见的任何内容)。模拟器以窗口模式运行(我使用的是SNES9x),所以我不需要捕获屏幕上的每个像素,大约每秒捕获30帧就足够了。

我研究了一些库,如FFMPEG和OpenCV,但到目前为止我所看到的让我认为我必须有游戏的预录制渲染。

在某个时候,我想探索开发一种能够玩《超级银河战士》的启发式AI的可能性,但要做到这一点,它需要解释实时游戏。用于这种应用的算法和数据结构在我研究的范围内;视频处理不在其中,我在这方面还是个新手。任何建议都会很棒(请原谅这个蹩脚的计算机科学双关语)。

对于那些可能会指出直接抓取游戏内存比屏幕抓取数据更简单的人——是的,确实如此。我的兴趣在于开发一种仅提供人类玩家所能获得的信息的软件,即屏幕上的视觉信息,所以这是我目前感兴趣的方法。谢谢!


回答:

A: 是的,python 可以通过USB输入设备抓取并处理任何场景

实时图像(不是流…)处理设计问题主要是关于整体实时循环性能,主要是图像转换和处理,而不是仅仅关于静态图像大小和获取方法本身。

无论如何,你的代码必须经过精心设计和预先测量(以微秒、纳秒为单位)(是的,有一些Python工具可以让你将代码的计时问题精确到大约25纳秒的分辨率),以便在你的整体图像处理架构中保持整个实时循环的可行性。此外,你还将面临资源管理和错误处理的挑战,这两者在实时调度中都会引起很多问题。

如何做?从这里开始作为灵感

一个来自医学成像Python原型的初始图像捕获想法的样本:

def demoCLUT( ):    cameraCapture = cv2.VideoCapture(0)    cv2.namedWindow(        'msLIB:ComputerVision.IN' )    cv2.setMouseCallback(   'msLIB:ComputerVision.IN', onMouse )    cv2.namedWindow(        'msLIB:ComputerVision.OUT-0' )    cv2.namedWindow(        'msLIB:ComputerVision.OUT-1' )    cv2.namedWindow(        'msLIB:ComputerVision.OUT-2' )    success, frame = cameraCapture.read()    if success:        while success and cv2.waitKey( 10 ) == -1 and not clicked:          # [msec]            aGrayFRAME  =                               cv2.cvtColor(   frame, cv2.COLOR_BGR2GRAY )            cv2.imshow( 'msLIB:ComputerVision.IN',                                     frame )            cv2.imshow( 'msLIB:ComputerVision.OUT-0',                             aGrayFRAME )            cv2.imshow( 'msLIB:ComputerVision.OUT-1',   reprocessIntoFalseCOLORs( aGrayFRAME, frame, aFalseCLUT   ) )    # <frame>-destructive            cv2.imshow( 'msLIB:ComputerVision.OUT-2',   reprocessIntoFalseCOLORs( aGrayFRAME, frame, aFalseCLUT_T ) )    # <frame>-destructive            success, frame = cameraCapture.read()        pass    else:        print "OpenCV.CLUT.DEMO: cameraCapture.read() failed to serve a success/frame ... "    pass    # ------------------------------------------------------------------<RELEASE-a-Resource>    cameraCapture = False                                               #RELEASE-a-Resource setting it asFalse    print 30 * ">", "call clearWIN() to release & tidy up resources..."    # ------------------------------------------------------------------<RELEASE-a-Resource>

预录制的序列是必须的还是可选的?

根据你表达的动机,你的原型开发将花费很多时间。在这里,预录制的序列可以帮助你专注于开发和测试方面,而你的注意力不会在游戏和Python代码之间分散,但这些并不是必须的。

关于FPS的评论。你构建AI来对抗人类玩家

话虽如此,你的初始AI引擎可以从低至10-15 FPS开始,没有必要因为人为设定的高FPS率而陷入无法解决的实时循环难题。

我们人类的眼睛/大脑组合在接近电视刷新率的地方获得运动的错觉(指的是原始的模拟电视,那里大约21个半屏幕的刷新率几十年来对人们来说已经足够了(对狗来说不一样…因此,营销公司专注于影响人类,用人计量器而不是狗计量器来衡量他们的广告活动的影响,因为我们的好朋友根本不喜欢看电视屏幕上那些奇怪的闪烁静态画面))。

所以不要过度设计要开发的AI引擎,它的目标是击败人类玩家,而不是狗,对吗?

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注