让你的软件飞起来:RGB转为YUV

论坛 期权论坛     
选择匿名的用户   2021-5-23 02:01   257   0
<p>http://blog.csdn.net/wxzking/article/details/5905195</p>
<p></p>
<p style="color:rgb(69,69,69)">朋友曾经给我推荐了一个有关代码优化的pdf文档《让你的软件飞起来》,看完之后,感受颇深。为了推广其,同时也为了自己加深印象,故将其总结为word文档。下面就是其的详细内容总结,希望能于己于人都有所帮助。</p>
<p style="color:rgb(69,69,69)"> </p>
<p style="color:rgb(69,69,69)"><strong>速度取决于算法</strong></p>
<p style="color:rgb(69,69,69)">同样的事情,方法不一样,效果也不一样。比如,汽车引擎,可以让你的速度超越马车,却无法超越音速;涡轮引擎,可以轻松 超越音障,却无法飞出地球;如果有火箭发动机,就可以到达火星。</p>
<p style="color:rgb(69,69,69)"> </p>
<p style="color:rgb(69,69,69)"><strong>代码的运算速度取决于以下几个方面</strong></p>
<p style="color:rgb(69,69,69)">1、  算法本身的复杂度,比如MPEG比JPEG复杂,JPEG比BMP图片的编码复杂。</p>
<p style="color:rgb(69,69,69)">2、  CPU自身的速度和设计架构</p>
<p style="color:rgb(69,69,69)">3、  CPU的总线带宽</p>
<p style="color:rgb(69,69,69)">4、  您自己代码的写法</p>
<p style="color:rgb(69,69,69)">本文主要介绍如何优化您自己的code,实现软件的加速。</p>
<p style="color:rgb(69,69,69)"> </p>
<p style="color:rgb(69,69,69)">先看看我的需求</p>
<p style="color:rgb(69,69,69)">我们一个图象模式识别的项目,需要将RGB格式的彩色图像先转换成黑白图像。</p>
<p style="color:rgb(69,69,69)">图像转换的公式如下:</p>
<p style="color:rgb(69,69,69)">Y &#61; 0.299 * R &#43; 0.587 * G &#43; 0.114 * B;</p>
<p style="color:rgb(69,69,69)">图像尺寸640*480*24bit,RGB图像已经按照RGBRGB顺序排列的格式,放在内存里面了。</p>
<p style="color:rgb(69,69,69)"> </p>
<p style="color:rgb(69,69,69)">我已经悄悄的完成了第一个优化</p>
<p style="color:rgb(69,69,69)">以下是输入和输出的定义:</p>
<p style="color:rgb(69,69,69)">#define XSIZE 640</p>
<p style="color:rgb(69,69,69)">#define YSIZE 480</p>
<p style="color:rgb(69,69,69)">#define IMGSIZE XSIZE * YSIZE</p>
<p style="color:rgb(69,69,69)">typedef struct RGB</p>
<p style="color:rgb(69,69,69)">{<!-- --></p>
<p style="color:rgb(69,69,69)">       unsigned char R;</p>
<p style="color:rgb(69,69,69)">       unsigned char G;</p>
<p style="color:rgb(69,69,69)">       unsigned char B;</p>
<p style="color:rgb(69,69,69)">}RGB;</p>
<p style="color:rgb(69,69,69)">struct RGB in[IMGSIZE]; //需要计算的原始数据</p>
<p style="color:rgb(69,69,69)">unsigned char out[IMGSIZE]; //计算后的结果</p>
<p style="color:rgb(69,69,69)"> </p>
<p style="color:rgb(69,69,69)">第一个优化</p>
<p style="color:rgb(69,69,69)">优化原则:图像是一个2D数组,我<strong>用一个一维数组</strong>来存储。编译器处理一维数组的效率要高过二维数组。</p>
<p style="color:rgb(69,69,69)"> </p>
<p style="color:rgb(69,69,69)">先写一个代码:</p>
<p style="color:rgb(69,69,69)">Y &#61; 0.299 * R &#43; 0.587 * G &#43; 0.114 * B;</p>
<p style="color:rgb(69,69,69)"> </p>
<p style="color:rgb(69,69,69)">void calc_lum()</p>
<p style="color:rgb(69,69,69)">{<!-- --></p>
<p style="color:rgb(69,69,69)">    int i;</p>
<p style="color:rgb(69,69,69)">    for(i &#61; 0; i &lt; IMGSIZE; i&#43;&#43;)</p>
<p style="color:rgb(69,69,69)">    {<!-- --></p>
<p style="color:rgb(69,69,69)">       double r,g,b,y;</p>
<p style="color:rgb(69,69,69)">       unsigned char yy;</p>
<p style="color:rgb(69,69,69)">        r &#61; in[i].r;</p>
<p style="color:rgb(69,69,69)">        g &#61; in[i].g;</p>
<p style="color:rgb(69,69,69)">        b &#61; in[i].b;</p>
<p style="color:rgb(69,69,69)">        y &#61; 0.299 * r &#43; 0.587 * g &#43; 0.114 * b;</p>
<p style="color:rgb(69,69,69)">        yy &#61; y;</p>
<p style="color:rgb(69,69,69)">        out[i] &#61; yy;</p>
<p style="color:rgb(69,69,69)">    }</p>
<p style="color:rgb(69,69,69)">}</p>
<p style="color:rgb(69,69,69)">这大概是能想得出来的最简单的写法了,实在看不出有什么毛病,好了,编译一下跑一跑吧。</p>
<p style="color:rgb(69,69,69)">第一次试跑</p>
<p style="color:rgb(69,69,69)">这个代码分别用vc6.0和gcc编译,生成2个版本,分别在pc上和我的embedded system上面跑。</p>
<p style="color:rgb(69,69,69)">速度多少?</p>
<p style="color:rgb(69,69,69)">在PC上,由于存在硬件浮点处理器,CPU频率也够高,计算速度为20秒。</p>
<p style="color:rgb(69,69,69)">我的embedded system,没有以上2个优势,浮点操作被编译器分解成了整数运算,运算速度为120秒左右。</p>
<p style="color:rgb(69,69,69)"> </p>
<p style="color:rgb(69,69,69)"><strong>去掉浮点运算</strong></p>
<p style="color:rgb(69,69,69)">上面这个代码还没有跑,我已经知道会很慢了,因为这其中有大量的浮点运算。只要能不用浮点运算,一定能快很多。</p>
<p style="color:rgb(69,69,69)"> </p>
<p styl
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP