图像处理平滑处理源程序.docx
《图像处理平滑处理源程序.docx》由会员分享,可在线阅读,更多相关《图像处理平滑处理源程序.docx(19页珍藏版)》请在冰豆网上搜索。
图像处理平滑处理源程序
/********************************************************************/
/*Copyright2004bySEEDIncorporated.*/
/*Allrightsreserved.PropertyofSEEDIncorporated.*/
/*Restrictedrightstouse,duplicateordisclosethiscodeare*/
/*grantedthroughcontract.*/
/**/
/********************************************************************/
/********************************************************************/
/*图像的平滑(平均模板)*/
/********************************************************************/
#include
#include
#include
#include
#include
#include
#include
#include"iic.h"
#include"vportcap.h"
#include"vportdis.h"
#include"sa7121h.h"
#include"TVP51xx.h"
#include"seeddm642.h"
/*SEEDDM642的emifa的设置结构*/
EMIFA_ConfigSeeddm642ConfigA={
0x00052078,/*gblctlEMIFA(B)globalcontrolregistervalue*/
/*将CLK6、4、1使能;将MRMODE置1;使能EK2EN,EK2RATE*/
0xffffffd3,/*cectl0CE0spacecontrolregistervalue*/
/*将CE0空间设为SDRAM*/
0x73a28e01,/*cectl1CE1spacecontrolregistervalue*/
/*Readhold:
1clock;
MTYPE:
0000,选择8位的异步接口
Readstrobe:
001110;14个clock宽度
TA:
2clock;Readsetup2clock;
Writehold:
2clock;Writestrobe:
14clock
Writesetup:
7clock
-----------------
\14c/1c
\----------------/*/
0x22a28a22,/*cectl2CE2spacecontrolregistervalue*/
0x22a28a42,/*cectl3CE3spacecontrolregistervalue*/
0x57115000,/*sdctlSDRAMcontrolregistervalue*/
0x0000081b,/*sdtimSDRAMtimingregistervalue*/
0x001faf4d,/*sdextSDRAMextensionregistervalue*/
0x00000002,/*cesec0CE0spacesecondarycontrolregistervalue*/
0x00000002,/*cesec1CE1spacesecondarycontrolregistervalue*/
0x00000002,/*cesec2CE2spacesecondarycontrolregistervalue*/
0x00000073/*cesec3CE3spacesecondarycontrolregistervalue*/
};
/*SEEDDM642的IIC的设置结构*/
I2C_ConfigSEEDDM642IIC_Config={
0,/*mastermode,i2coar;采用主模式*/
0,/*nointerrupt,i2cimr;只写,不读,采用无中断方式*/
(20-5),/*scllowtime,i2cclkl;*/
(20-5),/*sclhightime,i2cclkh;*/
1,/*configurelater,i2ccnt;*/
0,/*configurelater,i2csar;*/
0x4ea0,/*mastertxmode,*/
/*i2crunsfree,*/
/*8-bitdata+NACK*/
/*norepeatmode*/
(75-1),/*4MHzclock,i2cpsc*/
};
CHIP_ConfigSEEDDM642percfg={
CHIP_VP2+\
CHIP_VP1+\
CHIP_VP0+\
CHIP_I2C
};
I2C_HandlehSeeddm642i2c;
intportNumber;
externSA7121H_ConfParamssa7121hPAL[45];
externSA7121H_ConfParamssa7121hNTSC[45];
Uint8vFromat=0;
Uint8misc_ctrl=0x6D;
Uint8output_format=0x47;
//地址为0forcvbsport1,选择复合信号做为输入
Uint8input_sel=0x00;
/*地址为0xf,将Pin27设置成为CAPEN功能*/
Uint8pin_cfg=0x02;
/*地址为1B*/
Uint8chro_ctrl_2=0x14;
/*图像句柄的声明*/
VP_HandlevpHchannel0;
VP_HandlevpHchannel1;
VP_HandlevpHchannel2;
/*确定图像的参数*/
intnumPixels=720;//每行720个像素
intnumLines=576;//每帧576行(PAL)
/*确定处理的范围*/
/*A*/
/**/
/*D*/
intintAPixels=190;
intintALines=59;
intintDPixels=530;
intintDLines=229;
/*******************/
/*****画矩形边框函数的声明*****/
voiddrawRectangle();
/*平滑处理(平均模板)*/
voidAverageSmooth();
/*采集与显示缓冲区的首址*/
Uint32capYbuffer=0x80000000;
Uint32capCbbuffer=0x800675c0;
Uint32capCrbuffer=0x8009b0a0;
Uint32disYbuffer=0x80100000;
Uint32disCbbuffer=0x801675c0;
Uint32disCrbuffer=0x8019b0a0;
Uint32tempSrcYbuffer=0x80200000;//临时
Uint32tempDisYbuffer=0x80300000;//临时
/*图像格式标志*/
Uint8NTSCorPAL=0;
externfarvoidvectors();
externvolatileUint32capNewFrame;
externvolatileUint32disNewFrame;
/*此程序可将四个采集口的数据经过VideoPort0送出*/
voidmain()
{
Uint8addrI2C;
inti;
/*-------------------------------------------------------*/
/*performallinitializations*/
/*-------------------------------------------------------*/
/*InitialiseCSL,初始化CSL库*/
CSL_init();
CHIP_config(&SEEDDM642percfg);
/*----------------------------------------------------------*/
/*EMIFA的初始化,将CE0设为SDRAM空间,CE1设为异步空间
注,DM642支持的是EMIFA,而非EMIF*/
EMIFA_config(&Seeddm642ConfigA);
/*----------------------------------------------------------*/
/*中断向量表的初始化*/
//PointtotheIRQvectortable
IRQ_setVecs(vectors);
IRQ_nmiEnable();
IRQ_globalEnable();
IRQ_map(IRQ_EVT_VINT1,11);
IRQ_map(IRQ_EVT_VINT0,12);
IRQ_reset(IRQ_EVT_VINT1);
IRQ_reset(IRQ_EVT_VINT1);
/*打开一个数据拷贝的数据通路*/
DAT_open(DAT_CHAANY,DAT_PRI_LOW,DAT_OPEN_2D);
/*----------------------------------------------------------*/
/*进行IIC的初始化*/
hSeeddm642i2c=I2C_open(I2C_PORT0,I2C_OPEN_RESET);
I2C_config(hSeeddm642i2c,&SEEDDM642IIC_Config);
/*----------------------------------------------------------*/
/*进行TVP5150pbs的初始化*/
/*选择TVP5150,设置第三通路*/
GPIO_RSET(GPGC,0x0);/*将GPIO0不做为GPINT使用*/
GPIO_RSET(GPDIR,0x1);/*将GPIO0做为输出*/
GPIO_RSET(GPVAL,0x0);/*GPIO0输出为高,选择IIC1总线,配置
第二路,即为U21*/
addrI2C=0xBA>>1;
_IIC_write(hSeeddm642i2c,addrI2C,0x00,input_sel);
_IIC_write(hSeeddm642i2c,addrI2C,0x03,misc_ctrl);
_IIC_write(hSeeddm642i2c,addrI2C,0x0D,output_format);
_IIC_write(hSeeddm642i2c,addrI2C,0x0F,pin_cfg);
_IIC_write(hSeeddm642i2c,addrI2C,0x1B,chro_ctrl_2);
/*回读当前摄像设备的格式*/
_IIC_read(hSeeddm642i2c,addrI2C,0x8c,&vFromat);
vFromat=vFromat&0xff;
switch(vFromat)
{
caseTVP51XX_NTSCM:
caseTVP51XX_NTSC443:
NTSCorPAL=1;/*系统为NTSC的模式*/
break;
caseTVP51XX_PALBGHIN:
caseTVP51XX_PALM:
NTSCorPAL=0;/*系统为PAL的模式*/
break;
default:
NTSCorPAL=2;/*系统为不支持的模式*/
break;
}
if(NTSCorPAL==2)
{
/*系统不支持的模式,重新配置*/
for(;;)
{}
}
/*----------------------------------------------------------*/
/*进行SAA7121H的初始化*/
GPIO_RSET(GPVAL,0x0);/*GPIO0输出为低,选择IIC1总线,配置图像输出*/
addrI2C=0xB8>>1;/*选择第0路的I2C的地址*/
/*将第0路的视频输入口的数据口设为高阻状态,
使能SCLK,将第27脚设为输入*/
_IIC_write(hSeeddm642i2c,addrI2C,0x03,0x1);
/*配置SAA7121H*/
GPIO_RSET(GPVAL,0x1);/*GPIO0输出为低,选择IIC1总线,配置图像输出*/
/*初始化VideoPort0*/
/*将VedioPort1设为encoder输出*/
portNumber=0;
vpHchannel0=bt656_8bit_ncfd(portNumber);
for(i=0;i<100000;i++);
SEEDDM642_rset(SEEDDM642_WDOGEN,2);
addrI2C=0x88>>1;
for(i=0;i<43;i++)
{
if(NTSCorPAL==1)
{
_IIC_write(hSeeddm642i2c,
addrI2C,
(sa7121hNTSC[i].regsubaddr),
(sa7121hNTSC[i].regvule));
}
else
{
_IIC_write(hSeeddm642i2c,
addrI2C,
(sa7121hPAL[i].regsubaddr),
(sa7121hPAL[i].regvule));
}
}
/*----------------------------------------------------------*/
/*初始化VideoPort1*/
/*将VedioPort1设为采集输入*/
portNumber=1;
vpHchannel1=bt656_8bit_ncfc(portNumber);
bt656_capture_start(vpHchannel1);
/*等待第一帧数据采集完成*/
while(capNewFrame==0){}
/*将数据存入显示缓冲区,并清采集完成的标志*/
capNewFrame=0;
for(i=0;i{
/*传送临时Y缓冲区*/
DAT_copy((void*)(capYbuffer+i*numPixels),
(void*)(tempSrcYbuffer+i*numPixels),
numPixels);
/*传送临时Y缓冲区*/
DAT_copy((void*)(capYbuffer+i*numPixels),
(void*)(tempDisYbuffer+i*numPixels),
numPixels);
}
/*平滑处理(平均模板)*/
AverageSmooth();
/*画边框*/
drawRectangle();
for(i=0;i{
/*传送Y缓冲区*/
DAT_copy((void*)(tempDisYbuffer+i*numPixels),
(void*)(disYbuffer+i*numPixels),
numPixels);
}
//清除彩色信号
for(i=0;i<0x33ae0;i++)
{
*((Uint8*)(disCrbuffer+i))=0x80;
*((Uint8*)(disCbbuffer+i))=0x80;
}
/*启动显示模块*/
bt656_display_start(vpHchannel0);
/*建立显示的实时循环*/
for(;;)
{
/*当采集区的数据已经采集好,而显示缓冲区的数据已空*/
if((capNewFrame==1)&&(disNewFrame==1))
{
/*将数据装入显示缓冲区,并清采集完成的标志*/
capNewFrame=0;
disNewFrame=0;
for(i=0;i{
/*传送临时Y缓冲区*/
DAT_copy((void*)(capYbuffer+i*numPixels),
(void*)(tempSrcYbuffer+i*numPixels),
numPixels);
/*传送临时Y缓冲区*/
DAT_copy((void*)(capYbuffer+i*numPixels),
(void*)(tempDisYbuffer+i*numPixels),
numPixels);
}
/*平滑处理(平均模板)*/
AverageSmooth();
/*画边框*/
drawRectangle();
for(i=0;i{
/*传送Y缓冲区*/
DAT_copy((void*)(tempDisYbuffer+i*numPixels),
(void*)(disYbuffer+i*numPixels),
numPixels);
}
}
}
for(;;)
{}
/*----------------------------------------------------------*/
/*采集与回放*/
}
/*画矩形边框函数的定义*/
voiddrawRectangle()
{
inti,j;
/*画上边*/
//奇数行
for(i=intALines-4;i{
for(j=intAPixels-6;j{
*(Uint8*)(tempDisYbuffer+i*numPixels+j)=0x00;
}
}
//偶数行
for(i=numLines/2+intALines-4;i{
for(j=intAPixels-6;j{
*(Uint8*)(tempDisYbuffer+i*numPixels+j)=0x00;
}
}
/*画下边*/
//奇数行
for(i=intDLines;i{
for(j=intAPixels-6;j{
*(Uint8*)(tempDisYbuffer+i*numPixels+j)=0x00;
}
}
//偶数行
for(i=numLines/2+intDLines;i{
for(j=intAPixels-6;j{
*(Uint8*)(tempDisYbuffer+i*numPixels+j)=0x00;
}
}
/*画左边*/
//奇数行
for(i=intALines;i{
for(j=intAPixels-6;j{
*(Uint8*)(tempDisYbuffer+i*numPixels+j)=0x00;
}
}
//偶数行
for(i=numLines/2+intALines;i{
for(j=intAPixels-6;j{
*(Uint8*)(tempDisYbuffer+i*numPixels+j)=0x00;
}
}
/*画右边*/
//奇数行
for(i=intALines;i{
for(j=intDPixels;j{
*(Uint8*)(tempDisYbuffer+i*numPixels+j)=0x00;
}
}
//偶数行
for(i=numLines/2+intALines;i{
for(j=intDPixels;j{
*(Uint8*)(tempDisYbuffer+i*numPixels+j)=0x00;