我正在尝试将cv2 detectAndCompute方法与多处理池一起使用,如下所示:
import cv2
from multiprocessing import Pool
orb = cv.ORB_create(nfeatures=5000, scoreType=cv.ORB_HARRIS_SCORE, edgeThreshold=5, patchSize=35, scaleFactor=1.5,
nlevels=8, WTA_K=3)
old_lab = cv.cvtColor(old_frame, cv.COLOR_RGB2LAB)
new_lab = cv.cvtColor(new_frame, cv.COLOR_RGB2LAB)
with Pool(6) as p:
res = p.starmap(orb.detectAndCompute, [[old_lab[:, :, 0], None],
[new_lab[:, :, 0], None],
[old_lab[:, :, 1], None],
[new_lab[:, :, 1], None],
[old_lab[:, :, 2], None],
[new_lab[:, :, 2], None]])
kp1_l, des1_l = res[0][0], res[0][1]
kp2_l, des2_l = res[1][0], res[1][1]
kp1_a, des1_a = res[2][0], res[2][1]
kp2_a, des2_a = res[3][0], res[3][1]
kp1_b, des1_b = res[4][0], res[4][1]
kp2_b, des2_b = res[5][0], res[5][1]
不幸的是,我收到以下异常:
Incorrect type of self (must be 'Feature2D' or its derivative)
当我在1个主线程中使用detectAndCompute时,它可以正常工作,但在多进程池中运行它时会引发异常。
更新: 使用包装的线程类时(如下所示):
class ThreadWithReturnValue(Thread):
def __init__(self, group=None, target=None, name=None,
args=(), kwargs={}, Verbose=None):
Thread.__init__(self, group, target, name, args, kwargs)
self._return = None
def run(self):
if self._target is not None:
self._return = self._target(*self._args, **self._kwargs)
def join(self, *args):
Thread.join(self, *args)
return self._return
它似乎可以正常工作并返回我需要的值(此特定的线程包装器用于项目中的其他部分,并且该包装器似乎可以工作)。
感谢对此事的任何投入。
感谢您的时间,
大卫,真诚地