除非我先pickle / unpickle,否则drawContours数据类型错误

时间:2012-11-12 00:44:29

标签: python opencv

我在Windows上的python 2.7.3上使用opencv 2.4.3遇到了一个有趣的错误。当试图使用drawContours时,我得到一个“TypeError:不支持轮廓数据类型= 5”错误,除非我首先挑选/取消轮廓。

这不起作用(我得到“TypeError:不支持轮廓数据类型= 5”):

noBg = cv2.blur(src, (5,5))
noBg = cv2.inRange(noBg, np.array([80, 0, 200], np.uint8), np.array([255, 50, 255], np.uint8)) 
noBg = np.invert(noBg)
contours, hierarchy = cv2.findContours(noBg, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(src, contours, -1, (0,255,0), 3) 

但这确实有效:

noBg = cv2.blur(src, (5,5))
noBg = cv2.inRange(noBg, np.array([80, 0, 200], np.uint8), np.array([255, 50, 255], np.uint8)) 
noBg = np.invert(noBg)
contours, hierarchy = cv2.findContours(noBg, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

tmp = cPickle.dumps(contours)    
contours = cPickle.loads(tmp)

cv2.drawContours(src, contours, -1, (0,255,0), 3) 

有没有其他人看过这种行为,或者我错过了一些明显的东西?我是python / opencv的新手,所以很可能就是这种情况。

修改:刚刚在我的Mac上测试过,两种情况都可以正常使用。也许只是一个Windows问题?

3 个答案:

答案 0 :(得分:8)

如果你降级到opencv 2.4.2,这将有效。这似乎是两周前刚刚发布的2.4.3的错误。

答案 1 :(得分:4)

在使用findContours和convexHull的轮廓时,我在获得OpenCV 2.4.3后遇到了同样的问题。因为我不想降级,所以将contours数组元素转换为int可以暂时解决问题。

contours, _ = cv2.findContours(noBg,cv2.RETR_LIST ,cv2.CHAIN_APPROX_SIMPLE,offset = (0,0))
hull_contour = cv2.convexHull(contours[0].astype('int'))

答案 2 :(得分:0)

绘制折线时遇到了类似的问题。它预计会有32位整数。

我将点数转换为uint32:

use_points = np.uint32(original_points)

问题在于它期望有32位的有符号整数,而不是无符号整数。它是代码中的一个子类,因此很难找到,但后来这很有效:

use_points = np.int32(original_points)

只使用np.int32代替np.uint32