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

时间:2015-05-08 23:20:20

标签: python artificial-intelligence video-processing

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

我已经查看了一些像FFMPEG和OpenCV这样的库,但到目前为止,我所看到的让我相信我必须预先录制游戏的渲染图。

在某些时候,我想探索开发一种可能能够玩超级银河战士的有点启发式AI的能力,但要做到这一点,它需要解释现场游戏。像这样的东西所需的算法和数据结构都属于我的研究领域;视频处理不是,我是菜鸟的东西。任何指针都会很棒(原谅蹩脚的计算机科学双关语)。

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

1 个答案:

答案 0 :(得分:1)

答:是的,python可以抓住&通过USB输入设备处理任何场景

实时图像(非流...)处理设计问题是关于整体RT循环性能,主要是图像变换&处理,而不仅仅是静态图像尺寸和采集方法本身。

无论如何,您的代码必须经过精心设计并在[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>

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

就您的动机表达而言,您的原型将花费大量时间进行开发。在那里预先录制的序列可以帮助你专注于开发/测试方面,而你的注意力集中在游戏和python代码之间,但这些并不是必须的。

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

话说回来之后,你的初始AI引擎可能会以低至10-15 FPS的速度开始,不需要因为人为的高FPS率而陷入无法解决的RT循环难题。

我们的人眼/大脑串联在电视刷新率附近得到了一种运动的幻觉(意思是模拟电视原版,大约21个半屏对于人来说已经持续了数十年(对于狗来说不一样)。因此,营销公司专注于对人类进行相当大的影响,衡量他们的广告活动以及对人米而不是狗米的影响,因为我们最好的朋友根本不喜欢在电视屏幕上观看那些奇怪的闪烁静电))

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