连通组件清理 cv2.arcLength OpenCv: 断言失败

0 投票
1 回答
3713 浏览
提问于 2025-04-17 17:25

我正在尝试在 OpenCV 2.3.4 的 Python 接口中实现连接组件噪声去除,具体内容可以从 Learning 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.3\modules\imgproc\src\contours.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 个回答

2

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 中轮廓操作的细节,可以点击这里。

撰写回答