C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – findcontours断言失败大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我是C和opencv的新手.我写了一个你可以在下面找到的简单程序,但是当我运行它时,我总是得到一个由类型断言引发的findContours(img,ctr,CV_RETR_LIST,CV_CHAIN_APPROX_NONE)引发的异常失败

我需要一个代表单个轮廓的类并集成轮廓分析方法.我知道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断言失败所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。