C++ 分割OpenCV Mat会产生意外的结果

C++ 分割OpenCV Mat会产生意外的结果,c++,opencv,C++,Opencv,我试图在图像和内核之间做一些卷积,所以我的结果并不是很大,我一直在尝试将内核标准化为0到1之间的范围。我正在使用CV_32FC1垫类型&我的图像是灰度的 我的内核从-1到1的范围开始。我减去最小值,给出0到2的范围,然后除以最大值,理论上应该是0到1的范围。但是,在该除法之后,值的范围变为0到358。(我将这些数字四舍五入-让我知道实际的精确值是否有用。) 这是我的代码: double minVal; double maxVal; minMaxLoc(kernel, &minVal, &

我试图在图像和内核之间做一些卷积,所以我的结果并不是很大,我一直在尝试将内核标准化为0到1之间的范围。我正在使用CV_32FC1垫类型&我的图像是灰度的

我的内核从-1到1的范围开始。我减去最小值,给出0到2的范围,然后除以最大值,理论上应该是0到1的范围。但是,在该除法之后,值的范围变为0到358。(我将这些数字四舍五入-让我知道实际的精确值是否有用。)

这是我的代码:

double minVal; double maxVal;
minMaxLoc(kernel, &minVal, &maxVal);
kernel = kernel - minVal;             
minMaxLoc(kernel, &minVal, &maxVal);
divide(maxVal, kernel, kernel);
那么,为什么会发生这种情况?我觉得我可能不知怎么遇到了内存或溢出问题,但我认为我所有的值都在32F可以存储的范围内。修复会很好,但为什么是我最感兴趣的;
divide
运算符不符合您的想法:它计算的每个元素:

dst(I) = saturate(scale/src2(I))
尽管你期望:

dst(I) = saturate(src2(I)/scale)
我认为你应该这样做:

kernel = kernel / maxVal;

(不确定这是否有效;但只需确保有真正的元素划分即可)。

openCV操作通常不会发生溢出,因为它们使用饱和投射。您是否
std::cout@chrisMaes的答案应该是正确的。