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,提示堆栈输入出错。
但是没有找到解决方法。
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,提示堆栈输入出错。
但是没有找到解决方法。
operator Mat() const
{
Mat m;
op->assign(*this, m);
return m;
}
op->assign(*this, m);这一句执行不过去,这个是对Mat类型矩阵的操作,我在自己的定义的矩阵直接复制大小还是执行不了。
反汇编0F45ECE8 push edx,提示堆栈输入出错。
但是没有找到解决方法。