69.ov5640摄像头HDMI灰度显示

(1)理论学习

  • 灰度像素:在 RGB 颜色模型下,图像中每个像素颜色的 R、G、B 三种基色的分量值相等的像素。
  • 由灰度像素组成的灰度图像只能表现256中颜色(或亮度),通常把灰度图像中像素的亮度称为灰度值。
  • 灰度化处理:是指把彩色图像转化为灰色图像的处理过程,常用的方法有三种:最大值法、平均值法、加权平均值法。
  • 最大值法:使R、G、B的值三个值中最大的一个,即:R = G = B = max(R,G,B),用最大值法对彩色图像进行灰度化处理会使得图像的整体亮度增加。
  • 平均值法:对R、G、B求平均值,即R = G = B = (R,G,B)/3,用平均值法对彩色图像灰度化处理会形成比较柔和的灰度图像。
  • 加权平均值法:根据三种基色的重要性或其他指标赋予不同程度的权值,即:

        由于人眼对绿色的敏感度最高,对红色的敏感度次之,对蓝色的敏感度最低,因此使 Wg > Wr > Wb 将得到比较合理的灰度图像。实验和理论推导证明,Wr = 0.299、Wg = 0.587、Wb = 0.114时效果最佳。R = G = B = (0.299R + 0.587G + 0.114B)/( 0.299 + 0.587 + 0.114) =0.299R + 0.587G +0.114B。

  •  YUV色域:“Y"表示亮度,”U“和”V“则是色度和浓度。RGB转YUV公式如下: 

(2)实验目标

        使用ov5640双目摄像头的其中一个,经过灰度处理以后传入DDR3,最终在HDMI显示屏上实时显示。

(3)灰度处理模块代码及顶层模块,其余模块请参考之前实验。

module rgb_yuv
(
    input   wire    [15:0]  RGB565_data ,
    output  wire    [7:0]   Y           ,
    output  wire    [7:0]   U           ,
    output  wire    [7:0]   V           
);

parameter YR = 306;  //0.299 * 1024 = 306.176
parameter YG = 601;  //0.587 * 1024 = 601.088
parameter YB = 117;  //0.114 * 1024 = 116.736
parameter YW = 0;

parameter UR = -173; //-0.169 * 1024 = -173.056
parameter UG = -339; //-0.331 * 1024 = -338.944
parameter UB = 512;  //0.5    * 1024 = 512
parameter UW = 131072; //128  * 1024 = 131072

parameter VR = 512;  //0.5    * 1024 = 512
parameter VG = -429; //-0.419 * 1024 = -429.056
parameter VB = -83;  //-0.081 * 1024 = -82.944
parameter VW = 131072; //128  * 1024 = 131072

wire    [7:0]   R;
wire    [7:0]   G;
wire    [7:0]   B;

wire    [17:0]  temp_Y;
wire    [17:0]  temp_U;
wire    [17:0]  temp_V;

assign R = {RGB565_data[15:11],3'd0};
assign G = {RGB565_data[10:5],2'd0};
assign B = {RGB565_data[4:0],3'd0};

assign temp_Y = YR * R + YG * G + YB * B + YW;
assign temp_U = UR * R + UG * G + UB * B + UW;
assign temp_V = VR * R + VG * G + VB * B + VW;

assign Y = temp_Y[17:10];
assign U = temp_U[17:10];
assign V = temp_V[17:10];

endmodule
module ov5640_yuv_ddr_hdmi
(
    input   wire                clk                 ,
    input   wire                reset_n             ,
//ov5640            
    input   wire                ov5640_pclk         ,
    input   wire                ov5640_href         ,
    input   wire                ov5640_vsync        ,
    input   wire    [7:0]       ov5640_data         ,
    output  wire                ov5640_scl          ,
    inout   wire                ov5640_sda          ,
    output  wire                ov5640_pwdn         ,
    output  wire                ov5640_rst_n        ,   
//vga-hdmi接口
    output  wire                vga_hsync           ,
    output  wire                vga_vsync           ,
    output  wire                vga_clk             ,
    output  wire                vga_rst_n           ,
    output  wire    [23:0]      vga_rgb             ,
    output  wire                vga_DE              ,
//hdmi配置端接口
    output  wire                ddc_scl             ,
    inout   wire                ddc_sda             ,
//DDR3物理接口
    output  wire    [14:0]		ddr3_addr           ,
    output  wire    [2:0]		ddr3_ba             ,
    output  wire    			ddr3_cas_n          ,
    output  wire    		    ddr3_ck_n           ,
    output  wire    		    ddr3_ck_p           ,
    output  wire    		    ddr3_cke            ,
    output  wire    			ddr3_ras_n          ,
    output  wire    			ddr3_reset_n        ,
    output  wire    			ddr3_we_n           ,
    inout   wire    [31:0]		ddr3_dq             ,
    inout   wire    [3:0]		ddr3_dqs_n          ,
    inout   wire    [3:0]		ddr3_dqs_p          ,
    output  wire        		ddr3_cs_n           ,
    output  wire    [3:0]		ddr3_dm             ,
    output  wire        		ddr3_odt             
);

parameter H_PIXEL   =   24'd640 ;
parameter V_PIXEL   =   24'd480 ;

wire            rst_n               ;
wire            cfg_done            ;
wire            ov5640_wren         ;
wire    [15:0]  RGB565_data         ;
wire    [7:0]   Y                   ;
wire    [15:0]  data_wr             ;
wire            data_rden           ;
wire    [15:0]  data_rd             ;
wire            clk_25M             ;
wire            clk_320M            ;
wire            locked              ;
wire            init_calib_complete ;
wire    [23:0]  data_in             ;
wire            init_rst_n          ;
wire            sys_init_done       ;

assign rst_n  = reset_n & locked    ;
assign init_rst_n = rst_n & init_calib_complete;
assign ov5640_pwdn = 1'd0           ;
assign ov5640_rst_n = 1'd1          ;
assign vga_rst_n = rst_n            ;
assign sys_init_done = cfg_done & init_calib_complete;

pll     pll_inst
(
    .clk_25M    (clk_25M    ),    
    .clk_320M   (clk_320M   ),   
    
    .reset      (~reset_n   ),
    .locked     (locked     ),   
    
    .clk_in1    (clk        )
);  

ov5640_top      ov5640_top_inst
(
    .clk             (clk_25M       ),
    .reset_n         (reset_n       ),
    .sys_init_done   (sys_init_done ),

    .ov5640_pclk     (ov5640_pclk   ),
    .ov5640_href     (ov5640_href   ),
    .ov5640_vsync    (ov5640_vsync  ),
    .ov5640_data     (ov5640_data   ),
    .cfg_scl         (ov5640_scl    ),
    .cfg_sda         (ov5640_sda    ),

    .cfg_done        (cfg_done      ), 
    .ov5640_wren     (ov5640_wren   ),
    .data_out        (RGB565_data   )
);

rgb_yuv     rgb_yuv_inst
(
    .RGB565_data    (RGB565_data),
    .Y              (Y          ),
    .U              (),
    .V              ()
);

assign data_wr = {Y[7:3],Y[7:2],Y[7:3]};

axi_ddr3_top    axi_ddr3_top_inst
(
    .ddr3_clk            (clk_320M              ),
    .reset_n             (rst_n                 ),
    .pingpang            (1'd0                  ),
    .ui_clk              (),
    .ui_rst              (),
    
    .wr_b_addr           (32'd0                 ),
    .wr_e_addr           (H_PIXEL * V_PIXEL * 2 ),
    .wr_clk              (ov5640_pclk           ),
    .data_wren           (ov5640_wren           ),
    .data_wr             (data_wr               ),
    .wr_rst              (1'd0                  ),

    .rd_b_addr           (32'd0                 ),
    .rd_e_addr           (H_PIXEL * V_PIXEL * 2 ),
    .rd_clk              (clk_25M               ),
    .data_rden           (data_rden             ),
    .data_rd             (data_rd               ),
    .rd_rst              (1'd0                  ),
    .read_enable         (1'd1                  ),
    .rd_data_valid       (),

    .ddr3_addr           (ddr3_addr             ),
    .ddr3_ba             (ddr3_ba               ),
    .ddr3_cas_n          (ddr3_cas_n            ),
    .ddr3_ck_n           (ddr3_ck_n             ),
    .ddr3_ck_p           (ddr3_ck_p             ),
    .ddr3_cke            (ddr3_cke              ),
    .ddr3_ras_n          (ddr3_ras_n            ),
    .ddr3_reset_n        (ddr3_reset_n          ),
    .ddr3_we_n           (ddr3_we_n             ),
    .ddr3_dq             (ddr3_dq               ),
    .ddr3_dqs_n          (ddr3_dqs_n            ),
    .ddr3_dqs_p          (ddr3_dqs_p            ),
    .init_calib_complete (init_calib_complete   ),
    .ddr3_cs_n           (ddr3_cs_n             ),
    .ddr3_dm             (ddr3_dm               ),
    .ddr3_odt            (ddr3_odt              )  
);

hdmi_iic    hdmi_iic_inst
(
    .hdmi_clk    (clk_25M   ),
    .reset_n     (rst_n     ),

    .hdmi_scl    (ddc_scl   ),
    .hdmi_sda    (ddc_sda   )
);

vga_ctrl    vga_ctrl_inst
(
    .vga_clk     (clk_25M       ),
    .reset_n     (init_rst_n    ),
    .data_in     (data_in       ),

    .hang        (),
    .lie         (),
    .hsync       (vga_hsync     ),
    .vsync       (vga_vsync     ),
    .rgb_vga     (vga_rgb       ),
    .vga_DE      (vga_DE        )   
);

assign vga_clk      = clk_25M;
assign data_rden    = vga_DE;
assign data_in      = {data_rd[15:11],3'b000,data_rd[10:5],2'b00,data_rd[4:0],3'b000};   

endmodule

(4)实验现象:

  • 实验板卡及摄像头:
  • 没有经过灰度处理的HDMI显示屏显示情况:
  • 经过灰度处理的HDMI显示屏显示情况:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值