我正在使用OpenCV开发动物追踪程序。识别出动物后,我想绘制一些形状并将其投射在它前面一定的时间。
为了绘制形状并将其投影,我使用PsychoPy

当我得到动物并使用PsychoPy调用draw函数时,程序将冻结,直到形状消失。我使用线程来解决此问题,但是程序完全停止,并显示系统消息“Python意外退出”。

这是我打开线程的方法:

t = threading.Thread(target=stimulus_controller.draw, args=(stimulus_view, 20))
t.setDaemon(True)
t.start()

其中stimulus_view是我要绘制的形状的数组,而20是显示刺激的秒数。

这是绘图代码:
def draw(stims, time):

    trialClock = core.Clock()

    while t < time:
        t = trialClock.getTime()
        for s in stims:
            s.draw()

        myWin.flip()

这很简单,但是会意外停止!

非常感谢你。

最佳答案

通常,开窗工具包不喜欢在不同线程中使用(这主要是由于底层操作系统的工作方式),PsychoPy也不异常(exception)。它并不总是记录在案,但是如果单个线程(无论是主线程还是工作线程)与窗口交互,则经常可以将它们与线程一起使用。

与窗口“交互”本质上是三件事:创建窗口,将其绘制到窗口中以及向窗口发送事件/从窗口接收事件。在您的示例中,您是从辅助线程绘制的,但是您是从主线程创建的窗口-因此它崩溃了。

如果您在工作线程中创建窗口,那应该没问题。同样,如果您打算使用事件,则只能从工作线程上执行此操作(某些工具箱(例如wxWidgets)具有允许其他线程发送事件的原语,有些则要求您使用例如队列来执行管道操作)。

08-04 14:54