多处理cv2 detectAndCompute TypeError

时间:2018-10-03 15:57:42

标签: multiprocessing pool cv2 orb

我正在尝试将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

它似乎可以正常工作并返回我需要的值(此特定的线程包装器用于项目中的其他部分,并且该包装器似乎可以工作)。

感谢对此事的任何投入。

感谢您的时间,

大卫,真诚地

0 个答案:

没有答案