Maolin 的第一篇博客

一直想写博客,从大一开始学习技术的时候到现在大四快毕业了了,从来没有写过博客。但是做技术的,如果没有记录下自己的点点滴滴,过去的一切都是浮云。仔细回想一下,从大一开始,做过的项目已经数不过来了,但是都没有用博客记录下来真是遗憾。有的项目甚至源代码都搞掉了。现在写下博客,或是回顾以前的项目,或是记录正在做的项目。慢慢的提高自己。

今天这篇博客,也简单讲讲自己目前的这个项目。使用STM32F767作为主控芯片,接收两路摄像头数据,并且融合。一路摄像头数据来自SPI,另外一路来自DCMI。说实话,用32来做视频处理,真心不知道是怎么想的,根本不能够跑复杂的图像算法。目前只有简单的来点融合。贴个代码给自己看看:

void Flir_Display(void)
{
float index;
u8 *pname; //带路径的文件名 
u8 res;
u16 u,u1,u2,u3,u4,sent;
int by;
u16 max_data,max_data_i,max_data_j,status;
u32 i,j;
u16 *jpeg;
u32 aveg; 
int tempreter = 0;
u8 *wifi_date;                          // wifi待发送数据指针
u8 FrameHeader[3] = {0x55,0xaa,0x55};   // UDP收发同步帧头

pname=mymalloc(SRAMIN,30);//为带路径的文件名分配30个字节的内存  
  while(pname==NULL) //内存分配出错
  {    
LCD_ShowString(30,50,200,16,16,(u8 *)"内存分配失败!");
delay_ms(200);  
LCD_Clear(WHITE);     
delay_ms(200);  


LCD_Clear(WHITE);
while(1)        
{
SPI2_Readbuff((u8 *)xx,82); //读取第一行     
if((xx[0][0] & 0x00ff) == 0)
{
SPI2_Readbuff((u8 *)(&xx[1][0]),82*59);
if((xx[59][0] & 0xff) == 59)
{
jpeg=(u16 *)jpeg_data_buf[disbuff];


#ifdef WifiSend_ON
for(j=0;j<320*80;j++)               // OV5640_Data       UDP Wifi_Data缓存
{
i = j * 3;
sendbuf[sendfps][j] = (jpeg[i] & 0x1f) + ((jpeg[i+1] & 0x1f)<<5) + ((jpeg[i+2] & 0x1f)<<10);
}
for(i=0;i<60;i++)                   // Flir_Data         UDP Wifi_Data缓存
{
for(j=0;j<80;j++)
{
sendbuf[sendfps][(i+320)*80+j] = xx[i][j+2];
}
}

//WIFI发送 sendbuf[sendfps][30400] 这一帧数据即可
//数据 0 - 320*80*2(51200)为摄像头数据    51200 - 30400*2 为Flir 原始数据。
/*************************wifi发送***********************/
wifi_date = (u8*)sendbuf[sendfps];                        // 30400 * 16bit ------> 60800 * 8bit
M8266WIFI_SPI_Send_Data(FrameHeader, 3, 0, &status);      // 3B同步帧
for(i = 0; i < Times; i++)                            // 800B * 76 = 60800B 
{
sent = M8266WIFI_SPI_Send_Data(wifi_date+(i*Bytes), Bytes, 0, &status); // 发送6080B数据 ,sent:SPI接口传递出去的个数
}
printf("status=%d\r\n", status);
//printf("sent=%d,status=%d\r\n", Bytes*i, status);
/*************************wifi发送***********************/
#endif

#ifdef LCD_ON



for(i=0;i<240;i++)                  // LCD显示缓存(OV5640_Data)    二维数组转一维数组
{
for(j=0;j<320;j++)
{
rgbbuf2[i][j] = jpeg[i*320+j] & 0x1f;       
}
}
// for(i=0;i<240;i++)                  // 240*320 OV5640_Data图像处理
// {
// for(j=0;j<320;j++)
// {
// if(((int)(rgbbuf2[i+1][j] - rgbbuf2[i][j]) > threshold_rgb)||((int)(rgbbuf2[i+1][j] - rgbbuf2[i][j]) < -threshold_rgb))
// rgbbuf2[i][j] = rgbbuf2[i][j]/2;
// else if(((int)(rgbbuf2[i+1][j+1] - rgbbuf2[i][j+1]) > threshold_rgb)||((int)(rgbbuf2[i+1][j+1] - rgbbuf2[i][j]) < -threshold_rgb))
// rgbbuf2[i][j] = rgbbuf2[i][j]/2;
// else if(((int)(rgbbuf2[i][j+1] - rgbbuf2[i][j]) > threshold_rgb)||((int)(rgbbuf2[i][j+1] - rgbbuf2[i][j]) < -threshold_rgb))
// rgbbuf2[i][j] = rgbbuf2[i][j]/2;
// else
// rgbbuf2[i][j] = rgbbuf2[i][j]/10;
// }
// }

for(i=0;i<240;i++)                  // 240*320 OV5640_Data图像处理
{
for(j=0;j<320;j++)
{
by=rgbbuf2[i+1][j] + rgbbuf2[i+1][j+1] + rgbbuf2[i][j+1];
by=(by - (rgbbuf2[i][j]*3))/3 + rgbbuf2[i][j]/5;
if(by < 0)
by = -by;
if(by > 30)
by = 30;


rgbbuf2[i][j] = by;

}
}

aveg = 0;
max_data = 0;
for(i=0;i<60;i++)            // 找出最大值和均值
{
for(j=0;j<80;j++)
{
if((max_data < xx[i][j+2]) && (xx[i][j+2] < 0x3FFF))
{
max_data = xx[i][j+2];
max_data_i = i;
max_data_j = j;
}
aveg = aveg + xx[i][j+2] ;
}
}
// Flir 软件 AGC + 抗锯齿
tempreter = (int)(max_data - 8192)*0.026 + 38; //最大处温度
aveg = aveg / 4800;                            //温度平均值
index = (float)80 / (float)(max_data - aveg);


for(i=0;i<60;i++)          // 60*80-->240*320
{
for(j=0;j<80;j++)
{
u=(int)(xx[i][j+2]-aveg)*index + 175;
if(j < 79)
u1=(int)(xx[i][j+3]-aveg)*index + 175;
else
u1=(int)(xx[i][j+2]-aveg)*index + 175;
if(i < 59)
u2=(int)(xx[i+1][j+2]-aveg)*index + 175;
else
u2=(int)(xx[i][j+2]-aveg)*index + 175;
if(i > 1)
u3=(int)(xx[i-1][j+2]-aveg)*index + 175;
else
u3=(int)(xx[i][j+2]-aveg)*index + 175;
if(j > 1)
u4=(int)(xx[i][j+1]-aveg)*index + 175;
else
u4=(int)(xx[i][j+2]-aveg)*index + 175;


rgbbuf[4*i][4*j]  =YUV2RGB422((u3+u4)/2);
rgbbuf[4*i][4*j+1]=YUV2RGB422((u+u3)/2);
rgbbuf[4*i][4*j+2]=YUV2RGB422((u+u3)/2);
rgbbuf[4*i][4*j+3]=YUV2RGB422((u1+u3)/2);


rgbbuf[4*i+1][4*j]  =YUV2RGB422((u+u4)/2);
rgbbuf[4*i+1][4*j+1]=YUV2RGB422(u);
rgbbuf[4*i+1][4*j+2]=YUV2RGB422(u);
rgbbuf[4*i+1][4*j+3]=YUV2RGB422((u+u1)/2);


rgbbuf[4*i+2][4*j]=YUV2RGB422((u+u4)/2);
rgbbuf[4*i+2][4*j+1]=YUV2RGB422(u);
rgbbuf[4*i+2][4*j+2]=YUV2RGB422(u);
rgbbuf[4*i+2][4*j+3]=YUV2RGB422((u+u1)/2);


rgbbuf[4*i+3][4*j]  =YUV2RGB422((u2+u4)/2);
rgbbuf[4*i+3][4*j+1]=YUV2RGB422((u+u2)/2);
rgbbuf[4*i+3][4*j+2]=YUV2RGB422((u+u2)/2);
rgbbuf[4*i+3][4*j+3]=YUV2RGB422((u2+u1)/2);
}
}

// LCD_Color_Fill(0,0,319,239,(u16 *)rgbbuf2);
LCD_two_Color_Fill(0,0,319,239,(u16 *)rgbbuf,(u16 *)rgbbuf2);



// LCD_Draw_Circle(max_data_j*4,max_data_i*4,5);
// LCD_ShowxNum(max_data_j*4,max_data_i*4,(u8)tempreter,4,16,1);
#endif
printf("frame%d\r\n", zhenshu++);
LCD_ShowxNum(0,0,zhenshu,8,16,0);

camera_new_pathname(pname); //得到文件名
res=bmp_encode(pname,0,0,320,240,0,(u16 *)rgbbuf2);
// LCD_Clear(WHITE);
LCD_ShowString(30,160,200,16,16,(u8*)"BMP OK!!"); 
LCD_ShowxNum(0,20,res,8,16,0);


}
}
else
{
HAL_Delay(1);
printf("Flir Data Error\r\n");
}
}
}


一直想达到flir官方的MSX的样子,可是差距还是有点。只能做出自己的风格。主要的代码当然还是参考了原子哥哥在F7上面的例程。原子哥哥也是一个伴随我整个大学的一个,从他的战舰、探索者、阿波罗所有的开发板我都学习过。真的很不错。


哈哈!!杂乱的语言,真是我的作风,反正第一篇。希望以后会有改进。


都说博客是分享精神,希望我也能够分享出去我在技术上的各种经验!!!

你可能感兴趣的:(Maolin 的第一篇博客)