我正在尝试创建一个
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);
}
}
}
我对 opencv 还很陌生,谁能告诉我为什么会出现这个错误。
我已经找到了这个问题的原因,在同一个函数作用域中,有另一个函数修改了不属于它的内存,而这个mat创建代码分配了29w字节的内存空间,这个空间相当大,有时它恰好分配了内存被函数 A 非法修改,并导致此错误。感谢您的所有帮助。