关于C++:FordTraces断言失败findcontours assertion failed

findcontours assertion failed

我是C++和OpenCV的新手。我已经编写了一个简单的程序,您可以在下面找到它,但是当我运行它时,总是会得到由类型断言失败引发的findContours(img, ctr, CV_RETR_LIST, CV_CHAIN_APPROX_NONE)引发的异常。

OpenCV Error: Assertion failed (mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN
(type0) && ((1 << type0) & fixedDepthMask) != 0)) in create, file C:\opencv\modu les\core\src\matrix.cpp, line 1466.

我需要一个表示单个轮廓并集成轮廓分析方法的类。我知道CONTOURvector是不同的类型,但是由于它扩展了后者,CONTOUR不应该也是vector类型(同样地,vector也是vector< vector >类型吗?我错了吗?

请注意,如果您声明CONTOUR是从vector>派生的类,并且在下面的代码中声明Ctr是一个CONTOUR对象,而不是vector,那么一切都会好起来的。

非常感谢。

这是我的密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include"opencv2/opencv.hpp"

#include <vector>

using namespace cv;
using namespace std;

class CONTOUR : public vector<Point>
{
public:
    CONTOUR() : vector<Point>(){ };
    CONTOUR(const CONTOUR& orig) : vector<Point> (orig){ };
    virtual ~CONTOUR(){ };

    CONTOUR& operator=(const CONTOUR& rhs)
    {
        vector<Point> :: operator = (rhs);
        return *this;
    }

    CONTOUR& operator=(const vector<Point>& rhs)
    {
        vector<Point> :: operator = (rhs);
        return *this;
    }
};

/** @function main */
int main(int argc, char** argv)
{
    VideoCapture Camera;

    if(Camera.open(0))
    {
        Mat img;

        namedWindow("VIDEO", CV_WINDOW_AUTOSIZE);

        for(;;)
        {

            Camera >> img;

            if(!img.empty())
            {
                CONTOUR ctr;
                RNG n(12345);

                GaussianBlur(img, img, Size(5,5), 1.0, 1.0);
                cvtColor(img, img, CV_BGR2GRAY);
                Canny(img, img, 20, 80, 3);

                findContours(img, ctr, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);

                Mat shape = Mat::zeros( img.size(), CV_8UC3 );

                for( unsigned int i = 0; i< ctr.size(); i++ )
                {
                    Scalar color(n.uniform(0,255), n.uniform(0,255), n.uniform(0,255));
                    drawContours(shape, ctr, i, color, 1, 8);
                }

                imshow("VIDEO", shape);

                if(waitKey(30) >= 0)
                {
                    break;
                }
            }
        }
    }
    else
    {
        cout <<"Camera not opened" << endl;
    }

    return 0;
}


首先,请允许我这样说:尝试以多态方式使用标准库容器是一个坏主意。不要这样做。在你的情况下甚至都没有必要。

解决问题的方法很简单:去掉class CONTOUR,然后传递vector>。这是因为cv::findContours()要求您通过一个that或等效的cv::Mat。这是因为它使用代理类型作为参数,该参数只能从这些类型构造,因此断言失败。如果要定义轮廓的简写,请使用typedef std::vector Contour,而不是#define CONTOUR。这给了你类型安全的好处。

另外,vectorvector>的类型不同。虽然CONTOUR继承了vector的遗产,但它们是不同的类型。因此,它们的向量也是不同的类型。这个答案也有助于理解这个问题。

另外,我注意到在您的代码中,CONTOUR是从vector派生出来的。这个断言声明您需要一个向量向量向量:vector>


findcontour函数中的断言失败错误仅由于编译器和opencv二进制文件不匹配。从项目属性中选择正确的编译器。