新手上路
- 积分
- 31
- 金钱
- 31
- 注册时间
- 2019-5-19
- 在线时间
- 11 小时
|
1金钱
本帖最后由 ql125671817 于 2019-6-6 16:56 编辑
@正点原子
最近在做OneNet LOT 物联网的东西,使用到了STM32F103C8T6 + OV7725摄像头,准备把拍摄下来的照片发送至网上进行显示。
因为ov7725输出的图片格式只有RGB,YUV等,没有直接输出JPEG格式,所以我使用了RGB->BMP转换函数,将RGB图像转换成BMP图像进行上传。
OneNet也识别出了我的图像。
但是!!! 但是!!!!
出现了两个问题,一个是有分屏现象,一个是颜色不对!
上边两张图片是我把摄像头拿盖子盖住之后拍摄的照片,很明显颜色不对。
上边两张图片是我用摄像头拍摄白纸,明显出现的分屏现象。
大家这可如何是好啊!!!
(感谢CSDN 锦浩 的代码!!!)
链接:https://blog.csdn.net/q361750389/article/details/79522801
RGB565 转 BMP代码如下:
[mw_shl_code=c,true]static void RGBtoBMP(char *bmp_buffer, int nWidth, int nHeight, char bits)
{
BmpHead m_BMPHeader; //定义BMP头结构体
InfoHead m_BMPInfoHeader;
char bfType[2] = { 'B','M' };
m_BMPHeader.imageSize = bits * nWidth*nHeight + 54;
m_BMPHeader.blank = 0;
m_BMPHeader.startPosition = 54;
memcpy(bmp_buffer, bfType, sizeof(bfType));
bmp_buffer += sizeof(bfType);
memcpy(bmp_buffer, &m_BMPHeader.imageSize, sizeof(m_BMPHeader.imageSize));
bmp_buffer += sizeof(m_BMPHeader.imageSize);
memcpy(bmp_buffer, &m_BMPHeader.blank, sizeof(m_BMPHeader.blank));
bmp_buffer += sizeof(m_BMPHeader.blank);
memcpy(bmp_buffer, &m_BMPHeader.startPosition, sizeof(m_BMPHeader.startPosition));
bmp_buffer += sizeof(m_BMPHeader.startPosition);
m_BMPInfoHeader.Length = 40; //固定长度40
m_BMPInfoHeader.width = nWidth; //图像宽度像素
m_BMPInfoHeader.height = nHeight; //图像高度像素
m_BMPInfoHeader.colorPlane = 1; //必须是1
m_BMPInfoHeader.bitColor = BMP_BITS; //
m_BMPInfoHeader.zipFormat = 0;
m_BMPInfoHeader.realSize = bits * nWidth * nHeight;
m_BMPInfoHeader.xPels = 320 ; // 2835; //分辨率 QVGA 320
m_BMPInfoHeader.yPels = 240 ; //2835; //分辨率 QVGA 240
m_BMPInfoHeader.colorUse = 0;
m_BMPInfoHeader.colorImportant = 0;
memcpy(bmp_buffer, &m_BMPInfoHeader.Length, sizeof(m_BMPInfoHeader.Length));
bmp_buffer += sizeof(m_BMPInfoHeader.Length);
memcpy(bmp_buffer, &m_BMPInfoHeader.width, sizeof(m_BMPInfoHeader.width));
bmp_buffer += sizeof(m_BMPInfoHeader.width);
memcpy(bmp_buffer, &m_BMPInfoHeader.height, sizeof(m_BMPInfoHeader.height));
bmp_buffer += sizeof(m_BMPInfoHeader.height);
memcpy(bmp_buffer, &m_BMPInfoHeader.colorPlane, sizeof(m_BMPInfoHeader.colorPlane));
bmp_buffer += sizeof(m_BMPInfoHeader.colorPlane);
memcpy(bmp_buffer, &m_BMPInfoHeader.bitColor, sizeof(m_BMPInfoHeader.bitColor));
bmp_buffer += sizeof(m_BMPInfoHeader.bitColor);
memcpy(bmp_buffer, &m_BMPInfoHeader.zipFormat, sizeof(m_BMPInfoHeader.zipFormat));
bmp_buffer += sizeof(m_BMPInfoHeader.zipFormat);
memcpy(bmp_buffer, &m_BMPInfoHeader.realSize, sizeof(m_BMPInfoHeader.realSize));
bmp_buffer += sizeof(m_BMPInfoHeader.realSize);
memcpy(bmp_buffer, &m_BMPInfoHeader.xPels, sizeof(m_BMPInfoHeader.xPels));
bmp_buffer += sizeof(m_BMPInfoHeader.xPels);
memcpy(bmp_buffer, &m_BMPInfoHeader.yPels, sizeof(m_BMPInfoHeader.yPels));
bmp_buffer += sizeof(m_BMPInfoHeader.yPels);
memcpy(bmp_buffer, &m_BMPInfoHeader.colorUse, sizeof(m_BMPInfoHeader.colorUse));
bmp_buffer += sizeof(m_BMPInfoHeader.colorUse);
memcpy(bmp_buffer, &m_BMPInfoHeader.colorImportant, sizeof(m_BMPInfoHeader.colorImportant));
bmp_buffer += sizeof(m_BMPInfoHeader.colorImportant);
}
void rgb565tobmp(char *rgb_buffer, unsigned short nWidth, unsigned short nHeight)
{
char bits = BMP_BITS / 8;
int i = 0;
int j = 0;
unsigned char R,G,B;
unsigned short RGB555,RGB565;
char *rgb_buff;
rgb_buff = rgb_buffer;
rgb_buffer += 54;
/* RGB565转RGB555 */
for (i = 0; i < nHeight; i++)
{
for (j = 0; j < nWidth; j++)
{
/* 读取RGB565 */
RGB565 = (*(rgb_buffer+1)<<8 | *rgb_buffer);
/* 分别提取R、G、B数据 */
B = RGB565 & 0x001f;
G = (RGB565 >> 6) & 0x001f;
R = (RGB565 >> 11) & 0x001f;
/* 转换成RGB555数据 */
RGB555 = (R << 10) | (G << 5) | (B);
/* 写入数组 */
*rgb_buffer = RGB555;
*(rgb_buffer+1) = RGB555 >> 8;
rgb_buffer += 2;
}
}
/* 将BMP文件头和信息头写入数组 */
RGBtoBMP(rgb_buff, nWidth, nHeight, bits);
}
[/mw_shl_code]
这个是我获取ov7725 RGB565之后转BMP,再用ESP8266发送的代码:
[mw_shl_code=c,true]void OV7725_camera_refresh(void)
{
u32 i,j;
u16 temp;
if(ov_sta==2)
{
OV7725_CS=0;
OV7725_RRST=0; //开始复位读指针
OV7725_RCK=0;
OV7725_RCK=1;
OV7725_RCK=0;
OV7725_RRST=1; //复位读指针结束
OV7725_RCK=1;
for(i=0;i<OV7725_WINDOW_HEIGHT;i++)
{
for(j=0;j<OV7725_WINDOW_WIDTH;j++)
{
GPIOB->CRL=0X88888888;
OV7725_RCK=0;
temp = OV7725_DATA;
OV7725_RCK=1;
temp <<= 8;
OV7725_RCK=0;
temp |= OV7725_DATA; //读数据
OV7725_RCK=1;
color[i * OV7725_WINDOW_WIDTH + j ] = temp ;
GPIOB->CRL=0X33333333;
}
}
OV7725_CS=1;
OV7725_RCK=0;
OV7725_RCK=1;
EXTI->PR=1<<15;
ov_sta=0; //清零帧中断标记
rgb565tobmp((char *)color, OV7725_WINDOW_WIDTH, OV7725_WINDOW_HEIGHT); //ov7725 RGB565 -> BMP 格式
OneNet_SendData_Picture(NULL, (char *)color, sizeof(color)); //将转换过来的BMP图片通过ESP8826发送给OneNet网络端
} [/mw_shl_code]
现在把分屏解决辽! :

但是颜色还是不能解决啊!!
怎么办怎么办呀!!!
|
|