3

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

OpenCV 错误:在创建文件 C:\opencv\modules 时断言失败 (mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN (type0) && ((1 << type0) & fixedDepthMask) != 0)) \core\src\matrix.cpp,第 1466 行。

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

请注意,如果您声明CONTOUR为派生自的类,并在下面的代码中vector<vector<Point>>声明为对象,则一切正常。CtrCONTOURvector<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;
}
4

2 回答 2

7

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

解决您的问题很简单:省去class CONTOUR并通过vector<vector<cv::Point>>. 这是因为cv::findContours()要求您通过 a that 或等价物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>>

于 2013-07-22T21:59:13.427 回答
1

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

于 2017-11-16T10:34:47.010 回答