李現(xiàn)路:DSP6000圖像位置移動(dòng)與變形的典型算法(四)
五、圖像的旋轉(zhuǎn)實(shí)驗(yàn)
數(shù)學(xué)表達(dá)式原理:
下面我們來(lái)推導(dǎo)一下旋轉(zhuǎn)運(yùn)算的變換公式。如下圖所示,點(diǎn)(x0,y0)經(jīng)過(guò)旋轉(zhuǎn)θ度后
坐標(biāo)變成(x1,y1)。其數(shù)學(xué)表達(dá)式為:
X0=x1cos(θ)+y1sin(θ)+ccos(θ)-dsin(θ)+a ;
Y0=-xsin(θ)+y1cos(θ)+csin(θ)-dcos(θ)+ b
算法的C語(yǔ)言代碼:
/*圖像旋轉(zhuǎn)參數(shù)*/
Float fAngle=3.1415927/3; //旋轉(zhuǎn)的角度
*畫(huà)矩形邊框函數(shù)*/
Void drawRectangle();
*計(jì)算圖像旋轉(zhuǎn)參數(shù)*/
Void computeParameter();
/*進(jìn)行圖像旋轉(zhuǎn)處理*/
void rotate()
{
int i,j,intInc;
int intCapYInc;
int intCapX,intCapY;
/*進(jìn)行圖像旋轉(zhuǎn),重新賦值*/
//方框內(nèi)奇數(shù)行
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;
}
//判斷是否在原圖范圍內(nèi)
if((intCapX>=0) && (intCapX<numPixels) && (intCapY>=0) && (intCapY<numLines))
{
//傳送亮度信號(hào)
*(Uint8 *)(tempYbuffer + i*numPixels + j) = *(Uint8 *)(capYbuffer + intCapY*numPixels + intCapX);
}
else
{
*(Uint8 *)(tempYbuffer + i*numPixels + j) = 0xFF;
}
}
}
//方框內(nèi)偶數(shù)行
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;
}
//判斷是否在原圖范圍內(nèi)
if((intCapX>=0) && (intCapX<numPixels) && (intCapY>=0) && (intCapY<numLines))
{
//傳送亮度信號(hào)
*(Uint8 *)(tempYbuffer + i*numPixels + j) = *(Uint8 *)(capYbuffer + intCapY*numPixels + intCapX);
}
else
{
*(Uint8 *)(tempYbuffer + i*numPixels + j) = 0xFF;
}
}
}
}
曙海教育
曙海嵌入式學(xué)院
(課程:DSP培訓(xùn),FPGA培訓(xùn),MTK培訓(xùn),Android培訓(xùn),iPhone培訓(xùn))
電話(huà):021-51875830
網(wǎng)址:http://www.51qianru.cn
講師:李現(xiàn)路
版權(quán)所有-曙海教育 歡迎轉(zhuǎn)摘,轉(zhuǎn)摘請(qǐng)注明作者和出處