为什么我会得到" nan" C ++中的值?

时间:2014-10-11 18:37:38

标签: c++ opencv

我正在制作图像的Correlogram。对于每个像素,相关图在一定距离范围d内找到相同颜色的像素。 Correlogram是2D矩阵,即correlogram[color][distance]。 Correlogram的计算有点类似于直方图。

我的代码:我发布了所有计算正在进行的代码的一些主要部分。其余的代码(我没有发布)用于实现其他条件,因此没有必要。

问题:在我的最终correlogram[][]中,有些值是" nan"。我检查了代码,但我无法找到计算/语法中的问题。

int ColorBins = 180;
int DistanceRange = 5;

double calcCorrelogram(Mat hsvImage)
{
    double correlogram[ColorBins][DistanceRange];
    int pixelNum[ColorBins]; //Used to count the number of pixels of same color

    Mat hsvPlanes[3];
    split(hsvImage, hsvPlanes);

    for(int pi=0; pi<hsvImage.rows; pi++)
    {
        for(int pj=0; pj<hsvImage.cols; pj++)
        {
            int pixelColor = (int)hsvPlanes[0].at<uchar>(pi,pj);
            pixelNum[pixelColor]++; 

            for(int d=1; d<=DistanceRange; d++)
            {
                int sameColorNum=0; //* number of pixels with same color in the d-distance boundary */
                int totalBoundaryNum=0; //* total number of pixels in the d-distance boundary */

                for(int i= pi-d, j= pj-d; j<=pj+d; j++)
                {
                    if(i<0)
                        break;
                    if(j<0 || j>=hsvImage.cols)
                        continue;

                    int neighbourColor  = (int)hsvPlanes[0].at<uchar>(i,j);
                    if(pixelColor == neighbourColor)
                    {
                        sameColorNum++;
                    }
                    totalBoundaryNum++;

                    correlogram[pixelColor][d-1] = correlogram[pixelColor][d-1] + (double)sameColorNum / (double)totalBoundaryNum;
            }   
        } 
    }

    for(int c=0; c<ColorBins; c++)
    {
        for(int d=0; d<DistanceRange; d++)
        {
            if(pixelNum[c] != 0)
                correlogram[c][d] = correlogram[c][d] / (double)pixelNum[c];
        }
    }
}

1 个答案:

答案 0 :(得分:4)

当您将零除零或乘以零无穷大时,通常会创建NaN。检查NaN和无穷大等异常数字的一种简单方法是乘以零并检查结果是否为零:

bool is_valid_double(double x)
{
    return x*0.0==0.0;
}

如果x为NaN或无穷大,则返回false。

然后,您可以使用断言来填充代码,以帮助找出出错的地方:

assert(is_valid_double(correlogram[c][d]));

一旦因断言失败而崩溃,您可以使用调试器查看程序的状态,以帮助确定发生了什么。