如何从 Python 中的另一个应用程序实时捕获和处理 activity?

How to capture and process live activity from another application in Python?

我是一名计算机科学专业的学生,​​作为个人项目,我有兴趣构建可以在本地模拟器上观看和生成有关超级任天堂游戏 运行 的有用信息的软件。这可能是当前健康状况、当前分数等(屏幕上任何清晰可见的内容)。窗口形式的模拟器 运行s(我使用的是 SNES9x),所以我不需要捕获屏幕上的每个像素,而且我只需要捕获大约 30fps。

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

在某些时候,我想探索开发某种启发式 AI 的能力,这种 AI 可能能够玩 Super Metroid,但要做到这一点,它需要解释实时游戏玩法。像这样的东西所需的算法和数据结构在我的研究范围之内;视频处理不是,我是个菜鸟。任何指针都会很棒(请原谅蹩脚的计算机科学双关语)。

对于那些可能会指出抓取游戏内存比抓取屏幕数据更简单的人——是的,确实如此。我的兴趣在于开发仅提供人类玩家可能拥有的信息的东西,即屏幕上的视觉效果,所以这是我暂时感兴趣的方法。谢谢!

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

实时图像(不是流...)处理设计问题是关于整体 RT 循环性能,主要是图像转换和处理,而不仅仅是静态图像大小和每个采集方法-se.

无论如何,您的代码必须在 [usec, nsec] 中进行仔细设计和预先测量(是的,有 python 工具可让您将代码的时序问题基准测试降低到大约 25-纳秒分辨率),以便在您的通用图像处理架构中保持整个 RT 循环的可行性。另外,您将在资源管理和错误处理方面苦苦挣扎,这两者都会在 RT 调度中造成很多问题。

怎么样?以此为灵感出发

来自医学成像 PoC 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>

预先录制的序列是必须的还是最好的?

就您表达的动机而言,您的原型将花费大量时间进行开发。预先录制的序列可能会帮助您专注于 dev/test 方面,而您的注意力不会在游戏和 python 代码之间一分为二,但是这些不是必须的。

关于 FPS 的评论。您针对人类玩家构建 AI

话虽如此,您的初始 AI 引擎可能会以 10-15 FPS 的任何低值开始,无需仅仅因为人为的高 FPS 率而让自己陷入无法解决的 RT 循环难题。

我们的人眼/大脑串联在电视刷新率附近的某处产生了运动错觉(意思是模拟电视原版,其中大约 21 个半屏幕对人们来说已经足够几十年了(对于狗...因此营销公司专注于影响人类,用人米而不是狗米来衡量他们的广告活动的影响,因为我们最好的朋友根本不喜欢在电视屏幕上看那些奇怪的闪烁静电)) .

所以不要过度设计要开发的人工智能引擎,它的目标应该是打败人类玩家,而不是狗玩家,不是吗?