打印结果后再次调用cv2.connectedComponents会崩溃

时间:2018-09-06 12:29:50

标签: python opencv raspberry-pi3 cv2

在调用cv2.connectedComponents时,打印其结果然后再次调用时,第二次调用时出现分段错误。我设法将其缩小为以下示例:

#!/usr/bin/python
import cv2
import numpy as np

if __name__ == "__main__":
    img = np.array([
        [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
        [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
        [255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255],
        [255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255],
        [255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255],
        [255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255],
        [255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255],
        [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
        [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
        ], dtype=np.uint8)

    res1 = cv2.connectedComponents(img)
    print(res1)
    cv2.connectedComponents(img)  # < here it is crashing
    print("done")

执行它时,得到以下输出:

(2, array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
       [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
       [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
       [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
       [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], dtype=int32))
Segmentation fault

特别奇怪的是:当我取出print(res1)时,它到达末尾(打印“完成”)而没有错误。 同样,当我缩小图像尺寸时,也没有错误。

这是在带有OpenCV 3.3.0的Raspberry Pi上发生的。 我无法在笔记本电脑上重现该错误(Ubuntu 16.04,OpenCV 3.3.1)。

这是一个(也许是已知的)错误吗?还是我做错了什么?

1 个答案:

答案 0 :(得分:1)

经过调试,我们发现问题是由TBB库引起的,似乎与this issue中的问题相同。

在没有TBB的情况下重新编译OpenCV之后,它现在可以工作了。根据链接的问题,使用较新版本的TBB进行编译也可能会有所帮助,但我们尚未对此进行测试。