В момента използвам 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()
Проблемът е, че никога не стига до "Готово!!" печат, тъй като се счупи, показвайки съобщение за грешка на OS X. Пълното съобщение за грешка е в този GIST
Занимавам се с това известно време и не можах да намеря точната причина за тази грешка. Ако не изпълня командата "cvtcolor", няма никакъв проблем. Както и ако командата "grabcut" не се изпълнява...
UDATE: В метода _func, ако добавя печат или създам файл като първа инструкция, той се отпечатва и създава, което означава, че процесът се стартира. Проблемът се появява, когато се изпълнят както grabcut (в сегментната функция), така и 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