在 Gary Bradski 和 Adrian Kaehler 的“ Learning OpenCV ”中,有一段关于 CvMat 矩阵结构的部分包含以下示例代码(示例 3-9:对单通道矩阵中的所有元素求和)
float sum( const CvMat* mat ) {
float s = 0.0f;
for(int row=0; row<mat->rows; row++ ) {
const float* ptr = (const float *)(mat->data.ptr + row * mat->step);
for(int col=0; col<mat->cols; col++ ) {
s += *ptr++;
}
}
return( s );
}
关于这段代码,有几件事我不明白,但它们可能是我多年未使用 C 而不是 OpenCV 问题的结果。
为什么
const
?由于ptr
稍后在函数中递增,我不明白为什么要声明它const
。为什么
.ptr
?作者指出,“在计算指向矩阵的指针时,请记住矩阵元素data
是联合。因此,在取消引用此指针时,必须指明联合的正确元素,才能获得正确的指针类型。 " 那么为什么不使用fl
带有类型的联合成员,float*
以便代码行是float* ptr = mat->data.fl + row * mat->step;
而不是ptr
使用类型uchar*
并需要额外的演员表?