0

昨日も同様の質問があり、あなたの助けのおかげでエラーを推論することができました. さて、今日、私は非常によく似た問題に遭遇しましたが、私のレベルが最高でも、この特定のコードでセグメンテーション違反の原因を突き止めることができません。

    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 Ubuntu 11.10およびOpenCv2.4.3でopencvを実行しています

デバッガーの出力:

"プログラムは信号 SIGSEGV、セグメンテーション違反を受け取りました。0x001b7c5c in cv::minMaxIdx(cv::_InputArray const&, double*, double*, int*, int*, cv::_InputArray const&) () from /usr/local/lib/ libopencv_core.so.2.4"

4

2 に答える 2

3

コードをデバッグせずに見ると、問題はdst初期化されていないことだと思います。

マトリックスを使用する前に、マトリックスにメモリを割り当てる必要があります。

OpenCv ドキュメントへのこのリンクを確認してください。使用方法の非常に良い例がありますminMaxLoc()。そこの項目nº7に特に注意してください。

ただし、コメントに記載されているように、デバッガーの使用方法、実行時にすべての変数を検査する方法、値を持つべき NULL があるかどうかを確認する方法を学習することは、学ぶのに良いことです。デバッガーはプログラマーの親友です ;)

私が見たもう 1 つの問題は ですestimation。これは NULL であり、呼び出しの直後に逆参照しようとしますminMaxLoc。この関数から覚えていることから、推定の値は変わりませんが、間違っている可能性があります。

于 2012-12-26T10:17:45.413 に答える
0

エラーは、#Castilho によるポインタ アウトとして、minMaxLoc の使用にありました。次の変更は、セグメンテーション違反を解決するのに役立ちました。

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

ご協力ありがとうございました :)。

于 2012-12-26T14:13:08.617 に答える