c++ “*mat.ptr< float>(i,j)”和“*mat.ptr(i,j)"的区别?

btxsgosb  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(169)

我正在尝试使用下面的代码修改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)显式指定数据类型可以解决这个问题吗?任何见解或解释都将非常感谢。谢谢!

m0rkklqb

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)**显式类型规范是避免与类型推断相关的潜在问题的良好实践,特别是在处理不同数据类型的矩阵时。它为编译器提供了关于如何解释数据的清晰度,从而产生更可预测和无错误的代码。

相关问题