我最近在图像处理上写了一个函数,目的是使一个矩形图像变成平行四边形图像,效果是出来了,可是处理的数度较慢不是很理想,经过调试发现主要是一下两条关于浮点型运算的语句造成的,请大家帮我优化一下,提高程序的运行速度:
int DestX = (int)(i%Width*cosine);
int DestY =(int)((i/Width + 1) - i%Width*sine);
其中Width是整型数据,cosine和sine是通过三角函数Cos和Sin运算得到的浮点数据

解决方案 »

  1.   

    sin, cos可以查表,会快点。
      

  2.   

    比如 float a = 1.02;
    float b = 3.21;float c = a * b;这是一个浮点运算,改成整形如下int a = 102;
    int b = 321;
    int c = a * b;上面这种做法,有效数字得到保证, 在整整需要浮点的地方, floag fc = c / 10000.0;
      

  3.   

    可问题是你如何知道Sin和Cos两个函数计算出来的浮点型数据所对应的整型数据呢?
      

  4.   

    像DSP里面一样试着用iq库来代替浮点,函数用查表
    iq库的基本原理就是用DWORD的定点来做浮点运算,参见http://focus.ti.com/docs/toolsw/folders/print/sprc087.html(英文)
      

  5.   

    不推荐楼主在这里搞优化 因为三角函数本身就需要很多运算 而这个运算在你现在的代码当中恐怕只能自己写三角函数才能做到优化。楼主把矩形变成平行四边形 应该可以不用三角函数完成。
    楼主到这里去看看:http://media.cs.tsinghua.edu.cn/~ahz/digitalimageprocess/chapter06/chapt06_ahz.htm
    我想楼主应该是用的文章里面的 仿射变换(affine transformation)的公式吧。
    你再往下看一下 3.2 透视变换(Perspective Transformation) 
    下面的公式应该没有用到三角函数的。 而防射变化可以看成是透视变换的特例。 所以我推荐楼主使用透视变化的公式去解决你的问题。
    上面的第二个图就是我在OpenCV下使用透视变换得到的第一个图变成平行四边形的效果。
    使用的主要函数是:
    cvGetPerspectiveTransform(srcpoints,dstpoints,&mat );                                      //取得透视变换矩阵
    cvWarpPerspective(src,dst,&mat,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0));      //进行透视变换
    这说明透视变化也可以把矩形编程平行四边形,而且速度上应该很快。不是让楼主去用OpenCV 实现 而是想让楼主去解那个公式 来实现达到你提高运算速度的目的。
    以上所说,仅作参考。
      

  6.   

    以上给出的只是for循环内部的语句,我的sin和cos在for循环语句之外就已经算完全了,在这里只是直接使用,因此我认为两个三角函数对我程序速度的影像应该不是很大,我是在Windows Mobile平台上的手机里运行的,因此你给我的函数我无法使用
      

  7.   

    问题大概不在浮点数的运算速度上,而是在你的sin,cos函数上
      

  8.   

    可是sin,cos函数我只是在循环外使用了一次,应该不会有太大的影响吧