【问题标题】:Python3 & Opencv3 & Multiprocessing raise System ErrorPython3 & Opencv3 & Multiprocessing 引发系统错误
【发布时间】:2014-12-17 00:15:27
【问题描述】:

我目前正在使用 OpenCV 3 和 python 3.4。我的机器是一台装有 OS X 10.10 (Yosemite) 的 MacBook Pro,我在使用 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”命令没有运行...

日期: 在 _func 方法中,如果我添加打印或创建文件作为打印和创建的第一条指令,这意味着该进程已启动。 执行抓取(在段函数中)和 cvtcolor 时会出现问题。如果其中之一没有执行,则根本没有问题。怎么可能有关系?

我也尝试过使用multiprocessing.dummy.Process,它奏效了。 可能是 OpenCV 的问题?

【问题讨论】:

  • 尝试将with open('temp.txt', 'w') as fo: pass 添加到您的_func() 函数中。再次运行它并查看您当前的工作目录。如果您看到文件“temp.txt”,那么您至少知道您的子进程正在正确启动。如果您没有看到该文件,则说明您尝试启动进程的方式有问题。
  • 如果您使用multiprocessing.dummy.Process(线程而不是进程),它是否有效?如果您将_func(self) 设为全局函数(我没有看到self 在任何地方使用),删除segment() 调用等,它会崩溃吗?
  • 是的 skgrrgwasme。我试过了,它会创建文件。 J.F Sebastian,我尝试了线程方法,是的,它就是这样工作的。关于作为一个类方法,使用self,就是这样,因为它是重现错误的简化代码,但在我的代码中我需要传递self参数。无论如何,如果我把它变成一个函数(不在课堂上,没有自我)它无论如何都会崩溃。如果我删除段调用,它会起作用。如果我删除 cv2.cvtColor 调用,它会起作用。如果两者都存在,则会引发错误。我会更新我的问题。

标签: python opencv python-3.x python-multiprocessing opencv3.0


【解决方案1】:

好吧,我终于解决了。这是OpenCV的编译和安装问题。无法真正判断出什么问题,但我检查了 homebrew 如何配置 OpenCV 并对其进行了调整(添加了 python 3 支持)。

感谢您的帮助。

【讨论】:

  • 遇到同样的问题。这将有助于解释解决方案。
  • 现在我在其他场景中测试时仍然遇到问题...我会尝试找到解决方案并在此处发布...
猜你喜欢
  • 1970-01-01
  • 2015-10-24
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 2012-01-23
  • 2016-12-05
相关资源
最近更新 更多