注册 登录
查看: 308|回复: 7

[智能车] 奇葩问题!!!

[复制链接]
发表于 2014-8-16 22:47:12 | 显示全部楼层 |阅读模式
int ihist[256] = {0}; // 图像直方图,256个点
int32 otsu (unsigned char *image, int rows, int cols, int x0, int y0, int dx, int dy, int vvv)
{   
        unsigned char *np; // 图像指针
        int thresholdValue=1; // 阈值

        int i, j, k; // various counters
        int n, n1, n2, gmin, gmax;
        double m1, m2, sum, csum, fmax, sb;

        gmin=200; gmax=60;
      // 生成直方图
        for (i = y0 + 1; i < y0 + dy - 1; i++)
        {
            np = &image[i*cols+x0+1];
            for (j = x0 + 1; j < x0 + dx - 1; j++)
              {
                ihist[*np]++;
                if(*np > gmax) gmax=*np;
                if(*np < gmin) gmin=*np;
                np++; //next pixel
              }
        }
      //sum=0.0;
      //csum=0.0;
      n=0;
      for (k = 0; k <= 255; k++)
        {
          sum += (double) k * (double) ihist[k]; // x*f(x) 质量矩
          n += ihist[k]; // f(x) 质量
        }
        if (!n) {
           // if n has no value, there is problems...
//           fprintf (stderr, "NOT NORMAL thresholdValue = 160\n");
           return (160);
        }
        // do the otsu global thresholding method
        fmax = -1.0;
        n1 = 0;
        for (k = 0; k < 255; k++) {
           n1 += ihist[k];
           if (!n1) { continue; }
           n2 = n - n1;
           if (n2 == 0) { break; }
           csum += (double) k *ihist[k];
           m1 = csum / n1;
           m2 = (sum - csum) / n2;
           sb = (double) n1 *(double) n2 *(m1 - m2) * (m1 - m2);
           //bbg: note: can be optimized.
           if (sb > fmax) {
                   fmax = sb;
                   thresholdValue = k;
           }
        }
        // debug code to display thresholding values
//        if ( vvv & 1 )
//           fprintf(stderr,"# OTSU: thresholdValue = %d gmin=%d gmax=%d\n",
//           thresholdValue, gmin, gmax);
        return(thresholdValue);
}



当我把//sum=0.0;      //csum=0.0;当这两个double型变量前的注释去掉后,程序就不能正常执行,当我把这两个变量定义为float型时,还是不行,但是当我改为int时,程序正常执行,这与编译环境有关系吗,这段程序是从KEIL上移植过来的



回复

使用道具 举报

发表于 2014-8-17 11:07:14 | 显示全部楼层
你的是FX吗?开启了硬件浮点?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-17 13:19:04 | 显示全部楼层
山外メ雲ジ 发表于 2014-8-17 11:07
你的是FX吗?开启了硬件浮点?

怎么开启硬件浮点?不开启不行吗,DN也可以进行浮点运算,虽然没有FPU
回复 支持 反对

使用道具 举报

发表于 2014-8-17 13:21:20 | 显示全部楼层
bieshuono 发表于 2014-8-17 13:19
怎么开启硬件浮点?不开启不行吗,DN也可以进行浮点运算,虽然没有FPU

不能开硬件浮点,参考我们的K60视频里面的超频性能测试这个视频。

硬件浮点运算如何打开 - 智能车讨论区 - 山外-vcan123论坛 http://www.vcan123.com/forum.php?mod=viewthread&tid=1962
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-17 23:04:38 | 显示全部楼层
关闭了果然就好了,没有看完视频,看来还是急于求成,有空一定完完整整的看上两遍
回复 支持 反对

使用道具 举报

发表于 2014-8-17 23:06:41 | 显示全部楼层
bieshuono 发表于 2014-8-17 23:04
关闭了果然就好了,没有看完视频,看来还是急于求成,有空一定完完整整的看上两遍

我们的视频已经是讲得很简洁了,不少人还说讲得不够详细。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-17 23:53:09 | 显示全部楼层
就是视频音质不怎么好,你们使用屏幕录像专家录制视频的吧

这个程序里我把double型的改成int的数据类型为什么会出错呢,出来的threshold二值化阈值总是波动的,而且很大
回复 支持 反对

使用道具 举报

发表于 2014-8-18 09:46:30 | 显示全部楼层
bieshuono 发表于 2014-8-17 23:53
就是视频音质不怎么好,你们使用屏幕录像专家录制视频的吧

这个程序里我把double型的改成int的数据类型为 ...

为啥出错,这就看你自己的代码有什么bug了。

不同的图像亮度,阈值跳动很正常
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部