CPU 是 100% 用于多处理队列,以从多个摄像机获取帧



我正在做一个图像处理项目,我希望来自 3 个相机的照片在按下按钮时获得最新帧,为此,我使用了 multiprocessing.process 和 multiprocessing.queue,如下面的代码所示。所需的任务已完成,但现在存在 2 个问题:

1.CPU-100%在任务管理器中(这会减慢程序速度(

2.有一个解决方法 cam.set(cv2.代码中的CAP_PROP_BUFFERSIZE, 0(是导致50%的CPU使用率的主要原因

实际上我想要一种快速获取帧的方法,所以我也尝试了 multiprocessing.pipe 而不是队列,但由于第二次按下按钮时它没有获得最新的帧,所以我不得不使用 queu 通信方法。任何有关代码的帮助将不胜感激

def camera_func(queue,cam_indx):
cam = cv2.VideoCapture(cam_indx,cv2.CAP_DSHOW)   #current camera
cam.set(cv2.CAP_PROP_BUFFERSIZE, 0)
if cam.isOpened(): # Check success if the object is created and opened                    
while True:
try:
flag, frame=cam.read()
if flag==0:
break 
# used to remove buffer size problem because it gets next frame 
# rather latest frame   
if not queue.empty():
try:
queue.get_nowait()   # discard previous (unprocessed) frame
except Queue.Empty:
pass
queue.put(frame,False)
except:
continue      
else:               
cam.open()        
raise Exception("Could not open camera")
queues=[]
for pip in range(0,a_cams):
queu = Queue(maxsize=1)
queues.append(queu)
processes = [Process(target=camera_func, args=(queues[x],x)) for x in range(a_cams)]   # Setup a list of processes that we want to run
for p in processes:     
p.start()   # Run processes

更新:

我已经按照 nathancy 的建议使用了线程,现在它正在执行相同的任务,而没有解决方法,这要归功于这里的 fps 同步,CPU 使用率仍然是 80%,但这次启动程序时有 40 秒的滞后,这太多了。

我也有类似的问题。我发现这与我检查队列的方式直接相关。

我也有

if not queue.empty():
try:
r = queue.get()
...

将 CPU 负载减少到接近零的原因是删除了 .empty(( 检查。.get(( 调用会自动等待队列中存在某些内容,然后再继续。

可能有人觉得它有用!

由于没有人回答我的问题,所以我尽我所能,我发现仅将相机输入的线程版本中的capture = cv2.VideoCapture(src)行更改为capture = cv2.VideoCapture(src,cv2.CAP_DSHOW)显着降低了 CPU 使用率,而且开始时也没有延迟。

相关内容

  • 没有找到相关文章

最新更新