我正在遵循《使用OpenCV库在C++中学习OpenCV 3计算机视觉》一书中的示例,示例12-1中的以下部分让我感到困惑:
A.convertTo(dft_A_part, dft_A_part.type(), 1, -mean(A)[0]);
作为该操作的结果,我期望在从每个值中减去值mean(A)[0]
之后将A
的值复制到dft_A_part
。
不是这样的,所以我很困惑。A
是cv::Mat (CV_8U)
dft_A_part
是cv::Mat (CV_32_F)
一些观察值:
平均值(A)[0] = 88.65
A.data[0] = 77,dft_A_part.data[0] = 136.0
A.data[1] = 77,dft_A_part.data[1] = 140.0
A.data[2] = 79,dft_A_part.data[2] = 58.0
我知道在cv::convertTo()
中应用了saturation_cast<>
,但这怎么会导致这些数字呢?
1条答案
按热度按时间laawzig21#
dft_A_part.data
是指向uchar
的指针,dft_A_part
的类型是float
。dft_A_part.data[0]
,dft_A_part.data[1]
,dft_A_part.data[2]
表示float
元素的第一、第二和第三字节。内存中
float
元素的值是-11.65f
。float元素以IEEE 754存储为4个字节。
我们在这里得到的值是没有意义的(只是尾数的一部分)。
注意
dft_A_part.data[0]
=136
而不是136.0
...除了使用
dft_A_part.data[0]
,我们还可以用途:dft_A_part.at<float>(0, 0)
。我们也可以将
data
转换为浮点指针:float *data_as_float = (float*)dft_A_part.data;
代码示例:
输出:
正如我们所看到的,在添加偏移量之前执行了数据转换为float(未使用
saturation_cast
)。