Я пытаюсь использовать метод 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)
, когда я использую вAndAndCompute в 1 главномПоток работает нормально, но при запуске с многопроцессорным пулом возникает исключение.
Обновление: при использовании класса упакованного потока (как показано ниже):
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
, кажется, работает нормально иверните значения, которые мне нужны (эта конкретная оболочка потока используется для другой части проекта, и эта оболочка, кажется, работает).
Цените любые замечания по этому вопросу.
Спасибо заВаше время,
С уважением, Дэвид.