对接部件清洗cv2.OpenCv:断言失败



我正在尝试实现连接组件噪声去除,在OpencCV 2.3.4 Python API中,从学习OpenCV第287页开始概述

我已经计算了轮廓的长度,其中我得到了一个神秘的断言错误。

OpenCV Error: Assertion failed (curve.checkVector(2) >= 0 && (curve.depth() == CV_32F || curve.depth() == CV_32S)) in unknown function, file ......OpenCV-2.4.3modulesimgprocsrccontours.cpp, line 1886
下面是我的代码:
import cv2
import os
import numpy as np
import cPickle
CVCONTOUR_APPROX_LEVEL = 2
CVCLOSE_ITR = 1
def main():
    mask = cv2.imread('input.jpg', cv2.CV_LOAD_IMAGE_GRAYSCALE)
    findConnectedComponents(mask)
def findConnectedComponents(mask,
                            poly1Hull0 = 1,
                            perimScale = 4,
                            num = None,
                            bbs = None,
                            centers = None):
    cv2.morphologyEx(mask, cv2.MORPH_OPEN, np.array(0), iterations=CVCLOSE_ITR)
    cv2.morphologyEx(mask, cv2.MORPH_CLOSE, np.array(0), iterations=CVCLOSE_ITR)
    contours = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    #the Pickle trick solves some strange type errors
    tmp = cPickle.dumps(contours)    
    contours = cPickle.loads(tmp)
    for contour in contours:
        perimeter = cv2.arcLength(np.array(contour), True)
if __name__ == '__main__':
    main()
    print 'done'

你知道这个错误意味着什么吗?我该如何解决这个问题?

1 - cv2.findContours()提供了两个输出,轮廓和层次。您只指定了轮廓。因此,将行修改如下(这是主要错误):

contours,hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

2 - contours是一个numpy数组列表。每个阵列都是一个轮廓线。所以当你将等高线传递给cv2.arcLength()时,你不需要让它再次成为numpy数组。(这不是错误,而是不必要的操作),因此将该行修改如下:

   for contour in contours:
        perimeter = cv2.arcLength(contour, True)

现在试试你的代码并检查它是否有效!!

有关OpenCV上轮廓操作的更多详细信息,请访问

相关内容

最新更新