以文本方式查看主题 - 曙海教育集团论坛 (http://sun4.cn/bbs/index.asp) -- DSP系统和硬件开发讨论区 (http://sun4.cn/bbs/list.asp?boardid=5) ---- 李现路:DSP6000图像位置移动与变形的典型算法(一) (http://sun4.cn/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), |