我有一个无限循环,从网络摄像头读取视频帧,并且每个帧都会通过高计算力的复杂函数。因此,在显示帧时,由于阻塞代码,程序会感到有些卡顿。
现在我想要做的是:
- 仅在目标对象出现时收集前几帧 - 将它们放入单独的线程中以避免代码阻塞
我已经测量了摄像头每秒捕获的帧数,约为28帧。因此,while循环每秒只会收集前5帧并在另一个线程中处理所有帧,等到所有5个函数完成后再返回结果。
我尝试使用“Pool”和“Queue”,但无法让它工作,while循环仍然被阻塞。下面的代码模糊地表示了我的程序现在的样子,我回家后会进行编辑,现在使用手机发布。
现在我想要做的是:
- 仅在目标对象出现时收集前几帧 - 将它们放入单独的线程中以避免代码阻塞
我已经测量了摄像头每秒捕获的帧数,约为28帧。因此,while循环每秒只会收集前5帧并在另一个线程中处理所有帧,等到所有5个函数完成后再返回结果。
我尝试使用“Pool”和“Queue”,但无法让它工作,while循环仍然被阻塞。下面的代码模糊地表示了我的程序现在的样子,我回家后会进行编辑,现在使用手机发布。
def detect(frame):
# detect target object from images
pass
def nn(frame):
# some heavy processing code
pass
count = 0
stack = []
while True:
frame = cv2.imread(0)
detected = detect(frame)
# stop collecting images when collected 5
if detected and count <= 5:
stack.append(frame)
count += 1
# start processing
if len(stack) == 5:
p = Pool(4)
results = p.map(nn, frame)
p.close()
p.join()
# reset
stack = []
count = 0
我理解正确吗?还是需要像协程一样做些其他事情?