以下是我程序的简化版本:
import cv2
import multiprocessing
import numpy
import copy
import time
def f(d, img):
t0 = d[1]
print("before")
print(type(t0))
Bg_sub_img = t0.apply(img,learningRate=0.1)
print("after")
t0 = cv2.bgsegm.createBackgroundSubtractorMOG(history=20)
d = multiprocessing.Manager().dict()
#d = {}
#d[1] = copy.deepcopy(t0)
d[1] = t0
img = cv2.imread('test.jpg', 0)
print(type(t0))
p = multiprocessing.Process(target=f, args=(d,img))
p.start()
time.sleep(10)
p.join()
这将导致以下输出:
<type 'cv2.bgsegm_BackgroundSubtractorMOG'>
before
<type 'cv2.bgsegm_BackgroundSubtractorMOG'>
Process Process-2:
Traceback (most recent call last):
File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "amrutha.py", line 12, in f
Bg_sub_img = t0.apply(img,learningRate=0.1)
TypeError: Incorrect type of self (must be 'BackgroundSubtractor' or its derivative)
如果您尝试仅作为常规功能运行程序,而不进行多处理,则可以正常运行。但是,如果我不直接获取变量t0,而是对其进行深层复制(即使将其用作常规函数且未在进程中运行),也会遇到相同的错误。
如果我尝试在多处理中传递变量(而不是字典),那么它也可以正常工作。
不确定为什么会这样。当在一个单独的过程中使用它时,它通过二元传递对象时是否会复制对象?也许这就是它在多处理功能中失败的原因?
仅供参考: Ubuntu 16.04 Python 2.7 OpenCV:3.4.0