findcontours断言失败了

时间:2013-07-22 21:23:28

标签: c++ exception opencv inheritance

我是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行。

我需要一个代表单个轮廓的类并集成轮廓分析方法。我知道CONTOURvector<Point>的类型不同,但由于它扩展了后者,因此CONTOUR也不应该是vector<Point>类型(并且以同样的方式{ {1}}也是vector<CONTOUR>)?我错了吗?

请注意,如果您将vector< vector<Point> >声明为源自CONTOUR的类,并在下面的代码中将vector<vector<Point>>声明为Ctr对象,而不是CONTOUR一切都很顺利。

非常感谢提前。

这是我的代码

vector<CONTOUR>

2 个答案:

答案 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二进制文件不匹配。 从项目属性中选择适当的编译器。