OPenCV中累加一个三通道矩阵中的所有元素:

程序为:floatsum(constCvMat*mat){floats=0.0f;for(introw=0;row<mat->rows;row++){constfloat... 程序为:
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( col=0; col<mat->cols; col++ )
{
s += *ptr++;
}
}
return( s );
}

我想问const float* ptr=(const float*)(mat->data.ptr + row * mat->step); 这句程序的详细意思,看不懂
展开
 我来答
可爱的八嘎牙路酱
2011-11-12 · TA获得超过3386个赞
知道大有可为答主
回答量:1695
采纳率:0%
帮助的人:1597万
展开全部
mat->data.ptr 是指向 mat中数据的指针,是char 的
而mat中的数据,是float的
所以,在前面进行了强制转换 (const float*)
mat->step,是mat中,每行数据的长度
不过,感觉这里这么用不对头,因为 step,也是以byte为单位的,而前面已经强制成float了,所以就被人为放大了

先定义一个中间指针
char *ptr1;
ptr1 = mat->data.ptr + row * mat->step;
ptr = =(const float*)ptr1;
这样就可以了

还有可改进的地方,循环内
每次指针
ptr1 += mat->step;
就可以,不用乘row了
追问
加一个中间指针,把const float* ptr=(const float*)(mat->data.ptr + row * mat->step); 分成两句有本质的区别吗?不太清楚哦,请指教!!
追答
分开后 step 就是按 char 的长度增加指针
不分,就是按 float 的长度
百度网友d4eac2b
2011-11-12 · TA获得超过1388个赞
知道小有建树答主
回答量:528
采纳率:0%
帮助的人:264万
展开全部
这句话的作用是让ptr指向第row行的数据开头。
mat是CvMat类型,根据OpenCV的API帮助,CvMat.data是一个union,当然其中每种类型都是指针,data.ptr是把数据看成unsigned char的指针,而CvMat.step是这个矩阵中一行的实际数据长度,row是从0开始的行号,所以整个计算式的结果就是第row行的数据开头。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式