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

本文介绍了如何从STM32开发板获取OV7670摄像头的RGB565图像数据,并通过串口传输到电脑,然后将数据解析并编码为BMP文件。在处理过程中,涉及到了大小端转换、16进制字符串转ASCII码以及BMP文件头和信息头的构造。最终通过JNI在JAVA端调用C++代码处理图片,实现了图像的正确显示。
摘要由CSDN通过智能技术生成

    上周解决了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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值