0

OpenCVの学習の287ページから概説されているように、OpencCV 2.3.4PythonAPIで連結成分のノイズ除去を実装しようとしています。

等高線の長さを計算するところまで行ったところ、不可解なアサーションエラーが発生しました。

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'

エラーが何を意味し、どうすればそれを回避できるかについてのアイデアはありますか?

4

1 に答える 1

2

1-等高線と階層cv2.findContours()の2つの出力を提供します。輪郭のみを指定しました。したがって、次のように行を変更します(これが主なエラーです):

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

2- contoursnumpy配列のリストです。各配列は等高線です。したがって、輪郭を渡すときにcv2.arcLength()、それを再びnumpy配列にする必要はありません。(エラーではありませんが、不要な操作です)ので、その行を次のように変更します。

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

次に、コードを試して、機能するかどうかを確認します。

OpenCVでの等高線操作の詳細については、こちらをご覧ください。

于 2013-02-28T11:08:15.503 に答える