以文本方式查看主題 - 曙海教育集團論壇 (http://www.hufushizhe.com/bbs/index.asp) -- DSP系統和硬件開發討論區 (http://www.hufushizhe.com/bbs/list.asp?boardid=5) ---- 李現路:DSP6000圖像位置移動與變形的典型算法(一) (http://www.hufushizhe.com/bbs/dispbbs.asp?boardid=5&id=82) |
-- 作者:admin -- 發布時間:2009-12-3 13:46:58 -- 李現路:DSP6000圖像位置移動與變形的典型算法(一)
李現路:DSP6000圖像位置移動與變形的典型算法(一)
一、圖像的平移算法 圖像平移的數學表達式原理: 初始坐標為(x0,y0)的點經過平移(tx,ty)(以向右,向下為正方向)后,坐標變為(x1,y1)。這兩點之間的關系是x1=x0+tx,y1=y0+ty 。 這樣,平移后的圖像上的每一點都可以在原圖像中找到對應的點。例如,對于新圖中的(0,0)像素,代入上面的議程組,可以求出對應原圖中的點,可以直接將它的像素值同意設置為0或者255(對于灰度圖就是黑色或白色)。 同樣,若有點不在原圖中,也就說明原圖中有點被移出顯示區域。如果不想丟失被移出的部分圖像,可以將新生成的圖像擴大tx,高度擴大ty。
平移處理的C語言代碼:
/*圖像偏移量初始化*/ Int intXOffset=-200; //水平偏移量 Int intYOffset=-200; //垂直偏移量,必須是2的整數 void geometryTrans() { int i,j; int intCapX,intCapY; for(i=0;i<numLines;i++) //行數 { for(j=0;j<numPixels;j++) //像素數 /每行 { intCapX = j-intXOffset; intCapY = i-intYOffset/2;
// 判斷 是否在原圖范圍內 if((intCapX>=0) && (intCapX<numPixels)) { //奇數行 if((i<numLines/2) && (intCapY>=0) && (intCapY<numLines/2)) { // 傳送亮度信號 *(Uint8 *)(tempYbuffer + i*numPixels + j) = *(Uint8 *)(capYbuffer + (i-intYOffset/2)*numPixels + intCapX); } //偶數行 else if((i>=numLines/2) && (i<numLines) && (intCapY>=numLines/2) && (intCapY<numLines)) { // 傳送亮度信號 *(Uint8 *)(tempYbuffer + i*numPixels + j) = *(Uint8 *)(capYbuffer + (i-intYOffset/2)*numPixels + intCapX); } else { *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0xFF; } } else { *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0xFF; } } } } 二、圖像的垂直鏡像變換算法 數學表達式原理: 設圖像高度為IHeight,寬度為IWidth,原圖中(x0,y0)垂直鏡像后將變為(x0, IHeight-y0),其表達式為: 設圖像高度為IHeight,寬度為IWidth,原圖中(x0,y0)垂直鏡像后將變為(x0, IHeight-y0),其表達式為: X0=x1; y0=IHeight-y1
算法的C語言代碼:
portNumber = 0; vpHchannel0 = bt656_8bit_ncfc(portNumber); bt656_capture_start(vpHchannel0); /*等待第一幀數據采集完成*/ while(capNewFrame == 0){} /*將數據存入顯示緩沖區,并清采集完成的標志*/ capNewFrame =0;
for(i=0;i<numLines;i++) { /*傳送Y緩沖區*/ //前半部分為原始圖像 DAT_copy((void *)(capYbuffer + i * numPixels), (void *)(disYbuffer + i * numPixels), numPixels>>1); //后半部分為垂直鏡像圖像 DAT_copy((void *)(capYbuffer + i * numPixels), |