分段错误:当我尝试创建 cv::mat 时出现 Malloc 问题

问题描述 投票:0回答:1

我正在尝试创建一个

cv::Mat
来处理图像金字塔,源代码来自ORBSLAM3,我添加了一些新内容,我得到了这个输出,这是我的代码:(错误并不是每次运行这部分代码时都会出现)

void ORBextractor::ComputePyramid(cv::Mat image, cv::Mat Mask) {
        for (int level = 0; level < nlevels; ++level)
        {
            // cout << "error-0" << endl;
            float scale = mvInvScaleFactor[level];
            Size sz(cvRound((float)image.cols*scale), cvRound((float)image.rows*scale));
            Size wholeSize(sz.width + EDGE_THRESHOLD*2, sz.height + EDGE_THRESHOLD*2);
            cout << "error-0-1" << endl;
            cout << "error-1" << endl;
            cv::Mat temp(wholeSize, image.type()); // program crushed here
            mvImagePyramid[level] = temp(Rect(EDGE_THRESHOLD, EDGE_THRESHOLD, sz.width, sz.height));

            if (!Mask.empty()) {
                // masktemp = Mat(wholeSize, Mask.type());
                // mvMaskPyramid[level] = masktemp(Rect(EDGE_THRESHOLD, EDGE_THRESHOLD, sz.width, sz.height));
                cv::Mat resized_mask(sz, Mask.type());
                // cout << "error-2" << endl;
                resize(Mask, resized_mask, sz, 0, 0, INTER_NEAREST);
                resized_mask.copyTo(mvMaskPyramid[level]);
            }

            // Compute the resized image
            if( level != 0 )
            {
                resize(mvImagePyramid[level-1], mvImagePyramid[level], sz, 0, 0, INTER_LINEAR);

                copyMakeBorder(mvImagePyramid[level], temp, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD,
                               BORDER_REFLECT_101+BORDER_ISOLATED);
            }
            else
            {
                copyMakeBorder(image, temp, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD,
                               BORDER_REFLECT_101);
            }

        }
    }

enter image description here

我对 opencv 还很陌生,谁能告诉我为什么会出现这个错误。

c++ segmentation-fault malloc
1个回答
0
投票

我已经找到了这个问题的原因,在同一个函数作用域中,有另一个函数修改了不属于它的内存,而这个mat创建代码分配了29w字节的内存空间,这个空间相当大,有时它恰好分配了内存被函数 A 非法修改,并导致此错误。感谢您的所有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.