OpenEdv-开源电子网

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

f429的ov5640 RGB565格式二值化程序分享,应该是首发!

[复制链接]

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-8-11
在线时间
13 小时
发表于 2017-8-19 03:05:21 | 显示全部楼层 |阅读模式
用了我三天的时间,终于把ov5640的二值化实现了。这几天在论坛吸取了很多知识,算法。现在该回报给论坛了。

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

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-8-11
在线时间
13 小时
 楼主| 发表于 2017-8-19 03:06:39 | 显示全部楼层
回复 支持 反对

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-8-11
在线时间
13 小时
 楼主| 发表于 2017-8-19 03:06:56 | 显示全部楼层
本帖最后由 几楼卖鞋 于 2017-8-19 10:47 编辑

图片在这图片在这
1.jpg

这个是二值化后的图片和原图

这个是二值化后的图片和原图
回复 支持 反对

使用道具 举报

15

主题

335

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1177
金钱
1177
注册时间
2016-3-16
在线时间
259 小时
发表于 2017-8-19 08:18:15 | 显示全部楼层
没看到附件啊?
回复 支持 反对

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-8-11
在线时间
13 小时
 楼主| 发表于 2017-8-19 09:55:03 | 显示全部楼层

上传不了文件啊
回复 支持 反对

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-8-11
在线时间
13 小时
 楼主| 发表于 2017-8-19 09:55:24 | 显示全部楼层
程序程序程序

二值化5-成功.zip

1.04 MB, 下载次数: 744

回复 支持 反对

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-8-11
在线时间
13 小时
 楼主| 发表于 2017-8-19 10:00:04 | 显示全部楼层
[mw_shl_code=cpp,true]/*************
函数:灰度化且二值化函数
返回值类型:u16
返回值:二值化后的值
形参:采集的像素点数据
*************/
u16 Binary(u16 pixel)
{
        static u16 Gray;
        /*******提取R,G,B值*******/
        R = (pixel&RGB_R)>>11;
        G = (pixel&RGB_G)>>5;
        B = (pixel&RGB_B);
        /*******灰度值计算*******/
        /*******网络上大部分的公式是针对8位的*******/
        /*******这条公式是针对12位的******/
        Gray = (u16)((R*634+G*613+B*232));
        /*******二值化*******/
        if(Gray<threshold)
                Gray = BLACK;
        else if(Gray>=threshold)
                Gray = WHITE;
        return Gray;
}[/mw_shl_code]
回复 支持 反对

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-8-11
在线时间
13 小时
 楼主| 发表于 2017-8-19 10:00:39 | 显示全部楼层
[mw_shl_code=cpp,true]//处理数据
//当采集完一帧数据后,调用此函数.开始下一帧采集.
//该函数会被HAL_DCMI_FrameEventCallback调用
void jpeg_data_process(void)
{
        u16 i,j,l;
        l = 0;
        /*******显示二值化后的数据*******/
                for(j=0;j<Y;j++)
        {
                        for(i=0;i<X;i++)
                {
                        LCD_SetCursor(i,j);  
                        LCD_WriteRAM_Prepare();                //开始写入GRAM
                        FPS[l] = fps[l];
                       
                        LCD->LCD_RAM=Binary(FPS[l]);
//                        LCD->LCD_RAM=FPS[l];
                        l++;
                }
        }
                l = 0;
        /*******显示原来的数据*******/
                        for(j=0;j<Y;j++)
        {
                        for(i=0;i<X;i++)
                {
                        LCD_SetCursor(i+X+10,j);  
                        LCD_WriteRAM_Prepare();                //开始写入GRAM
                        FPS[l] = fps[l];
                       
        //                LCD->LCD_RAM=Binary(FPS[l]);
                        LCD->LCD_RAM=FPS[l];
                        l++;
                }
        }
}[/mw_shl_code]
回复 支持 反对

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-8-11
在线时间
13 小时
 楼主| 发表于 2017-8-19 10:02:12 | 显示全部楼层
[mw_shl_code=cpp,true]//RGB565测试
//RGB数据直接显示在LCD上面
void rgb565_test(void)
{
        u8 key;
        u8 k;
        u16 outputheight=0;       
        LCD_Clear(WHITE);
    POINT_COLOR=RED;
        //自动对焦初始化
        OV5640_RGB565_Mode();        //RGB565模式
        OV5640_Focus_Init();
       
        OV5640_Light_Mode(0);        //自动模式
        OV5640_Color_Saturation(3);//色彩饱和度0
        OV5640_Brightness(4);        //亮度0
        OV5640_Contrast(3);                //对比度0
        OV5640_Sharpness(33);        //自动锐度
        //OV5640_Focus_Constant();//启动持续对焦
/*************这里初始化PCLK、VSYNC、HSYNC和数据口******************/
        DCMI_Init();                        //DCMI配置

  DCMI_DMA_Init((u32)fps,0,buf_size,DMA_MDATAALIGN_HALFWORD,DMA_MINC_ENABLE);
        TIM3->CR1&=~(0x01);                //关闭定时器3,关闭帧率统计,打开的话,RGB屏,在串口打印的时候,会抖

  outputheight=lcddev.height;
        OV5640_OutSize_Set(0,0,X*2,Y*2);                //满屏缩放显示
        LCD_Clear(BLACK);
        delay_ms(100);
        LCD_SetCursor(0,0);
        DCMI_Start();                         //启动传输
        while(1)
        {
                key=KEY_Scan(0);
                if(key==KEY0_PRES)
                        OV5640_Focus_Single();
                else if(key==KEY1_PRES)
                {
                        k++;
                        if(k%2==1)
                                OV5640_Flash_Ctrl(1);//打开闪光灯
                        else
                           OV5640_Flash_Ctrl(0);//关闭闪光灯
                }
        }   
} [/mw_shl_code]
回复 支持 反对

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-8-11
在线时间
13 小时
 楼主| 发表于 2017-8-19 10:02:41 | 显示全部楼层
[mw_shl_code=cpp,true]int main(void)
{
        HAL_Init();                     //初始化HAL库   
        Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
        delay_init(180);                //初始化延时函数
        uart_init(115200);              //初始化USART
        usart2_init(921600);            //初始化USART2
        usmart_dev.init(90);                     //初始化USMART       
        LED_Init();                     //初始化LED
        KEY_Init();                     //初始化按键
        SDRAM_Init();                   //初始化SDRAM
        LCD_Init();                     //初始化LCD
        TIM3_Init(10000-1,9000-1);      //10Khz计数,1秒钟中断一次
        POINT_COLOR=BLUE;//设置字体为红色
        LCD_ShowString(30,50,200,16,16,"Apollo STM32F4/F7");       
        LCD_ShowString(30,70,200,16,16,"OV5640 TEST");       
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2016/1/16");
/*************这里初始化一些重要的引脚,SCL,SDA,RESET******************/       
        while(OV5640_Init())//初始化OV5640
        {
                LCD_ShowString(30,130,240,16,16,"OV5640 ERR");
                delay_ms(200);
            LCD_Fill(30,130,239,170,WHITE);
                delay_ms(200);
        LED0=!LED0;
        }       
    LCD_ShowString(30,130,200,16,16,"OV5640 OK");  
                rgb565_test();
}
[/mw_shl_code]
回复 支持 反对

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-8-11
在线时间
13 小时
 楼主| 发表于 2017-8-19 10:03:00 | 显示全部楼层
[mw_shl_code=cpp,true]//分辨率 x,y
#define X 160
#define Y 120
#define buf_size X*Y
//提取R、G、B的参数
#define RGB_R 0XF800
#define RGB_G 0X07E0
#define RGB_B 0X001F
//fps、FPS数组存入采集回来的信息
u32 fps[buf_size];
u16 FPS[buf_size];
//变量R,G,B
u16 R,G,B;
u16 threshold=32767;//阈值[/mw_shl_code]
回复 支持 反对

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-8-11
在线时间
13 小时
 楼主| 发表于 2017-8-19 10:06:53 | 显示全部楼层
不过还是有点问题,8楼代码的意思是。在显示屏的左侧显示二值化后的图像,显示屏的右侧显示原始图像。结果的确有两个图像,但是这两个图像是不一样的。原始图像显示的图像会比二值化前的图像高,这让我百思不得其解。还请各位指教!
回复 支持 反对

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-8-11
在线时间
13 小时
 楼主| 发表于 2017-8-19 10:07:15 | 显示全部楼层
几楼卖鞋 发表于 2017-8-19 10:00
[mw_shl_code=cpp,true]//处理数据
//当采集完一帧数据后,调用此函数.开始下一帧采集.
//该函数会被HAL_D ...


不过还是有点问题,8楼代码的意思是。在显示屏的左侧显示二值化后的图像,显示屏的右侧显示原始图像。结果的确有两个图像,但是这两个图像是不一样的。原始图像显示的图像会比二值化前的图像高,这让我百思不得其解。还请各位指教!
回复 支持 反对

使用道具 举报

0

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2020-7-22
在线时间
73 小时
发表于 2021-6-11 11:23:43 | 显示全部楼层
支持支持支持
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-5-2
在线时间
2 小时
发表于 2021-6-11 13:50:20 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2021-6-28
在线时间
3 小时
发表于 2021-7-4 20:53:49 | 显示全部楼层
请问楼主还在吗,新人想用你的程序跑一下,结果我的LCD屏幕就亮了一下就不亮了,然后我用的是7寸的,请问这个是因为屏幕不一样吗

回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-3-29 17:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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