多处理队列:pygame表面死了

时间:2015-06-11 19:52:30

标签: python multithreading image pygame pygame-surface

我想使用多处理来分离pygame中的两个任务:从网络摄像头中提取图像并在屏幕上显示图像。我想这样做的原因是因为

  • 我想要进行精美的图像处理
  • 我想将网络摄像头轮询与屏幕和用户输入分开

并希望将两者的时间延迟分开,最好选择加载负载。使用线程我没有问题从一个线程发送图像到另一个线程。但是,我得到了一个滞后的形象。我想测试使用多处理是否可以减少图像的延迟。

这是障碍:将图像从相机处理发送到屏幕进程后出现错误。使用

从队列中提取图像后
imgmsg = img_q.get() 

我用

检查图像的大小
imgmsg.img.get_width()

如上所述,使用线程返回正确的图像宽度。但是,对于多处理,我收到以下错误

Process Process-1: Traceback (most recent call last):   File "/usr/lib/python3.2/multiprocessing/process.py", line 267, in
_bootstrap
    self.run()   File "/usr/lib/python3.2/multiprocessing/process.py", line 116, in run
    self._target(*self._args, **self._kwargs)   File "test_photoBoothMultiProc.py", line 21, in consumer
    photoBoothScreen.screenThread(in_q, img_q)   File "/home/pi/pyBooth/thread_photoBoothScreen.py", line 68, in screenThread
    print(imgmsg.img.get_width()) pygame.error: display Surface quit

所以看起来图像在队列中丢失了?我试着读到这个,并且在转换时似乎有问题 通过队列匹配更大的对象。它是否正确?我将如何规避或解决这个问题?

1 个答案:

答案 0 :(得分:1)

在发送到另一个进程之前,先将图像序列化(使用pygame.image.tostring / pygame.image.fromstring)。

那应该有用。这样,您只发送图像本身的数据,而不是Surface实例(因此它完全独立于pygame)。

请注意,您还可以通过在该字符串上调用.encode("zlib") / .decode("zlib")来进一步压缩字符串。