0

这是我在程序中使用的代码:

calcHist( &pre_img, 1, channels, Mat(), // do not use mask
                 hist, 1, histSize, ranges,
                 true, // the histogram is uniform
                 false );

       Mat histNorm = hist / (pre_img.rows * pre_img.cols);
       double entropy = 0.0;
       for (int i=0; i<histNorm.rows; i++)
       {
          float binEntry = histNorm.at<float>(i,0);
          if (binEntry != 0.0)
          {
            entropy -= binEntry * log(binEntry);
          }
       }
       cout<<entropy<<endl;

第一件事是当我输入它时就像entropy -= binEntry * log2(binEntry);它给我错误一样log2,我在 VS 2010 中添加了数学和数字库,但仍然收到错误,代码中的第二点是每当我在同一个视频上运行它时在每次执行时给我不同的值,比如如果它10.0 , 2.0 , 0.05在下次运行程序时给我比相同的帧显示我8.0 , 1.5 , 0.01 these are sample values not exact

4

1 回答 1

1

log2仅在 C99 标准中定义。不使用的解决方法log2可能是用不同的基数替换它,因为可以使用以下公式从任意基数logb(x)的对数xb相对于任意基数计算对数k

在此处输入图像描述

https://math.stackexchange.com/a/131719/29621

所以你可以更换

if (binEntry != 0.0)
          {
            entropy -= binEntry * log2(binEntry);
          }

if (binEntry != 0.0)
          {
            entropy -= binEntry * log(binEntry)/log(2.0);
                                                     ^
                                                also you should use `log(2.0)`
                                                because the argument should be
                                                double or float
          }
于 2013-09-22T10:42:23.943 回答