从STM32开发板上获取图片数据并保存为BMP文件

您所在的位置:网站首页 怎么生成bmp图片链接文件 从STM32开发板上获取图片数据并保存为BMP文件

从STM32开发板上获取图片数据并保存为BMP文件

2024-07-14 08:15| 来源: 网络整理| 查看: 265

    上周解决了WIFI 传输过程中连接中断,电脑端接收不到数据的问题。又花了一周的时间才正确的把从开发板上获取的图像数据转换、编码保存为BMP 图像。

    本来是打算在开发板上,以字符串的形式每次发送512个字节,电脑端再解析出来。但是图片解析一直有问题。最后直接用串口在调试助手上把一帧图像的数据以16进制的形式打印出来,发现数据根本对不上。最后改成以打印十六进制的形式将数据发送到电脑,开发板发送部分的代码如下:

void wifi_send_data(unsigned short *data,int len) { unsigned short *p = data; u8 count=0; //用于计数单次发送的个数 p = (unsigned short*)malloc(sizeof(unsigned short)*128); if(atk_8266_consta_check() == '+') { printf("连接正常\r\n"); } else { printf("连接中断\r\n"); return; } atk_8266_at_response(1); delay_ms(10); free(p); p=data; //首先发送起始信息 atk_8266_quit_trans(); atk_8266_send_cmd("AT+CIPSEND","OK",20); u3_printf("start of msg"); atk_8266_at_response(1); delay_ms(20); while(len > 0) { // if(len >= 32) // { // len -= 32; // u3_printf("%32.32s",p); // p+=16; //short 类型的指针对应两个char 类型指针移动的长度 // } // else // { // u3_printf("%s",p); // len=0; // } //修改为发送十六进制数的字符串,每次发送64个short 类型的数 count=0; if(len >= 64) { len -= 64; while(count < 64) { u3_printf("%x",*p); ++p; ++count; } } else { while(count < len) { u3_printf("%x",*p); ++count; } len =0; } get_feedback(); delay_ms(20); } //发送标识一帧图像结束的消息 u3_printf("end of msg"); atk_8266_at_response(1); delay_ms(1000); printf("发送结束==========================================\r\n"); // char *p = data; // char *send_content = (char*)malloc(sizeof(char)*2); // while(len > 0) // { // atk_8266_quit_trans(); // atk_8266_send_cmd("AT+CIPSEND","OK",20); // sprintf(send_content,"%02x%02x",*p,*(p+1)); // u3_printf(send_content); //发送数据 // p +=2; // len -= 2; // atk_8266_at_response(1); // } // free(send_content); }

    下面就是对接受到的图像数据进行解析了。我用的摄像头是OV7670 ,采用的是RGB565 ,即每个像素点最高为为RED ,5个bit ,中间为GREEN,6个bit ,最低为BLUE ,5个bit 。转换为在电脑上能显示的RGB 只需要分别将RGB独立为一个字节,低位为0。比如RGB565 为0XFF, 先用逻辑运算获取到每个分量,R:0X1F,G:0X



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3