【发布时间】:2021-12-27 09:50:28
【问题描述】:
我有正在更新的 openCV 跟踪器对象。为了让事情变得更快,我使用了带有 map_async 函数的多处理池来并行工作。它按预期工作,我得到了显着的加速。但是一件事很奇怪/不起作用。当我用 openCV 重新初始化我的跟踪器时(意味着给它们一个新的边界框),跟踪器没有更新,而是继续使用之前的边界框。这仅在使用多处理池时发生,但在跟踪器列表上使用顺序循环时不会发生。我怀疑该过程会制作自己的跟踪器对象副本,因此跟踪器的重新初始化不适用于该新创建的对象。但是据我了解,当我调用函数 map_async 时,会创建一个新进程,并且使用 process.wait() 它正在等待该进程完成其工作。
我已经尝试在每次调用 updateTrackers() 函数时创建一个新池。这并没有解决问题。
工作重新初始化顺序代码:
def updateTrackers(self, frame):
for t in self.trackers:
t.update()
不工作的重新初始化顺序代码:
def updateTrackers(self, frame):
processes = []
# create a process for each tracker
for t in self.trackers:
processes.append(self.ProcessPool.map_async(t.update, (frame, )))
# wait for the processes to finish
for p in processes:
p.wait()
两种情况下重新初始化跟踪器对象的代码都是一样的:
def reInitTracker(self, index, frame):
if index >= self.nmbTrackers:
return
initBB = cv2.selectROI("Camera view", frame, fromCenter=False,
showCrosshair=True)
self.trackers[index].tracker.clear()
self.trackers[index].tracker = cv2.TrackerKCF_create()
self.trackers[index].tracker.init(frame, initBB)
编辑: 我刚刚发现跟踪器在并行化它们时没有得到更新。现在更一致的是它们也没有被初始化。
【问题讨论】:
标签: python dictionary opencv asynchronous multiprocessing