关于cv::convertTo()运算结果与预期不符的技术疑问
问题分析与解决
- 核心问题:你错误地直接通过
cv::Mat的data成员读取CV_32F类型矩阵的元素值,导致获取的是单个字节的数值,而非完整的float类型计算结果。 - 原因拆解:
cv::Mat::data本质是uchar*类型指针,无论矩阵实际存储的是什么数据类型,它都指向内存缓冲区的起始字节。CV_32F类型的每个元素占4个字节(标准float的大小),你用dft_A_part.data[0]读取的是第一个float元素的第一个字节,将这个uchar值(136)直接转成float就得到了136.0,这完全不是convertTo计算出的真实结果。
- 真实计算结果验证:
根据convertTo的公式dst[i] = src[i] * alpha + beta,这里alpha=1、beta=-88.65,所以:- 当
A.data[0]=77时,正确结果应为77 - 88.65 = -11.65
- 当
- 正确的元素访问方式:
要读取CV_32F矩阵的元素,推荐用以下方式:- 通过行列索引访问(单通道矩阵适用):
dft_A_part.at<float>(row, col) - 通过一维索引访问:
dft_A_part.ptr<float>()[index] - 或者强制类型转换后读取:
*reinterpret_cast<float*>(dft_A_part.data + index*sizeof(float))
- 通过行列索引访问(单通道矩阵适用):
- 额外说明:这里
convertTo不会触发saturation_cast<>的作用,因为目标类型是浮点型CV_32F,饱和转换仅针对整数类型的转换,用于防止溢出截断,浮点型转换不存在饱和逻辑。
内容的提问来源于stack exchange,提问作者Vectorizer
相关产品推荐
相关产品推荐

