李現路: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
講師:李現路
版權所有-曙海教育 歡迎轉摘,轉摘請注明作者和出處