以文本方式查看主題 - 曙海教育集團論壇 (http://www.xinguifushi.cn/bbs/index.asp) -- DSP系統和硬件開發討論區 (http://www.xinguifushi.cn/bbs/list.asp?boardid=5) ---- 李現路:DSP6000圖像位置移動與變形的典型算法(四) (http://www.xinguifushi.cn/bbs/dispbbs.asp?boardid=5&id=85) |
-- 作者:admin -- 發布時間:2009-12-3 13:49:29 -- 李現路:DSP6000圖像位置移動與變形的典型算法(四) 李現路: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 講師:李現路 版權所有-曙海教育 歡迎轉摘,轉摘請注明作者和出處 |