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

问题描述 投票:0回答:1

我正在尝试使用以下代码修改 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))
; 行中似乎存在错误。它没有按我的预期工作,未能将新值分配给
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)
显式指定数据类型可以解决问题吗?任何见解或解释将不胜感激。谢谢!

c++ opencv pointers mat function-templates
1个回答
0
投票

*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) 进行显式类型规范是避免与类型推断相关的潜在问题的良好实践,尤其是在处理不同数据类型的矩阵时。它使编译器清楚地了解如何解释数据,从而生成更可预测且无错误的代码。

© www.soinside.com 2019 - 2024. All rights reserved.