有哪位高手能帮我解释一下下面的程序么?我现在做目标跟踪方面的研究,可是基础很差,只好先看别人写好的程序来边学习边研究。这段程序是MeanShift算法中的一部分,统计直方图,不过,for循环中的东西我都不明白,请高人指点一下,谢谢啊! 
/***********************************************************************
* 函数名称:
*     CalculateHistogramSp
* 参数:
*     image frame-当前输入帧
*     char kernel-核类型选择(目前只支持Uniform核)
*     float * histogram-直方图缓冲
* 说明:统计直方图,建立区域模型(无参数概率密度估计)
***********************************************************************/
int MeanShiftSegger::CalculateHistogramSp(unsigned char*  frame,char kernel, float *histogram){
int pxValue = 0;
for(int i = 0 ; i < HISTOGRAM_LENGTH; i++)
histogram[i] = 0;
if(kernel == 'U')
{
for(int j = Max(0,currentY - trackWinHeight / 2);j < Min(currentY + trackWinHeight /        2,imgHeight - 1); j ++){
for(int i = Max(0,currentX - trackWinWidth / 2); i < Min(currentX + trackWinWidth / 2,imgWidth - 1);i ++){
pixel b = frame[j * imgWidth * 3 + i * 3] / 16;
pixel g = frame[j * imgWidth * 3 + i * 3 + 1] / 16;
pixel r = frame[j * imgWidth * 3 + i * 3 + 2] / 16; histogram[256 * (int)r + 16 * (int)g + (int)b] += 1;
pxValue ++;
}
}
for(int i = 0; i < HISTOGRAM_LENGTH; i ++)
histogram[i] /= pxValue;
}
else
{
return 0;
}
return pxValue;
}

解决方案 »

  1.   

    大致看了下
    应该是通过一个移动的跟踪窗口来进行直方图统计pixel b = frame[j * imgWidth * 3 + i * 3] / 16;
    pixel g = frame[j * imgWidth * 3 + i * 3 + 1] / 16;
    pixel r = frame[j * imgWidth * 3 + i * 3 + 2] / 16;应该是对图像的亮度归来,即距离16为同一阶段histogram[256 * (int)r + 16 * (int)g + (int)b] += 1;通过对r元素左移8位,b元素左移4位,g元素固定来达到色彩区分,避免建三原色分割for(int i = 0; i < HISTOGRAM_LENGTH; i ++)
    histogram[i] /= pxValue;归一化处理
      

  2.   

    第一段代码其实就是个分类,值0~15一类,16~31一类,一次类推
    第二段代码可以看出一个一一映射,即分类后每一个不同的RGB像素对应一个histogram数组成员
    第三段代码就是将所有的histogram数组成员除以一个数值,达到一个归一化的效果,避免数值过大而已