0x770BA832 处最可能的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x00B7CF3C 处

时间:2022-06-14 11:04:50
在用导向滤波器进行去雾优化的时候,当影像大小超过3000*3000的时候,运行到如下代码:
        Mat b;
Mat aG;
aG = a.mul(mean_G);
b = mean_P - aG;  就会报错;
0x770BA832 处最可能的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x00B7CF3C 处。
如有适用于此异常的处理程序,该程序便可安全地继续运行。
当我点击继续运行的时候出现:
0x0154065B (opencv_imgproc2413d.dll) 处有未经处理的异常:  0xC0000005:  写入位置 0x00000000 时发生访问冲突。
编译是没有问题的,影像大小小于3000*3000是直接可以运行,当超过时在此处总会出错,菜鸟一枚求指点
Mat guildFilter(cv::Mat g, cv::Mat p, int ksize)  //g代表导向图像 p输入图像 ksize滤波核
{
const double eps = 1.0e-5; //regularization parameter  正则化参数
//类型转换  
Mat _g;
g.convertTo(_g, CV_64FC1);
g = _g;
_g.release();

Mat _p;
p.convertTo(_p, CV_64FC1);
p = _p;
_p.release();

int hei = g.rows;
int wid = g.cols;
Mat N;
boxFilter(Mat::ones(hei, wid, g.type()), N, CV_64FC1, Size(ksize, ksize));

//[1] --使用均值模糊求取各项系数  
Mat mean_G;
boxFilter(g, mean_G, CV_64FC1, Size(ksize, ksize));   //方框滤波函数
mean_G = mean_G / N;

Mat mean_P;
boxFilter(p, mean_P, CV_64FC1, Size(ksize, ksize));
mean_P = mean_P / N;

Mat GP = g.mul(p);
Mat mean_GP;
boxFilter(GP, mean_GP, CV_64FC1, Size(ksize, ksize));
mean_GP = mean_GP / N;

Mat GG = g.mul(g);
Mat mean_GG;
boxFilter(GG, mean_GG, CV_64FC1, Size(ksize, ksize));
mean_GG = mean_GG / N;

Mat cov_GP(hei, wid, CV_64FC1);
cov_GP = mean_GP - mean_G.mul(mean_P);    //mul()函数乘积,点乘

Mat var_G(hei, wid, CV_64FC1);
var_G = mean_GG - mean_G.mul(mean_G);
//[1]  

//求系数a a=(mean(GP)-mean(G)mean(p))/(mean(GG)-mean(G)mean(G)+eps)  
Mat a(hei, wid, CV_64FC1);
a = cov_GP / (var_G + eps);

//求系数的均值  
Mat mean_a;
boxFilter(a, mean_a, CV_64FC1, Size(ksize, ksize));
mean_a = mean_a / N;

//求系数b b=mean(P)-mean(G)*a  

Mat aG;
multiply(a, mean_G, aG);
Mat b;// = mean_P - aG;
subtract(mean_P, aG, b);
/*Mat b;
Mat aG;
aG = a.mul(mean_G);
b = mean_P - aG;*/


//求系数的均值
Mat mean_b;
boxFilter(b, mean_b, CV_64FC1, Size(ksize, ksize));
mean_b = mean_b / N;

//输出结果q  
/*Mat q;*/
Mat Qq;// = mean_a.mul(g);        //乘以的是导向图  不是输入  点乘
multiply(mean_a, g, Qq);
Mat q; //= Qq + mean_b;
add(Qq, mean_b, q);
//q = mean_a.mul(g) + mean_b;
return q;
}

2 个解决方案

#1


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处, 看不懂时双击下一行,直到能看懂为止

#2


我是菜鸟一个,步进这一步是出错了,Mat Qq= mean_a.mul(g);  继续跟进直到
 operator Mat() const
    {
        Mat m;
         op->assign(*this, m);
        return m;
    }
 op->assign(*this, m);这一句执行不过去,这个是对Mat类型矩阵的操作,我在自己的定义的矩阵直接复制大小还是执行不了。
反汇编0F45ECE8 push edx,提示堆栈输入出错。
但是没有找到解决方法。

#1


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处, 看不懂时双击下一行,直到能看懂为止

#2


我是菜鸟一个,步进这一步是出错了,Mat Qq= mean_a.mul(g);  继续跟进直到
 operator Mat() const
    {
        Mat m;
         op->assign(*this, m);
        return m;
    }
 op->assign(*this, m);这一句执行不过去,这个是对Mat类型矩阵的操作,我在自己的定义的矩阵直接复制大小还是执行不了。
反汇编0F45ECE8 push edx,提示堆栈输入出错。
但是没有找到解决方法。