📄 main.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 + -