我是C ++和opencv的新手。我写了一个简单的程序,你可以在下面找到,但是当我运行它时,我总是得到findContours(img, ctr, CV_RETR_LIST, CV_CHAIN_APPROX_NONE)
抛出的异常,类型断言失败
OpenCV错误:断言失败(mtype == type0 ||(CV_MAT_CN(mtype)== CV_MAT_CN (type0)&& ((1<<<<<< type0)& fixedDepthMask)!= 0))在创建,文件C:\ opencv \ modu les \ core \ src \ matrix.cpp,第1466行。
我需要一个代表单个轮廓的类并集成轮廓分析方法。我知道CONTOUR
与vector<Point>
的类型不同,但由于它扩展了后者,因此CONTOUR
也不应该是vector<Point>
类型(并且以同样的方式{ {1}}也是vector<CONTOUR>
)?我错了吗?
请注意,如果您将vector< vector<Point> >
声明为源自CONTOUR
的类,并在下面的代码中将vector<vector<Point>>
声明为Ctr
对象,而不是CONTOUR
一切都很顺利。
非常感谢提前。
这是我的代码
vector<CONTOUR>
答案 0 :(得分:6)
首先,请允许我这样说:尝试以多态方式使用标准库容器是Bad Idea。不要这样做。在你的情况下甚至不需要。
您的问题的解决方法很简单:省略class CONTOUR
并传递vector<vector<cv::Point>>
。这是因为cv::findContours()
要求您传递一个或等效的cv::Mat
。这是因为它使用代理类型作为参数,只能从这些类型构造,因此断言失败。如果要为轮廓定义速记,请使用typedef std::vector<cv::Point> Contour
,而不是#define CONTOUR
。这为您提供了类型安全的好处。
此外,vector<CONTOUR>
NOT 与vector<vector<Point>>
的类型相同。即使CONTOUR
继承自vector<cv::Point>
,它们也是不同的类型。因此,它们的载体也是不同的类型。 This answer也可能有助于理解此问题。
另外,我注意到在您的代码中,CONTOUR
派生自vector<cv::Point>
。这个断言表明你需要一个向量向量:vector<vector<cv::Point>>
。
答案 1 :(得分:1)
findContour函数中的断言失败错误只是由于编译器和opencv二进制文件不匹配。 从项目属性中选择适当的编译器。