⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 这是今年ADI大赛我参与的另一个获奖的项目列缝检测仪的源文件
💻 C
字号:
#include "bf5xx.h"
#include "types.h"

#define  LCDLine  262
#define  LCDWidth 320

#define	 Tag1LeftX   10
#define	 Tag1UpY  	 10
#define	 Tag1RightX  70
#define	 Tag1DownY   30

#define	 Tag2LeftX   10
#define	 Tag2UpY  	 50
#define	 Tag2RightX  50
#define	 Tag2DownY   70

#define	 Tag3LeftX   10
#define	 Tag3UpY  	 90
#define	 Tag3RightX  50
#define	 Tag3DownY   110

#define	 Tag4LeftX   10
#define	 Tag4UpY  	 130
#define	 Tag4RightX  50
#define	 Tag4DownY   150

#define	 Tag5LeftX   10
#define	 Tag5UpY  	 170
#define	 Tag5RightX  50
#define	 Tag5DownY   190






uint8_t Sensor_Reg[SENSOR_REG_SIZE];
section ("sdram0") unsigned char  DisplayBuffer[LCDLine][960] ;
section ("sdram0") unsigned char  DisProBuffer[LCDLine][LCDWidth] ;
section ("sdram0") unsigned char  ImaProBuffer[LINES_PER_FRAME][PIXEL_PER_LINE] ;
section ("sdram0") unsigned char  ImageBuffer[LINES_PER_FRAME][PIXEL_PER_LINE] ;
section ("sdram0")volatile uint16_t VideoInputFrame[LINES_PER_FRAME][PIXEL_PER_LINE];
//unsigned char DisplayBuffer[251574];
//section ("sdram0") uint16_t DisplayBuffer[LCDLine][960] ;
section ("sdram0") unsigned char  TempBuffer_img[LCDLine][960] ;
volatile uint16_t *pDestAddr = &VideoInputFrame[0][0];	

int pCtrOut_Flag_OEstate;//我为了看程序状态设定的cpld变量

int pCtrOut_Flag_bstate;//我为了看程序状态设定的cpld变量


/**********************************************************************************
* 名称 :FillImaBuf(void)
* 功能 :填充图像缓冲区函数,
		 将拍摄到的图像(VideoInputFrame)写入图像缓存(ImageBuffer)和图像处理缓存ImaProBuffer
* 入口参数 :无
* 出口参数 :无
* 说明	   :	uint16_t VideoInputFrame[640][480]:UYVY格式;
				unsigned char ImageBuffer[640][480]:灰度图;
				unsigned char ImaProBuffer[640][480]:灰度图;
***********************************************************************************/
void FillImaBuf(void)
{
	int i,j;
	unsigned char r,g,b,y,u,v;
	int a,d;
	int videoline,videocol;
	int ImaProLine;
    int ImaProCol;
    int ImageLine;
    int	ImageCol;
	int disline,discol;
/*
UYVY格式跟YUY2类似,只是图像数据中YUV分量的排列顺序有所不同:
U0 Y0 V0 Y1    U2 Y2 V2 Y3  	U4 Y4 V4 Y5		U6 Y6 V6 Y7		U8 Y8 V8 Y9	......

Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B

R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U

YUV=YCbCr   
        RGB的分量为   
    R=Y+1.402*(Cr-0.5);   
    G=Y-0.34414*(Cb-0.5)-0.71414*(Cr-0.5));   
    b=Y+1.772*(cb-0.5)   
          
R = Y + 1.772(V-128) 
B = Y + 1.402(U-128) 
G = Y - 0.714(U-128) - 0.344(V-128)
*/
	for(i=0;i<LINES_PER_FRAME;i++)
	{
		for(j=0;j<PIXEL_PER_LINE;j++)
		{
		    videoline=i;
		    videocol=j;
			u = VideoInputFrame[videoline][videocol]; // u0 y0 v0 y1 u2 y2 v2 y3
			y = VideoInputFrame[videoline][videocol]/256;  // G = Y - 0.39U - 0.58V 低位数据
			v = VideoInputFrame[videoline][videocol+1];// B = Y + 2.03U

            ImaProLine=i;
            ImaProCol=j;
            ImageLine=i;
            ImageCol=j;
      		ImageBuffer[ImageLine][ImageCol]   =  y;	// 把亮度值放在单独的图象缓存中
		   	ImaProBuffer[ImaProLine][ImaProCol]   =  y;	// 把亮度值放在单独的图象处理缓存中	   	
		}
	}
		
}

/**********************************************************************************
* 名称 :FillDisProBuf(void)
* 功能 :填充图像处理显示缓冲区函数,
		 将处理完后的的图像(ImaProBuffer)写入图像处理结果显示缓存(DisProBuffer)
* 入口参数 :无
* 出口参数 :无
* 说明	   :	unsigned char ImaProBuffer[640][480]:灰度图;
				unsigned char DisProBuffer[262][960]:RGB格式;
***********************************************************************************/
void FillDisProBuf(void)
{
	int i,j;
	unsigned char r,g,b,y,u,v;
	int a,d;

	int disproline,disprocol;
	int ImaProLine;
    int ImaProCol;


	for(i=0;i<240;i++)
	{
		for(j=0;j<LCDWidth;j++)
		{
		    ImaProLine=i*2;
		    ImaProCol=j*2;
		    disproline=i;
		    disprocol=j;
	
			y=ImaProBuffer[ImaProLine][ImaProCol]; 
            
			DisProBuffer[disproline][disprocol]=y;	
	
		}
	}		
}

/**********************************************************************************
* 名称 :FillDisBuf(void)
* 功能 :填充图像显示缓冲区
		 将拍摄到的彩色图像(ImaProBuffer)写入图像处理结果显示缓存(DisplayBuffer)
* 入口参数 :无
* 出口参数 :无
* 说明	   :	uint16_t VideoInputFrame[640][480]:UYVY格式;
				unsigned char DisplayBuffer[262][960]:RGB格式;
***********************************************************************************/
void FillDisBuf(void)
{
	int i,j;
	int r,g,b;
	unsigned char y,u,v;
	int a,d;
	int videoline,videocol;
	int disline,discol;

// UYVY格式跟YUY2类似,只是图像数据中YUV分量的排列顺序有所不同:
//U0 Y0 V0 Y1    U2 Y2 V2 Y3  	U4 Y4 V4 Y5		U6 Y6 V6 Y7		U8 Y8 V8 Y9	......	
/*
Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B

R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U

YUV=YCbCr   
        RGB的分量为   
          R=Y+1.402*(Cr-0.5);   
          G=Y-0.34414*(Cb-0.5)-0.71414*(Cr-0.5));   
          b=Y+1.772*(cb-0.5)   
          
 R = Y + 1.772(V-128) 
B = Y + 1.402(U-128) 
G = Y - 0.714(U-128) - 0.344(V-128)
*/

	for(i=0;i<240;i++)
	{
		for(j=0;j<LCDWidth;j++)
		{
		    videoline=i*2;
		    videocol=j*2;
			u  = VideoInputFrame[videoline][videocol]; // u0 y0 v0 y1 u2 y2 v2 y3
			y = VideoInputFrame[videoline][videocol]/256;  // G = Y - 0.39U - 0.58V 低位数据
			v = VideoInputFrame[videoline][videocol+1];// B = Y + 2.03U
	
  	disline=i+22;
	discol=j*3;

 	r = y + 1.772*(v-128); 
	b = y + 1.402*(u-128) ;
	g = y - 0.714*(u-128) - 0.344*(v-128);
	if(r>255)r=255;
	if(g>255)g=255;
	if(b>255)b=255;
	
			DisplayBuffer[disline][discol]   =  r;	// R = Y + 1.14V 高位的uyvy格式
			DisplayBuffer[disline][discol+1] =  g;  // G = Y - 0.39U - 0.58V 低位数据
			DisplayBuffer[disline][discol+2] =  b;  // B = Y + 2.03U

		}
	}
		
}

/**********************************************************************************
* 名称 :main()
* 功能 :初始化各函数,实现图象捕捉,然后处理,最后LCD显示。
* 入口参数 :无
* 出口参数 :无
说明:
		1:注意,整个工程过程中拍摄图像和显示图像都用到ppi总线,必须设法将他们错开,才能显示动态图像!!!!
		2:设法将内存分成几个缓冲区,采用乒乓缓存形势跑整个流程
		3:整个程序的架构应该尽快出来
***********************************************************************************/
int main()                                                                                                                                                                               
{	
	int i,j;
	int Index;
	int PositionX;
	int PositionY;
	unsigned char t;
	unsigned char notknow[5];
	double		  CrackWidth;
	int in_loop = 1;
	Set_PLL(22,5);
	
	Init_SDRAM();	
	Init_EBIU();
//	VideoInputFrame[0][0]=0X1100;
//	t=VideoInputFrame[0][0];
    Init_Flash();
	Init_Platform_CMOS();
//	Init_Platform_TSP();
 	printf( "\nPlatform initialize success!\n" );
    Init_Po3030();
    printf( "\nPo3030 initialize success!\n" );
   
   
	Setup_LEDs(); 
	Leda_Off();
	Led9_On();
	delay(100);
	
	Video_Frame_Capture( (void*) pDestAddr );//图像采集	
	delay(100000);	
	FillImaBuf();//图像采集后填充各数据缓冲区----缓存
	
//以下五个函数是图象处理和裂缝计算函数
   	/*SidesWhite(ImaProBuffer, PIXEL_PER_LINE, LINES_PER_FRAME);//图像截取
	
	SegOSTU(ImaProBuffer, PIXEL_PER_LINE, LINES_PER_FRAME, notknow);//图像分割
	
	Reserve(ImaProBuffer, PIXEL_PER_LINE, LINES_PER_FRAME);//图像反色处理
	
	SingleSpot(ImaProBuffer, PIXEL_PER_LINE, LINES_PER_FRAME);//以四联通为标准进行孤立点去除
	
	CrackWidth=WidthCal(ImaProBuffer, PIXEL_PER_LINE, LINES_PER_FRAME, LINES_PER_FRAME/2, 30);//裂纹宽度计算
	

	FillDisProBuf();*/
	 
		
    FillDisBuf();//填充图像显示缓存,为显示作准备0
	    
	Ruler(DisplayBuffer,  LCDWidth,LCDLine,LCDLine/2+12, 10);//在图像中间加上标尺显示
	
	//在图像相应区域显示标签
	Tag(DisplayBuffer, LCDWidth,LCDLine,Tag1LeftX,Tag1UpY,Tag1RightX,Tag1DownY, 0,0,255);
	
	//在图像相应区域显示标签
	Tag(DisplayBuffer, LCDWidth,LCDLine,Tag2LeftX,Tag2UpY ,Tag2RightX,Tag2DownY, 255,0,0);
	
	//在图像相应区域显示标签
	Tag(DisplayBuffer, LCDWidth,LCDLine,Tag3LeftX,Tag3UpY ,Tag3RightX,Tag3DownY, 0,0,255);
	
	//在图像相应区域显示标签
	Tag(DisplayBuffer, LCDWidth,LCDLine,Tag4LeftX,Tag4UpY ,Tag4RightX,Tag4DownY, 0,0,255);
	
    Index=1;//在图像缓存中相应位置贴上字的图像,相当于写字;
	PositionX=225;
	PositionY=180+22;
	PasteWord(DisplayBuffer, LCDWidth,LCDLine,Index, PositionX+40, PositionY-50);//在图像指定位置添加指定字符
	PasteResult(CrackWidth,DisplayBuffer, LCDWidth, LCDLine, PositionX, PositionY);//在图像指定位置添加指定数值
	
/*	PositionX=225+LCDWidth;//在图像缓存中相应位置贴上字的图像,相当于写字;
	PositionY=180+22;
	PasteWord(DisplayBuffer, LCDWidth,LCDLine,Index, PositionX+40, PositionY-50);//在图像指定位置添加指定字符
	PasteResult(CrackWidth,DisplayBuffer, LCDWidth, LCDLine, PositionX, PositionY);//在图像指定位置添加指定数值
	
	PositionX=225+640;//在图像缓存中相应位置贴上字的图像,相当于写字;
	PositionY=180+22;
	PasteWord(DisplayBuffer, LCDWidth,LCDLine,Index, PositionX+40, PositionY-50);//在图像指定位置添加指定字符
	PasteResult(CrackWidth,DisplayBuffer, LCDWidth, LCDLine, PositionX, PositionY);//在图像指定位置添加指定数值
*/
    Init_Platform_TSP();//触摸屏初始化,以下三句是一个整体
	ADS_SPI_Init();
	ADS_INT_Enable();
	printf( "\nTSP initialize success!\n" );//触摸屏初始化*/	
    mdelay(20000);
	Init_PPIDMA(DisplayBuffer);//图像显示,以下两句是一个整体	
	Init_Platform_TFT();
	delay(100000);
	printf( "\nDisplay success!\n" );
	
//	delay(100000000);
	
	while(1)
	{

	}
}






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -