通过字典和多处理使用BackgroundSubtractor类型不正确

时间:2018-09-25 16:51:48

标签: python opencv python-multiprocessing

以下是我程序的简化版本:

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

0 个答案:

没有答案