基于DSP的图像旋转讲解Word文件下载.docx
《基于DSP的图像旋转讲解Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于DSP的图像旋转讲解Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
但由于变换过程中根据公式计算结果,部分像素点旋转变换后的坐标值为小数,必须对其四舍五入取整,故在图像旋转后部分旋转角度下图像的某些像素点会丢失,造成图像中有灰黑斑点,但在±
90°
,180°
情况下图像完全正常。
由上所述,结合其他知识可编图像旋转程序如下:
xData=(IMGWIDTH/2-1)+(long)((float)(x-(IMGWIDTH/2-1))*cos(theta)-(float)
(i-(IMGHEIGHT/2-1))*sin(theta)+0.50);
yData=(IMGHEIGHT/2-1)+(long)((float)(x-(IMGWIDTH/2-1))*sin(theta)+(float)
(i-(IMGHEIGHT/2-1))*cos(theta)+0.50);
y[xData][yData]=buffer[i*xsample+xstart];
//y[IMGWIDTH][IMGHEIGHT]
4软件程序设计
4.1程序流程图
图1程序流程图
4.2初始化程序
voidCLK_init(unsignedintnPLL)//时钟初始化
{
ioportunsignedint*clkmd;
clkmd=(unsignedint*)0x1c00;
*clkmd=nPLL;
//0x2033;
//0x2413;
//144MHz//2613
}
voidEMIF_init(void)//外部存储器接口
{
ioportunsignedint*CE21=(unsignedint*)0x809;
*CE21=0x1fff;
voidTMCR_reset(void)
ioportunsignedint*TMCR_MGS3=(unsignedint*)0x07FE;
ioportunsignedint*TMCR_MM=(unsignedint*)0x07FF;
*TMCR_MGS3=0x510;
*TMCR_MM=0x000;
voidSDRAM_init(void)//定义SDRAM引脚,以及控制寄存器时,并进行初始化
ioportunsignedint*ebsr=(unsignedint*)0x6c00;
ioportunsignedint*egcr=(unsignedint*)0x800;
ioportunsignedint*emirst=(unsignedint*)0x801;
ioportunsignedint*ce01=(unsignedint*)0x803;
ioportunsignedint*ce11=(unsignedint*)0x806;
ioportunsignedint*ce21=(unsignedint*)0x809;
ioportunsignedint*ce31=(unsignedint*)0x80C;
ioportunsignedint*sdc1=(unsignedint*)0x80F;
ioportunsignedint*init=(unsignedint*)0x812;
ioportunsignedint*sdc2=(unsignedint*)0x813;
*ebsr=0x221;
//0xa01
*egcr=0x200;
*egcr=0X220;
*ce01=0X3000;
*ce11=0X3fff;
*ce21=0x1fff;
*ce31=0x1000;
*emirst=0;
*sdc1=0X5958;
*sdc2=0X38F;
*init=0;
}
4.3主程序
ioportunsignedint*sysR=(unsignedint*)0x7fd;
#defineIDKCCMDRESET2
#defineIDKCCMDCAPTURE4
#defineIDKCCMDRESETRP8
#defineIDKCCMDRESETWP0x10
#defineIDKCCMDCOLOR0x20
#defineIDKIMGREADY2
//ICETEK-TVP5150-E板控制寄存器定义
#defineIDKCCTRGR(*(unsignedshortint*)0x601800)
#defineIDKCDATA(*(unsignedchar*)0x601802)
#defineIDKCI2CR(*(unsignedshortint*)0x601804)
#defineIDKCSTATUS(*(unsignedshortint*)0x601806)
#defineI2C_REG(*(unsignedshortint*)0x601804)
#defineCREG(*(unsignedshortint*)0x400004)
voidDelay(unsignedintnTime);
//延时
voidStartIIC(void);
//启动I2C总线传输
voidStopIIC(void);
//结束I2C总线传输
voidAckIIC(void);
voidWriteIIC(unsignedchardata);
//I2C总线传送控制字节
voidInit5150(void);
//初始化ICETEK-TVP5150-E板
voidDelayMSEC(unsignedintnDelay);
voidClose5150(void);
//关闭ICETEK-TVP5150-E板
#defineVIDEOWIDTH720//摄像头采集图像宽度
#defineVIDEOHEIGHT288//摄像头采集图像高度
#defineIMGWIDTH120//选取图像宽度
#defineIMGHEIGHT120/选取图像高度
#defineXSTART0//选取图像x方向起始点
#defineYSTART0//选取图像y方向起始点
#defineXSAMPLE6//x方向采集率
#defineYSAMPLE2.4//y方向采集率
#defineIMGBUFFER0x200000
#definephi360//选择要旋转的角度
#definetheta(phi/180.0*acos(-1))//
unsignedint*www;
unsignedintbuffer[724],y[IMGWIDTH][IMGHEIGHT];
FARPTRlpImage,pImage;
main()
longinti,j,x,xx;
intc,xstart,ystart,xsample,ysample;
unsignedcharcWork,ccc;
longxData,yData;
pImage=lpImage=IMGBUFFER;
xx=1;
c=0;
for(j=0;
j<
IMGWIDTH;
j++)把缓存清零
{
for(i=0;
i<
IMGHEIGHT;
i++)
y[j][i]=0;
//y变量赋初值
}
SDRAM_init();
CLK_init(0x21f3);
//设置DSP时钟
CREG=1;
//使能外部总线接口,选择储存器是SDRAM
xsample=XSAMPLE;
//横向抽样率
ysample=YSAMPLE;
//纵向抽样率
xstart=XSTART;
//起始象素
ystart=YSTART;
//起始行
(*sysR)=2;
Init5150();
//初始化ICETEK-TVP5150-E
CLK_init(0x22d3);
//提高DSP运行速度
(*sysR)=0;
while
(1)
if(xx)//通过控制FIFO读取图像
{
IDKCCTRGR=IDKCCMDRESET;
//复位ICETEK-TVP5150-E
Delay(16);
IDKCCTRGR=0;
IDKCCTRGR=IDKCCMDRESETWP;
//复位FIFO写指针
IDKCCTRGR=IDKCCMDCAPTURE;
//开始采集图象
Delay(20);
}
x=0;
IDKCCTRGR=IDKCCMDRESETRP;
Delay(20);
IDKCCTRGR=0;
cWork=IDKCDATA;
724;
i++)buffer[i]=0;
c;
i++)cWork=IDKCDATA;
//将数值存入变量
for(j=0;
VIDEOHEIGHT;
j++)
cWork=IDKCDATA;
for(i=0;
VIDEOWIDTH;
{
cWork=IDKCDATA;
buffer[i]=cWork;
//将像素存入buffer缓存
far_poke(lpImage++,cWork);
//向扩展存储器地址写入一个整数
}
if(x<
IMGHEIGHT&
&
j>
=ystart&
(j%ysample==0))//抽样生成120x96尺寸图象
for(i=0;
{
xData=(IMGWIDTH/2-1)+(long)((float)(x-(IMGWIDTH/2-1))*cos(theta)-(float)(i-(IMGHEIGHT/2-1))*sin(theta)+0.50);
yData=(IMGHEIGHT/2-1)+(long)((float)(x-(IMGWIDTH/2-1))*sin(theta)+(float)(i-(IMGHEIGHT/2-1))*cos(theta)+0.50);
if((xData>
=0)&
(xData<
=(IMGWIDTH-1))&
(yData>
(yData<
=(IMGHEIGHT-1)))
{
y[xData][yData]=buffer[i*xsample+xstart];
//将抽样后的图像存入缓存y
}
}
x++;
ccc=IDKCSTATUS;
//BREAKPOINT在此加软件断点
voidStartIIC(void)
I2C_REG=0x05;
/*"
00100101"
:
sda,scl='
1'
*/
DelayMSEC
(1);
I2C_REG=0x04;
00100100"
sda='
0'
scl='
voidStopIIC(void)
I2C_REG=0x024;
sda='
I2C_REG=0x025;
voidAckIIC(void)
I2C_REG=0x020;
sda='
z'
I2C_REG=0x022;
I2C_REG=0x026;
I2C_REG=0x021;
voidWriteIIC(unsignedchardata)
unsignedcharBitCounter=8;
unsignedcharTemp;
unsignedintreg_val;
reg_val=0x020;
I2C_REG=0x20;
/*SCL置低sda置低*/
/*延时*/
do{
Temp=data;
reg_val&
=0x0fffffffb;
I2C_REG=reg_val;
/*SCL置低*/
DelayMSEC
(1);
/*延时*/
if((Temp&
0x80)==0x80)
reg_val|=0x01;
/*如果最高位是1*/
else
reg_val&
=0x0fffffe;
/*设置SDA*/
reg_val|=0x004;
/*SCL置高*/
Temp=data<
<
1;
data=Temp;
BitCounter--;
}while(BitCounter);
reg_val&
I2C_REG=reg_val;
DelayMSEC(3);
voidInit5150(void)//使用TVP5150作为图像解码芯片,IIC总线控制
StartIIC();
WriteIIC(0x0ba);
AckIIC();
WriteIIC(0x03);
WriteIIC(0x08f);
WriteIIC(0x06);
//yonly
WriteIIC(0x010);
StopIIC();
DelayMSEC(10);
voidDelayMSEC(unsignedintnDelay)
unsignedinti,k;
for(i=0;
nDelay*64;
k++;
4.4命令文件
-w
-stack500
-sysstack500
-lrts55x.lib
MEMORY;
用来指定目标储存器结构
;
命名一个存储空间范围
o指定存储段的开始地址
l指定存储段的长度
DARAM:
o=0x100,l=0x7f00
VECT:
o=0x8000,l=0x100
DARAM2:
o=0x8100,l=0x7f00
SARAM:
o=0x10000,l=0x10000
SDRAM:
o=0x40000,l=0x3e0000
SECTIONS;
用来控制段的构成与地址分配
定义用来填充未初始化空间的值
.text:
{}>
DARAM;
存放程序代码
.vectors:
VECT
.trcinit:
DARAM
.gblinit:
frt:
.cinit:
DARAM;
存放程序中的变量初值和常量
.pinit:
.sysinit:
.bss:
SDRAM;
为程序中的全局和静态变量保留存储空间
.far:
DARAM2;
为程序中用far声明的全局和静态变量保留空间
.const:
存放程序中的字符常量、浮点常量和用const声明的变量
.switch:
存放程序中switch语句的跳转地址表
.sysmem:
用于程序中的malloc、calloc和realoc函数动态分配存储空间(C语言的堆)
.cio:
DARAM2
.MEM$obj:
.sysheap:
.sysstack{}>
.stack:
为程序系统堆栈保留存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果(C语言的栈)
.image:
SDRAM
5程序调试运行
5.1程序测试流程图
图2程序测试流程图
5.2程序测试
⑴配置CCS3.3软件,芯片选择C5509AXDS510Emulator,安装好驱动程序后连接到ICETEKDSP教学试验箱,打开目标程序工程文件。
⑵编译已经编写成功的程序,编译成功后在合适位置添加软件断点,如图3所示:
图3添加程序断点
⑶导入并执行.out文件,采集图像,如图4所示:
图4执行.out文件
⑷设置旋转后图像参数,如图5:
图5设置参数
⑸显示旋转后图像,并修改不同旋转角度,并记录结果如下:
图6原图
图7顺时针旋转90度
图8逆时针旋转90度
图9顺时针旋转180度
修改旋转角度,调整图像旋转,然后观察旋转后生成的图像,并用其与原图像相比。
从结果中可以看出,实践证明,本程序的算法是正确可靠的。
6结论与总结
本次项目采用教学实验图像处理平台,以TMS320C5509芯片为主处理芯片的ICETEKDSP教学试验箱。
实验源图像数据为由SDRAM中的722*228存储图像采样生成,经旋转处理后生成大小为120*96像素的旋转后图像。
实现了项目设计目的,达到了本次三级项目设计的要求,圆满完成了本次项目设计的任务。
对我而言,本项目设计不仅是对大学所学过的知识的总结和考察,而且更是一个扩大自己知识面,