我正在尝试使用下面的代码修改OpenCV::Mat中的值:
void gaussian_high_pass_kernel(cv::Mat& gaussianBlur, float sigma)
{
float d0 = sigma;
for (int i = 0; i < scr.rows; i++)
{
for (int j = 0; j < scr.cols; j++)
{
float d = pow(float(i - scr.rows / 2), 2) + pow(float(j - scr.cols / 2), 2);
*gaussianBlur.ptr(i, j) = 1 - expf(-d / (2 * d0 * d0));
}
}
}
字符串
在*gaussianBlur.ptr(i, j) = 1 - expf(-d / (2 * d0 * d0))
;行中似乎有一个bug。它没有像我预期的那样工作,未能将新值分配给gaussianBlur[i,j]
。相反,cv::Mat gaussianBlur中的所有值最终都是-4.31596e+08。
但是,当我将这一行修改为*gaussianBlur.ptr<float>(i,j) = 1 - expf(-d / (2 * d0 * d0))
;时,它可以正常工作。
有人能解释一下为什么使用*gaussianBlur.ptr(i, j)
直接访问元素不能产生预期的结果,而使用*gaussianBlur.ptr<float>(i,j)
显式指定数据类型可以解决这个问题吗?任何见解或解释都将非常感谢。谢谢!
1条答案
按热度按时间m0rkklqb1#
**gaussianBlur.ptr(i,j)和gaussianBlur.ptr(i,j)**之间的区别在于数据类型解释。
使用 *gaussianBlur.ptr(i,j)*时,指针被视为指向数据的泛型指针,类型信息没有显式指定,编译器需要根据矩阵(gaussianBlur)的类型推断类型,它可能并不总是推断出正确的类型,导致意外的结果。
另一方面,当你使用 gaussianBlur.ptr(i,j)时,你明确地告诉编译器将指定位置的数据解释为浮点数。这确保了正确的类型用于解释,防止类型转换中的任何歧义。
在您的示例中,如果矩阵gaussianBlur的类型为CV_32F(32位浮点),则显式使用 *gaussianBlur.ptr(i,j)**可确保使用正确的类型,并且赋值按预期工作。
总之,使用 *gaussianBlur.ptr(i,j)**显式类型规范是避免与类型推断相关的潜在问题的良好实践,特别是在处理不同数据类型的矩阵时。它为编译器提供了关于如何解释数据的清晰度,从而产生更可预测和无错误的代码。