c – findcontours断言失败

c – findcontours断言失败,第1张

概述我是C和opencv的新手.我写了一个你可以在下面找到的简单程序,但是当我运行它时,我总是得到一个由类型断言引发的findContours(img,ctr,CV_RETR_LIST,CV_CHAIN_APPROX_NONE)引发的异常失败 OpenCV Error: Assertion failed (mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN 我是C和opencv的新手.我写了一个你可以在下面找到的简单程序,但是当我运行它时,我总是得到一个由类型断言引发的findContours(img,ctr,CV_RETR_List,CV_CHAIN_APPROX_NONE)引发的异常失败

OpenCV Error: Assertion Failed (mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN
(type0) && ((1 << type0) & fixedDepthMask) != 0)) in create,file C:\opencv\modu
les\core\src\matrix.cpp,line 1466.

我需要一个代表单个轮廓的类并集成轮廓分析方法.我知道CONTOUR是一个与矢量< Point>不同的类型.但是因为它扩展了后者,所以不应该是CONTOUR也是矢量< Point>类型(并且以相同的方式向量< CONTOUR>也是向量< vector< Point>>)?我错了吗?

请注意,如果您将CONTOUR声明为派生自vector< vector< Point>>的类.并在下面的代码中声明Ctr作为CONTOUR对象代替向量< 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,CV_BGR2GRAY);                Canny(img,20,80,3);                findContours(img,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));                    drawContours(shape,i,color,1,8);                }                imshow("VIDEO",shape);                if(waitKey(30) >= 0)                {                    break;                }            }        }    }    else    {        cout << "Camera not opened" << endl;    }    return 0;}
解决方法 首先,请允许我这样说:尝试以多态方式使用标准库容器是 Bad Idea.不要这样做.在你的情况下甚至没有必要.

解决问题很简单:省去CONTOUR类并传递一个向量< vector< cv :: Point>>.这是因为cv :: findContours()要求你传递一个或等效的cv :: Mat.这是因为它使用代理类型作为参数,只能从这些类型构造,因此断言失败.如果要为轮廓定义速记,请使用typedef std :: vector< cv :: Point>轮廓,而不是#define轮廓.这为您提供了类型安全的好处.

另外,矢量< CONTOUR>与vector< vector< Point>>的类型不同.即使CONTOUR继承自vector< cv :: Point>,它们也是不同的类型.因此,它们的载体也是不同的类型. This answer也可能有助于理解这个问题.

此外,我注意到在您的代码中,CONTOUR派生自vector< cv :: Point>.这个断言表明你需要一个向量向量:vector< vector< cv :: Point>&gt ;.

总结

以上是内存溢出为你收集整理的c – findcontours断言失败全部内容,希望文章能够帮你解决c – findcontours断言失败所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1215283.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存