找轮廓断言失败。

3
我是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))在create中,文件C:\ opencv \ modu les \ core \ src \ matrix.cpp,第1466行。

我需要一个类来表示单个轮廓并集成轮廓分析方法。 我知道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;
}
2个回答

7

首先,让我说一下:试图以多态的方式使用标准库容器是一个糟糕的 想法。不要这样做。在你的情况下甚至没有必要。

解决你的问题很简单:放弃class CONTOUR并传递vector<vector<cv::Point>>。这是因为cv::findContours()要求你传递其中之一或等效的cv::Mat。这是因为它使用代理类型作为参数,只能从这些类型构造,因此会出现断言失败。如果你想定义一个轮廓的简写,使用typedef std::vector<cv::Point> Contour而不是#define CONTOUR。这可以给你带来类型安全的好处。

此外,vector<CONTOUR>vector<vector<Point>>不是相同类型。尽管CONTOUR继承自vector<cv::Point>,但它们是不同的类型。因此,它们的向量也是不同的类型。这个答案 对理解这个问题也可能有帮助。
此外,我注意到在你的代码中,CONTOUR是从vector<cv::Point>派生而来的。这个断言表明你需要一个向量的向量:vector<vector<cv::Point>>

感谢您的回答。我编辑了我的问题,希望它更清晰明了。 - Arloong
1
@Arloong 在这个网站上,如果您将解决方案发布为答案,并接受最有帮助的答案会更好。除此之外,我强烈建议您不要使用您发布的解决方案。虽然它可以工作,但它引入了不必要的复杂性。 - Aurelius

1
在findContour函数中发生的断言失败错误只是由于编译器与OpenCV二进制文件不匹配。请从项目属性中选择适当的编译器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接