В настоящее время я использую OpenCV 3 с python 3.4. Моя машина — MacBook Pro с OS X 10.10 (Yosemite), и у меня возникают проблемы при использовании некоторых функций OpenCV в сочетании с многопроцессорной библиотекой. Вот (очень) упрощенный пример кода, который воспроизводит ошибку:
import multiprocessing
import numpy
import cv2
class Sample():
def __init__(self):
self.mask = [] # Testing
def experiment(self):
img = cv2.imread("/Users/luigolas/PycharmProjects/PyReid/tests/test_resources/P2/cam1/P2_001_cam1_1.png")
self.mask.append(segment(img))
print("Segmented!")
processes = [multiprocessing.Process(target=self._func) for i in range(3)]
_ = [p.start() for p in processes]
_ = [p.join() for p in processes]
def _func(self):
img = cv2.imread("/Users/luigolas/PycharmProjects/PyReid/tests/test_resources/P2/cam2/P2_001_cam2_1.png")
cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
print("Done!!")
def segment(image):
bgdmodel = numpy.zeros((1, 65), numpy.float64)
fgdmodel = numpy.zeros((1, 65), numpy.float64)
mask_source = "/Users/luigolas/PycharmProjects/PyReid/resources/masks/OptimalMask.txt"
mask = numpy.loadtxt(mask_source, numpy.uint8)
cv2.grabCut(image, mask, None, bgdmodel, fgdmodel, 2, cv2.GC_INIT_WITH_MASK)
mask = numpy.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')
return mask
if __name__ == '__main__':
t = Sample()
t.experiment()
Проблема в том, что он никогда не доходит до "Готово!!" print, так как он прерывается, показывая сообщение об ошибке OS X. Полное сообщение об ошибке находится в этом GIST.
Я застрял с этим некоторое время и не смог найти точную причину этой ошибки. Если я не запускаю команду «cvtcolor», проблем вообще нет. Как и если бы не запускалась команда "grabcut"...
UDATE: В методе _func, если я добавляю печать или создаю файл в качестве первой инструкции, он печатается и создается, что означает запуск процесса. Проблема возникает, когда одновременно выполняются функции захвата (в функции сегмента) и cvtcolor. Если один из них не выполняется, то вообще нет проблем. Как это вообще может быть связано?
Я также пытался использовать multiprocessing.dummy.Process
, и это сработало. Может проблема с OpenCV?
with open('temp.txt', 'w') as fo: pass
к вашей функции_func()
. Запустите его снова и посмотрите в свой текущий рабочий каталог. Если вы видите файл «temp.txt», то вы знаете, что по крайней мере ваши подпроцессы запускаются правильно. Если вы не видите файл, значит что-то не так с тем, как вы пытаетесь запустить процессы. - person skrrgwasme   schedule 22.10.2014multiprocessing.dummy.Process
(поток вместо процесса)? Произойдет ли сбой, если вы сделаете_func(self)
глобальной функцией (я нигде не вижу, чтобыself
использовалась), удалите вызовsegment()
и т. д.? - person jfs   schedule 22.10.2014