基于DSP的图像旋转讲解Word文件下载.docx

上传人:b****5 文档编号:19416025 上传时间:2023-01-06 格式:DOCX 页数:17 大小:110.05KB
下载 相关 举报
基于DSP的图像旋转讲解Word文件下载.docx_第1页
第1页 / 共17页
基于DSP的图像旋转讲解Word文件下载.docx_第2页
第2页 / 共17页
基于DSP的图像旋转讲解Word文件下载.docx_第3页
第3页 / 共17页
基于DSP的图像旋转讲解Word文件下载.docx_第4页
第4页 / 共17页
基于DSP的图像旋转讲解Word文件下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

基于DSP的图像旋转讲解Word文件下载.docx

《基于DSP的图像旋转讲解Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于DSP的图像旋转讲解Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。

基于DSP的图像旋转讲解Word文件下载.docx

但由于变换过程中根据公式计算结果,部分像素点旋转变换后的坐标值为小数,必须对其四舍五入取整,故在图像旋转后部分旋转角度下图像的某些像素点会丢失,造成图像中有灰黑斑点,但在±

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像素的旋转后图像。

实现了项目设计目的,达到了本次三级项目设计的要求,圆满完成了本次项目设计的任务。

对我而言,本项目设计不仅是对大学所学过的知识的总结和考察,而且更是一个扩大自己知识面,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1