以下是我在程序中使用的代码:
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
{ {1}}
答案 0 :(得分:1)
log2
仅在C99标准中定义。不使用log2
的解决方法可能是将其替换为不同的基数,因为对数logb(x)
可以根据x
和b
的对数来计算任意基数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
}