OpenCV minMaxLoc 函数中的分段错误

Posted

技术标签:

【中文标题】OpenCV minMaxLoc 函数中的分段错误【英文标题】:Segmentation fault in OpenCV minMaxLoc function 【发布时间】:2012-12-26 10:04:20 【问题描述】:

我昨天有一个类似的问题,并且能够推理出错误,感谢您的帮助。嗯,今天遇到了一个很相似的问题,但是以我的水平,还是没能找到这段具体代码中段错误的原因。

    int main()
    
        Mat src,dst,src_gray;
        int kernel_size = 3;
        int scale = 1;
        int delta = 0;
        int ddepth = CV_16S;
        char* window_name = "sharpness estimate";
        string dir = string("erez images");
        vector<string> files = vector<string>();
        getdir(dir,files);
        cout<<files.size()<<endl;
        int c;
        double *estimate=0,*min=0;
        Point *minLoc=0,*maxLoc=0;
        string parent = "/home/siddarth/examplescv/erez images/";
        for(int i=1; i<=files.size()-2;i++)
        
            cout<<files.data()[i]<<endl<<i<<endl;
            string path = parent+files.data()[i];
            cout<<path<<endl;
            src = imread(path);

            if( !src.data )
            
                    return -1;
            

            cout<<"check1"<<endl;
            cvtColor(src,src_gray,CV_RGB2GRAY);

            Laplacian(src_gray,dst,ddepth,kernel_size,scale,delta,BORDER_DEFAULT);
            //convertScaleAbs(dst,abs_dst);
            cout<<"check2"<<endl;
            minMaxLoc(dst,min,estimate,minLoc,maxLoc,noArray());
            cout<<"estimate :"<<*estimate<<endl;

        
        waitKey(100000000000);
        return 0;
    

我能够在运行时继续到 check2。我的猜测是由于 minMaxLoc 引起了分段错误。请帮我解决这个问题。如果您能告诉我将来如何解决分段错误以及为什么会发生分段错误,我也会非常高兴。它实际上意味着什么?

注意:getDir 函数是我自己写的,不是内置的。它只是给了我给定目录中的目录和文件列表。

我在 linux 中执行 opencv Ubuntu 11.10 和 OpenCv2.4.3

调试器的输出:

"程序收到信号SIGSEGV,分段错误。0x001b7c5c in cv::minMaxIdx(cv::_InputArray const&, double*, double*, int*, int*, cv::_InputArray const&) () 来自 /usr/local/lib/libopencv_core.so.2.4"

【问题讨论】:

你为什么不尝试使用调试器? 我使用 gdb 来调试我的代码。请检查调试器输出的编辑。正如我猜测的那样,它与 minMaxLoc 函数有关。 【参考方案1】:

看你的代码,没调试,估计是dst的问题,还没初始化。

您必须在尝试使用之前为矩阵分配内存。

Check this link to the OpenCv documentation,它有一个非常很好的例子来说明如何使用minMaxLoc()。请特别注意那里的第 7 项。

但是,正如 cmets 中所述,学习使用调试器、在运行时检查所有变量、检查是否存在应具有值的 NULL 是一件好事。调试器是程序员最好的朋友;)

我看到的另一个问题是estimation,它是NULL,并且您尝试在调用minMaxLoc 之后立即取消引用它。根据我对这个函数的记忆,它不会改变估计的值,但我可能是错的。

【讨论】:

非常感谢您的帮助。将研究这个例子。并且取消引用它确实有效,因为我昨天有另一个类似的代码,它在那里工作:)。 谢谢。错误在于 minMaxLoc 的使用。我初始化了 double 而不是指针并传递了地址。工作顺利。【参考方案2】:

错误在于使用 minMaxLoc,作为 #Castilho 的指针。以下更改帮助我解决了分段错误。

    double estimation,min;
    Point minLoc,maxLoc;
    .
    .
    .
    .
    minMaxLoc(dst,&min,&estimation,&minLoc,&maxLoc,noArray());
    cout<<"estimate :"<<estimate<<endl;

感谢您的帮助:)。

【讨论】:

以上是关于OpenCV minMaxLoc 函数中的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

opencv —— minMaxLoc 寻找图像全局最大最小值

利用OpenCV的函数minMaxLoc()获取图像中像素的最小值最大值以及对应的坐标值

OpenCV-最值计算cv::minMaxIdx&cv::minMaxLoc

在新线程内调用OpenCV函数Canny()会导致分段错误

OpenCV中的分段错误

分段错误原因未知Opencv