OpenCV minMaxLoc函数中出现分段错误



我昨天也遇到过类似的问题,多亏了您的帮助,我才找到了错误的原因。好吧,今天我遇到了一个非常类似的问题,但是,以我最好的水平,我仍然无法在这个特定的代码中找到分割故障的原因。

    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中执行opencvUbuntu 11.10和OpenCv2.4.3

调试器输出:

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

看看你的代码,没有调试它,我猜问题是dst,它还没有初始化。

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

检查这个链接到OpenCv文档,它有一个非常关于如何使用minMaxLoc()的好例子。请特别注意第7条。

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

我看到的另一个问题是estimation,它是NULL,你试图在调用minMaxLoc之后解引用它。从我对这个函数的记忆来看,它不会改变估计的值,但我可能错了。

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

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

谢谢你的帮助

相关内容

  • 没有找到相关文章

最新更新