曙海教育集团论坛DSP专区DSP系统和硬件开发讨论区 → 李现路:DSP6000图像位置移动与变形的典型算法(四)


  共有7261人关注过本帖树形打印

主题:李现路:DSP6000图像位置移动与变形的典型算法(四)

客人(124.78.*.*)
  1楼


李现路:DSP6000图像位置移动与变形的典型算法(四)  发帖心情 Post By:2009-12-3 13:49:29

  李现路:DSP6000图像位置移动与变形的典型算法(四)

 

五、图像的旋转实验


数学表达式原理:


下面我们来推导一下旋转运算的变换公式。如下图所示,点(x0,y0)经过旋转θ度后

坐标变成(x1,y1)。其数学表达式为:

X0=x1cos(θ)+y1sin(θ)+ccos(θ)-dsin(θ)+a ;

Y0=-xsin(θ)+y1cos(θ)+csin(θ)-dcos(θ)+ b


算法的C语言代码:


/*图像旋转参数*/

Float fAngle=3.1415927/3; //旋转的角度

*画矩形边框函数*/

Void drawRectangle();

*计算图像旋转参数*/

Void computeParameter();

/*进行图像旋转处理*/

void rotate()

{

         int i,j,intInc;

         int intCapYInc;

         int intCapX,intCapY;

        

         /*进行图像旋转,重新赋值*/

         //方框内奇数行

         for(i=intALines;i<intDLines;i++)

         {

             for(j=intAPixels;j<intDPixels;j++)

             {

            intInc = i*2;  


            intCapX    = (int)(j*cosAngle + intInc*sinAngle + f1 + 0.5);

            intCapYInc = (int)(intInc*cosAngle - j*sinAngle + f1 + 0.5);          

                     

            if((intCapYInc%2)==0)

            {

                     intCapY = intCapYInc/2;

            }

            else

            {

                     intCapY = (intCapYInc-1)/2+numLines/2;

            }

            

            //判断是否在原图范围内

            if((intCapX>=0) && (intCapX<numPixels) && (intCapY>=0) && (intCapY<numLines))  

            {

                                //传送亮度信号

                                *(Uint8 *)(tempYbuffer + i*numPixels + j) = *(Uint8 *)(capYbuffer + intCapY*numPixels + intCapX);                                                                         

                 }

            else

            {

                      *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0xFF;

            }

                                

                   }       

         }

                          

         //方框内偶数行

         for(i=numLines/2+intALines;i<numLines/2+intDLines;i++)

         {

             for(j=intAPixels;j<intDPixels;j++)

             {                

            intInc = (i-numLines/2)*2 + 1;


            intCapX    = (int)(j*cosAngle + intInc*sinAngle + f1 + 0.5);

            intCapYInc = (int)(intInc*cosAngle - j*sinAngle + f1 + 0.5);          

                     

            if((intCapYInc%2)==0)

            {

                     intCapY = intCapYInc/2;

            }

            else

            {

                     intCapY = (intCapYInc-1)/2+numLines/2;

            }            


            //判断是否在原图范围内

            if((intCapX>=0) && (intCapX<numPixels) && (intCapY>=0) && (intCapY<numLines))  

            {

                                //传送亮度信号

                                *(Uint8 *)(tempYbuffer + i*numPixels + j) = *(Uint8 *)(capYbuffer + intCapY*numPixels + intCapX);                                                                         

                 }

            else

            {

                      *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0xFF;

            }

                                

                   }       

         }       

}



                                              曙海教育


                                            曙海嵌入式学院


                        (课程:DSP培训,FPGA培训,MTK培训,Android培训,iPhone培训)


                                           电话:021-51875830


                                           网址:http://www.51qianru.cn


                                              讲师:李现路


                          版权所有-曙海教育 欢迎转摘,转摘请注明作者和出处


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部

返回版面帖子列表

李现路:DSP6000图像位置移动与变形的典型算法(四)








签名