findcontours 断言失败

Posted

技术标签:

【中文标题】findcontours 断言失败【英文标题】:findcontours assertion failed 【发布时间】:2013-07-22 21:23:27 【问题描述】:

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

OpenCV 错误:断言失败 (mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN (type0) && ((1

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

请注意,如果您将CONTOUR 声明为从vector<vector<Point>> 派生的类,并在下面的代码中将Ctr 声明为CONTOUR 对象而不是vector<CONTOUR>,则一切正常。

非常感谢。

这是我的代码

#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;

【问题讨论】:

【参考方案1】:

首先,请允许我这样说:尝试多态地使用标准库容器是BadIdea。不要这样做。在你的情况下甚至没有必要。

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

另外,vector&lt;CONTOUR&gt;vector&lt;vector&lt;Point&gt;&gt; 的类型相同。尽管CONTOUR 继承自vector&lt;cv::Point&gt;,但它们是不同的类型。因此,它们的向量也是不同的类型。 This answer 也可能有助于理解这个问题。

另外,我注意到在您的代码中,CONTOUR 派生自 vector&lt;cv::Point&gt;。该断言表明您需要一个向量向量:vector&lt;vector&lt;cv::Point&gt;&gt;

【讨论】:

感谢您的回答。编辑我的问题希望它更清楚一点。 @Arloong 在这个网站上,最好是post your solution as an answer 和accept 最有帮助的那个。除此之外,我强烈建议您不要使用您发布的解决方案。当然,它有效,但它引入了不必要的复杂性。【参考方案2】:

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

【讨论】:

以上是关于findcontours 断言失败的主要内容,如果未能解决你的问题,请参考以下文章

有朋友遇到“断言失败”错误提示吗,怎么解决呢?

断言方法

Gtest学习系列三:断言

UIWindowController 断言失败

[C#FluentAssertions在断言失败后继续

Java 断言问题