我正在做一个图像处理项目,我希望来自 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 使用率,而且开始时也没有延迟。