前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于FPGA的帧差法仿真实现

基于FPGA的帧差法仿真实现

作者头像
FPGA开源工作室
发布2019-10-29 11:32:35
2K0
发布2019-10-29 11:32:35
举报
文章被收录于专栏:FPGA开源工作室FPGA开源工作室

基于FPGA的帧差法仿真实现

一、帧差法的原理及应用

帧差法就是帧间差分法,帧差法是最为常用的行动目标检测措施之一,原理即是在图像序列邻接两帧或三帧间基于像素做差分运算来获取。率先,将邻接帧图像对应像素值相减获得差分图像,然后对差分图像二值化,在环境亮度改变不大的情形下,对应像素值改变小于预先确定的阈值时,能够感受这里为背景像素。假如图像区域的像素值改变很大,能够感受这是由于图像中行动物体引起的,将这些区域符号为前景像素,利用符号的像素区域能够确定行动目标在图像中的位置。由于邻接两帧间的工夫间隔极其短,用前一帧图像作为目前帧的背景模型具有较好的实时性,其背景不聚集,且更新速度快、算法容易、计算量小。算法的不足在于对环境噪声较为敏感,阈值的抉择相当关键,抉择过低不足以压抑图像中的噪声,过高则疏忽了图像中有用的改变。对于比拟大的、颜色统一的行动目标,有可能在目标内部发生抽象,无法全面地提取行动目标。多数应用于选择十字路口监控录像作为实验材料,检测过往车辆动态,也能为后期机器识别打下基础。

帧差法主要通过下面式子实现,其中 x1 和 x2 分别为当前帧和上一帧同一位置坐标的像素点灰度值,T 为预设的参考分割阈值,y 为最终输出的二值结果

二、帧差分法实现步骤

1、实验框图

2、模块介绍

a、 imread_framel :此模块用于读取事先准备好需要进行帧差法的两帧或多帧图片。

b、 Vga_crt:此模块用于产生后续模块所需时序。

c、 Hvcount :此模块用于对后续模块进行时序同步。

d、 Framel_diff :此模块用于帧差法的实现。

e、 Imwrite_fra :此模块用于读取帧差之后的结果。

三、帧差法的FPGA仿真实现

帧差法的原理比较简单,就是实时图像的相邻两帧或者三帧做差,FPGA的实现的难点在于大部分FPGA的内部存储(BRAM)不足以存取一幅完整图像的数据,这时就需要借助外部的SDRAM或者DDR等存储。

帧差法仿真源码展示:

1. /******************************************************

2. // Project Name:Frame_Difference

3. //

4. // Author:Lee

5. // 微信公众号:FPGA开源工作室

6. *******************************************************/

7. `timescale 1ns / 1ps

8.

9. module Frame_Difference #(

10. parameter IW = 800,

11. parameter IH = 600,

12. parameter DW = 24

13. )(

14. input PixelClk,

15. input reset_n,

16. input [DW-1:0] i_rgb,

17. input i_hs,

18. input i_vs,

19. input i_de,

20. output [DW-1:0] o_rgb,

21. output o_hs,

22. output o_vs,

23. output o_de

24. );

25.

26.

27. reg we;

28. reg rd;

29. reg [20:0] waddr;//800*600

30. reg [20:0] raddr;

31. wire [DW-1:0] dout;

32. reg [DW-1:0] rgb_r;

33. reg [DW-1:0] dout_r;

34. reg hs_r0;

35. reg vs_r0;

36. reg de_r0;

37.

38. reg hs_r1;

39. reg vs_r1;

40. reg de_r1;

41.

42. reg hs_r2;

43. reg vs_r2;

44. reg de_r2;

45.

46. assign o_hs = hs_r2;

47. assign o_vs = vs_r2;

48. assign o_de = de_r2;

49. assign o_rgb = dout_r;

50. always @(posedge PixelClk )begin

51. rgb_r <= i_rgb;

52. hs_r0 <= i_hs;

53. vs_r0 <= i_vs;

54. de_r0 <= i_de;

55.

56. hs_r1 <= hs_r0 ;

57. vs_r1 <= vs_r0 ;

58. de_r1 <= de_r0 ;

59.

60. hs_r2 <= hs_r1 ;

61. vs_r2 <= vs_r1 ;

62. de_r2 <= de_r1 ;

63. end

64. always @(posedge PixelClk or negedge reset_n)begin

65. if(de_r1)

66. //dout_r <= dout - rgb_r; //Frame Difference

67. dout_r <= rgb_r - dout; //Frame Difference

68. else

69. dout_r <= 0;

70. end

71.

72. always @(posedge PixelClk or negedge reset_n)begin

73. if(!reset_n) begin

74. rd <= 0;

75. we <= 0;

76. raddr <= 0;

77. waddr <= 0;

78. end

79. else if(i_vs == 0) begin

80. rd <= 0;

81. we <= 0;

82. raddr <= 0;

83. waddr <= 0;

84. end

85. else if(i_de) begin

86. rd <= 1;

87. raddr <= raddr + 1;

88. we <= 1;

89. waddr <= waddr + 1;

90. end

91. else begin

92. rd <= 0;

93. we <= 0;

94. raddr <= raddr;

95. waddr <= waddr;

96. end

97. end

98.

99. Frame_Ram#(

100. .IW(IW),

101. .IH(IH),

102. .DW(DW)

103. )U_Frame_Ram(

104. .clk(PixelClk),

105. .reset_n(reset_n),

106. .we(we),

107. .rd(rd),

108. .waddr(waddr),//1920*1080

109. .raddr(raddr),

110. .din(i_rgb),

111. .dout(dout)

112. );

113.

114. endmodule

115.

116.

117. module Frame_Ram#(

118. parameter IW = 800,

119. parameter IH = 600,

120. parameter DW = 24

121. )(

122. input clk,

123. input reset_n,

124. input we,

125. input rd,

126. input [20:0] waddr,//800*600

127. input [20:0] raddr,

128. input [DW-1:0] din,

129. output [DW-1:0] dout

130. );

131.

132. //reg [DW-1:0] mem[0:IW*IH];

133. reg [DW-1:0] mem[IW*IH:0];

134.

135. reg [DW-1:0] rdata;

136. assign dout = rdata;

137.

138. integer n;

139. always @(posedge clk or negedge reset_n) begin

140. if(!reset_n) begin

141. for(n = 0; n <IW*IH; n = n+1) mem[n] <= 0;//sim only

142. rdata <= 0;

143. end

144. else begin

145. if(rd) rdata <= mem[raddr]; else rdata <= 0;

146. if(we) mem[waddr] <= din;

147. end

148. end

149.

150. endmodule

代码解释:

帧差法代码主要分为两个模块一个RAM用于存储一帧图像,Frame_Difference模块用于实现两帧之间点对点做差。

实验图1

实验图2

实验图3

结果图1

结果图2

实验结果分析:

实验图1为第一帧图像,实验图2为第二帧图像,实验图3为第三帧图像,第二帧和第三帧做差如图结果1所示,结果2为抓取结果1的位置。

在文章的末尾特别感谢网友迟茶枯对本文一二节内容的贡献。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FPGA开源工作室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档