OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4866|回复: 8

STM32F103 + OV7725 + OneNet 出现分屏和颜色不对问题

[复制链接]

2

主题

13

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2019-5-19
在线时间
11 小时
发表于 2019-6-6 11:28:34 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 ql125671817 于 2019-6-6 16:56 编辑

@正点原子
最近在做OneNet LOT 物联网的东西,使用到了STM32F103C8T6 + OV7725摄像头,准备把拍摄下来的照片发送至网上进行显示。
因为ov7725输出的图片格式只有RGB,YUV等,没有直接输出JPEG格式,所以我使用了RGB->BMP转换函数,将RGB图像转换成BMP图像进行上传。
OneNet也识别出了我的图像。
但是!!! 但是!!!!
出现了两个问题,一个是有分屏现象,一个是颜色不对!
          getImageByIndex.jpg       getImageByIndex (1).jpg
上边两张图片是我把摄像头拿盖子盖住之后拍摄的照片,很明显颜色不对。
          getImageByIndex (3).jpg     getImageByIndex (2).jpg
上边两张图片是我用摄像头拍摄白纸,明显出现的分屏现象。


大家这可如何是好啊!!!     


(感谢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]


现在把分屏解决辽! :
            
但是颜色还是不能解决啊!!
怎么办怎么办呀!!!


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2019-5-19
在线时间
11 小时
 楼主| 发表于 2019-6-6 14:00:31 | 显示全部楼层
希望大佬来帮帮忙呀!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-6-8 01:46:01 | 显示全部楼层
帮顶
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2019-5-19
在线时间
11 小时
 楼主| 发表于 2019-6-9 22:06:56 | 显示全部楼层

谢谢!!!
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-11-29
在线时间
9 小时
发表于 2020-1-2 14:19:12 | 显示全部楼层
楼主如何解决定义的图片数组过大的问题的
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-11-29
在线时间
9 小时
发表于 2020-1-2 14:21:17 | 显示全部楼层
发送的数据你覆盖掉了文件头54字节的数据
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2020-2-3
在线时间
11 小时
发表于 2020-4-4 12:36:57 来自手机 | 显示全部楼层
请问分屏怎么解决
回复

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2020-1-23
在线时间
14 小时
发表于 2020-4-19 10:17:18 | 显示全部楼层
帮顶~~
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2020-3-23
在线时间
3 小时
发表于 2020-4-23 22:21:28 | 显示全部楼层
楼主你好,请问你的OV7725图片颜色不对的问题解决了吗,我的传过去都是一片蓝色,也不知道哪里出了问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 03:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表