本帖最后由 正点原子 于 2020-10-26 16:21 编辑

QQ群头像.png (1.78 KB)

2020-10-24 10:50 上传5)关注正点原子公众号,获取最新资料

100846rel79a9p4uelap24.jpg (110.95 KB)

2020-8-14 15:44 上传

100846f1ce1fg14zbg0va4.png (27.06 KB)

2020-8-14 15:44 上传

第二十六章基于OV5640的二值化实验

在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,还能凸显出目标的轮廓。图像二值化在计算机视觉、图像分割以及人工智能等方面有着广泛应用。在本章节我们将进行基于OV5640的二值化实验。

本章包括以下几个部分:

26.1简介

26.2实验任务

26.3硬件设计

26.4程序设计

26.5下载验证

26.1简介

图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为最大(白色)或最小(黑色),也就是将整个图像呈现出明显的黑白效果的过程。这里我们以8bit表示的灰度图像为例(灰度值的范围为0~255),二值化就是通过选取适当的阈值,与图像中的256个亮度等级进行比较。亮度高于阈值的像素点设置为白色(255),低于阈值的像素点设置为黑色(0),从而明显地反映出图像的整体和局部特征。

在数字图像处理中,二值图像占有非常重要的地位,特别是在实时的图像处理中,通过二值图像处理实现而构成的系统是很多的。要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样有利于在对图像做进一步处理时,图像的集合性质只与像素值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。为了得到理想的二值图像,一般采用封闭、连通的边界定义不交叠的区域。所有灰度大于或等于阈值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。

实现二值化有两种方法,一种是手动指定一个阈值,通过阈值来进行二值化处理;另一种是一个自适应阈值二值化方法(OTSU算法和Kittle算法等)。使用第一种方法计算量小速度快,但在处理不同图像时颜色分布差别很大;使用第二种方法适用性强,能直接观测处图像的轮廓,但相对计算更复杂。本章节实验我们将使用第一种方法来实现图像的二值化。

如果某特定物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景下,使用制定阈值的方法,可以得到比较有效的分割效果。如果物体同背景的差别表现不在灰度值上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阈值选取技术来分割该图像。

26.2实验任务

用OV5640摄像头采集RGB565数据,将数据转化成Ycbcr格式,然后进行灰度二值化,并通过LCD屏显示。

26.3硬件设计

本次实验我们是基于“OV5640摄像头LCD显示实验”进行图像处理的,实验的系统框图与“OV5640摄像头LCD显示实验”基本相同,我们只是添加了“VIP(video image process)”模块,实验系统框图如下:

阿莫论坛发帖领航者专用11141.png (788.78 KB)

2020-8-14 15:47 上传

图 26.3.1 系统框图

图中“RGB转Ycbcr”模块与“OV5640摄像头LCD显示实验”相同,其作用就是为了将RGB565数据转化成Ycbcr的数据,便于提取灰度。“二值化”模块用于实现灰度图像的二值化。

下图是VIP(video image process)在“Block Design”中的链接图:

阿莫论坛发帖领航者专用11342.png (272.25 KB)

2020-8-14 15:47 上传

图 26.3.2 基于OV5640的二值化实验原理图

VIP(video image process)模块调用了“rgb2ycbcr”和“binarization”两个模块,下图是VIP内部,“rgb2ycbcr”和“binarization”模块的连接图:

阿莫论坛发帖领航者专用11517.png (366.45 KB)

2020-8-14 15:47 上传

图 26.3.3 VIP模块内部连接图

VIP模块顶层代码如下:

1  module Video_Image_Processor(

2      input         clk,    //cmos 像素时钟

3      input         rst_n,

4

5      //预处理图像

6      input         pre_image_vsync, //预处理图像场同步信号

7      input         pre_image_clken, //预处理图像时钟使能信号

8      input         pre_data_valid,  //预处理图像数据有效信号

9      input [23:0]  pre_image_data,  //预处理图像数据

10

11     //处理后图像

12     output        pos_image_vsync, //处理后图像场同步信号?

13     output        pos_image_clken, //处理后图像时钟使能信号

14     output        pos_data_valid, //处理后图像数据有效信号

15     output [23:0] pos_image_data  //处理后图像数据

16

17 );

18

19 //wire define

20 wire [7:0] gray_data ;

21 wire       ycbcb_vsync;

22 wire       ycbcbr_clken;

23 wire       ycbcr_valid;

24

25 //*****************************************************

26 //**                    main code

27 //*****************************************************

28 //rgb转ycbcr模块

29 rgb2ycbcr  u_rgb2ycbcr(

30  .clk          (clk),

31  .rst_n        (rst_n),

32

33  .rgb_vsync    (pre_image_vsync),

34  .rgb_clken    (pre_image_clken),

35  .rgb_valid    (pre_data_valid),

36  .rgb_data     (pre_image_data),

37

38

39  .ycbcb_vsync  (ycbcb_vsync),

40  .ycbcbr_clken (ycbcbr_clken),

41  .ycbcr_valid  (ycbcr_valid),

42  .gray_data    (gray_data)

43 );

44

45 //二值化模块

46 binarization u_binarization(

47  .clk               (clk),

48  .rst_n             (rst_n),

49

50

51  .gray_vsync        (ycbcb_vsync),

52  .gray_clken        (ycbcbr_clken),

53  .gray_data_valid   (ycbcr_valid),

54  .luminance         (gray_data),

55

56

57  .binary_vsync      (pos_image_vsync),

58  .binary_clken      (pos_image_clken),

59  .binary_data_valid (pos_data_valid),

60  .binary_data       (pos_image_data)

61 );

62

63 endmodule复制代码

有关“rgb2ycbcr”模块,大家可以参考OV5640摄像头灰度图显示实验,在此我们就不再介绍。

“binarization”模块的代码如下:

1  module binarization(

2      //module clock

3      input               clk              ,// 时钟信号

4      input               rst_n            ,// 复位信号(低有效)

5

6      //图像处理前的数据接口

7      input               gray_vsync       ,// vsync信号

8      input               gray_clken       ,// 时钟使能信号信号

9      input               gray_data_valid  ,// 数据有效信号

10     input   [7:0]       luminance        ,

11

12     //图像处理后的数据接口

13     output              binary_vsync     ,// vsync信号

14     output              binary_clken     ,// 时钟使能信号

15     output              binary_data_valid,// 数据有效信号

16     output  [23:0]      binary_data       //

17 );

18

19 parameter THRESHOLD = 8'd80;        //二值化的阈值

20

21 //reg define

22 reg    gray_vsync_d;

23 reg    gray_clken_d;

24 reg    gray_data_valid_d;

25 reg    monoc;                      //monochrome(1=白,0=黑)

26

27 //*****************************************************

28 //**                    main code

29 //*****************************************************

30

31 assign  binary_vsync = gray_vsync_d;

32 assign  binary_clken = gray_clken_d;

33 assign  binary_data_valid = gray_data_valid_d;

34 assign  binary_data = {24{monoc}};

35

36 //二值化

37 always @(posedge clk or negedge rst_n) begin

38     if(!rst_n)

39         monoc <= 1'b0;

40     else if(luminance > THRESHOLD)  //比较图像灰度值与阈值的大小

41         monoc <= 1'b1;

42     else

43         monoc <= 1'b0;

44 end

45

46 //延时1拍以同步时钟信号

47 always@(posedge clk or negedge rst_n) begin

48     if(!rst_n) begin

49         gray_vsync_d <= 1'd0;

50         gray_clken_d <= 1'd0;

51         gray_data_valid_d <= 1'd0;

52     end

53     else begin

54         gray_vsync_d <= gray_vsync;

55         gray_clken_d <= gray_clken;

56         gray_data_valid_d <= gray_data_valid;

57     end

58 end

59

60 endmodule复制代码

在代码的第19行,我们定义了一个parameter类型的参数THRESHOLD,它是二值化过程中所设定的阈值。我们将灰度值与该阈值比较,用变量monoc寄存比较的结果。若灰度值大于该阈值则monoc为1,若小于阈值,则monoc为0,如代码第36到44行所示。理论上阈值可以是0到255中的任意值,但阈值过大,会提取多余的部分;而阈值过小,又会丢失所需的部分,因此阈值选取是影响实验的一个重要因素。

代码第46到58行,我们通过寄存操作对gray_vsync、gray_clken等信号作了一个时钟周期的延迟。这是因为在进行二值判定时消耗了一个时钟,因此相应的同步信号也要延迟一个时钟周期,以实现与数据的同步。

需要注意的是,代码中变量monoc的0和1表示的灰度与阈值比较的结果,而并不是像素的灰度值,我们需要根据monoc的值来给指定像素点的颜色。如代码第34行所示,binary_data 为24’h0表示黑色,为24’hff_ffff表示白色。

34 assign  binary_data = {24{monoc}};

连线后的 Block Design 如下图所示:

阿莫论坛发帖领航者专用15798.png (562.35 KB)

2020-8-14 15:47 上传

图 26.3.4 Block Design整体示意图

接下来验证当前设计。验证完成后弹出对话框提示没有错误或者关键警告,点击“OK”。如果验证结果

报出错误或者警告,则需要重新检查设计。

为工程添加的约束文件与“OV5640 摄像头 LCD 显示”完全相同,有关这一部分内容请读者参考“OV5640 摄像头 LCD 显示”实验。

最后在左侧 Flow Navigator 导航栏中找到 PROGRAM AND DEBUG,点击该选项中的“ Generate

Bitstream”,对设计进行综合、实现、并生成 Bitstream 文件。在生成 Bitstream 之后,在菜单栏中选择 File > Export > Export hardware 导出硬件, 并在弹出的对话框

中,勾选“Include bitstream”。然后在菜单栏选择 File > Launch SDK, 启动 SDK 软件。

26.4软件设计

本实验软件设计部分与“OV5640摄像头LCD显示”实验相同,在此处就不做赘述,有需要的朋友可以参考“OV5640摄像头LCD显示”实验软件设计部分。

26.5下载验证

编译完工程之后我们就可以开始下载程序了。将 OV5640 摄像头模块插在启明星 Zynq 开发板的“OLED/CAMERA”插座上,并将 LCD 的排线接头插入开发板上的 LCD 接线座。将下载器一端连电脑,

另一端与开发板上的 JTAG 端口连接,连接电源线并打开电源开关。

在 SDK 软件下方的 SDK Terminal 窗口中点击右上角的加号设置并连接串口。然后下载本次实验硬件

设计过程中所生成的 BIT 文件,来对 PL 进行配置。最后下载软件程序,下载完成后, 在下方的 SDK Terminal中可以看到应用程序打印的信息,如下图所示:

阿莫论坛发帖领航者专用16609.png (541.99 KB)

2020-8-14 15:47 上传

图 26.5.1 串口打印信息窗口

同时, RGB LCD 液晶屏上显示出 OV5640 摄像头采集的图像的灰度图,说明本次 OV5640 摄像头 RGB LCD 屏显示的实验在启明星 ZYQN 开发板上验证成功,如下图所示:

阿莫论坛发帖领航者专用16768.png (760.31 KB)

2020-8-14 15:47 上传

图 26.5.2 LCD屏显示结果

linux 正点原子ov5640_【正点原子FPGA连载】第二十六章基于OV5640的二值化实验-摘自【正点原子】领航者 ZYNQ 之嵌入式开发指南 (amobbs.com 阿莫电子论坛)...相关推荐

  1. linux 正点原子ov5640_【正点原子FPGA连载】第二十四章OV5640摄像头HDMI显示-摘自【正点原子】领航者 ZYNQ 之嵌入式开发指南 (amobbs.com 阿莫电子论坛)...

    [code]#----------------------摄像头接口的时钟--------------------------- #72M create_clock -period 13.888 -n ...

  2. linux 正点原子ov5640_【正点原子FPGA连载】第二十三章OV5640摄像头LCD显示-摘自【正点原子】领航者 ZYNQ 之嵌入式开发指南 (amobbs.com 阿莫电子论坛)...

    #----------------------摄像头接口的时钟--------------------------- #72M create_clock -period 13.888 -name ca ...

  3. zynqsd的读写数据_【正点原子FPGA连载】 第十二章SD卡读写TXT文本实验-摘自【正点原子】领航者 ZYNQ 之嵌入式开发指南 (amobbs.com 阿莫电子论坛)...

    本帖最后由 正点原子 于 2020-10-24 10:25 编辑 QQ群头像.png (1.78 KB) 2020-10-24 10:25 上传5)关注正点原子公众号,获取最新资料 100846rel ...

  4. linux 正点原子ov5640_【正点原子FPGA连载】第四十七章 基于OV5640的以太网传输视-摘自【正点原子】开拓者 FPGA 开发指南 (amobbs.com 阿莫电子论坛)...

    本帖最后由 正点原子 于 2020-10-23 17:12 编辑 203429z6c3os33t8albi33.png (66.36 KB) 2019-7-26 22:21 上传 第四十七章 基于OV ...

  5. 频谱仪的更改ip_【正点原子FPGA连载】第五十一章 基于FFT IP核的音频频谱仪-摘自【正点原子】开拓者 FPGA 开发指南 (amobbs.com 阿莫电子论坛)...

    本帖最后由 正点原子 于 2020-10-24 15:19 编辑 203429z6c3os33t8albi33.png (66.36 KB) 2019-7-28 15:14 上传 第五十一章 基于FF ...

  6. 正点原子linux串口驱动下载,【正点原子Linux连载】第二十一章UART串口通信实验-摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南 (amobbs.com 阿莫电子论坛)...

    示例代码21.3.1 bsp_uart.h文件代码 1  #ifndef _BSP_UART_H 2  #define _BSP_UART_H 3  #include "imx6ul.h&q ...

  7. input自适应_【正点原子FPGA连载】第十一章基于OV5640的自适应二值化实验-领航者ZYNQ之HLS 开发指南...

    1)摘自[正点原子]领航者ZYNQ之HLS 开发指南 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手 ...

  8. 【正点原子FPGA连载】第三十六章 基于OV5640的PL以太网视频传输实验-摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  9. 【正点原子MP157连载】第二十四章 设备树下的LED驱动实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

最新文章

  1. CentOS 6.5 下配置Java环境
  2. VS添加服务引用和 Web引用的区别
  3. Windows中的权限设置、文件压缩、文件加密、磁盘配额和卷影副本
  4. 引用Nuget包Microsoft.EntityFrameworkCore.Tools.DotNet报错
  5. 命令行下的mysql的基本操作
  6. redis——客户端
  7. 2019 年度十大 AI 安防热点事件丨年终盘点
  8. matplotlib 显示批量图片_matplotlib入门
  9. Tarjan-有向图
  10. 算法:String to Integer (atoi)(字符串转换整数)
  11. 软工文档-项目开发计划
  12. 计算机学院实习报告3000字(Java开发实习)--持续更新中,多个专业,以及版本
  13. 管家婆辉煌-- 连接服务器失败处理办法
  14. 外卖返利小程序定制美团饿了么返利系统公众号外卖返利源码代搭建
  15. 【Codecs系列】HEVC标准(十二):参考帧管理RPS技术
  16. 工程经济有何难,思维导图来助阵
  17. Ogre – 材质脚本(三) (转)
  18. 拦截召唤神龙云文件,运行本地文件(侵删)
  19. 759页14万字智慧大楼弱电智能化规划设计方案
  20. vue实现生成二维码,并生成图片

热门文章

  1. 2022年全球与中国通用继电器行业发展趋势及投资战略分析报告
  2. 图片格式转换,JPG图片转换成PDF
  3. java导出xmind_如何使用Java解析XMind文件
  4. w ndows10启动黑屏,Win10系统电脑开机黑屏只有鼠标的终极解决方法图文教程
  5. Exchange 备份问题汇总
  6. Lookup所使用的二分法理解
  7. tigerVNC的简单使用教程(CentOS的远程桌面连接)
  8. excel不显示0_excel技巧:Excel中,为什么有时候会只显示公式不显示结果?
  9. qq空间营销方案讲解
  10. channel源代码实现