【发布时间】:2014-02-22 09:19:04
【问题描述】:
我目前正在尝试让 Raspberry Pi 使用 2 个网络摄像头同时拍摄 2 张照片。 设置很简单: 1 个 RPi 模块 B, 1 个有源 USB 集线器, 2 个类似的网络摄像头 (Microsoft Lifecam)。
我完全有能力使用任何一个网络摄像头拍摄快照,但不能同时使用两者。我尝试了多线程和多处理但没有运气。如果我在镜头前做简单的动作(比如用手指数秒),两张图片会显示不同的手指数。
这里是多处理试用代码:
from multiprocessing import Process
import os
import pygame, sys, time, math, socket
from pygame.locals import *
import pygame.camera
pygame.init()
pygame.mouse.set_visible(False)
# init camera
pygame.camera.init()
_imgres = (800,600)
_cam = []
_cam.append(pygame.camera.Camera('/dev/video0',_imgres, 'RGB'))
_cam.append(pygame.camera.Camera('/dev/video1',_imgres, 'RGB'))
def snap(name,camID):
info('function snap ' + str(camID))
_cam[camID].start()
time.sleep(2)
_image = _cam[camID].get_image()
_cam[camID].stop()
pygame.image.save(_image, "image" + str(camID) + ".bmp")
print 'snap done ', name
if __name__ == '__main__':
p1 = Process(target=snap, args=('cam 0',0))
p2 = Process(target=snap, args=('cam 1',1))
p1.start()
p2.start()
p1.join()
p2.join()
多线程试用代码类似。 我做错了什么?
感谢任何帮助。
编辑: 我已经尝试过 Jan Meisel 的想法,即从第三个脚本开始 2 个相同的脚本。它更好,但还不够——见图片。
还有其他想法吗? 谢谢
编辑2: 我检查了线程之间的时间,并更改了一些编码。现在我正在使用线程事件来实际拍摄照片,而两个线程都处于活动状态并等待该信号。计时器 1 给了我从 0 到 1ms 的两个“开始拍照”之间的差异。计时器 2 在两个“完成”之间给了我 160 到 230 毫秒的时间。我能够将曝光时间设置为 250 毫秒,计时器 2 读取... 260 毫秒。我想这回答了我的问题:确实,从相机中检索字节是一个实时过程,不能拆分(感谢@duck 提出这个建议);延迟或多或少取决于曝光时间(或相机“捕获”的时间量)。 感谢@jan 的思考。我想我的下一次尝试将是双核......
【问题讨论】:
-
我不确定,但我认为 raspbeery pi 不是多核处理器,因此它一次只能处理 1 个网络摄像头。此外,由于拍照是一个实时过程,因此处理器可能在拍照时专用于它,因此可以线程化保存部分。这就是为什么他们是滞后的。
标签: python multithreading raspberry-pi photo