FPGA 图像处理之“九宫格”

该文详细介绍了如何通过FPGA技术,在图像的行有效区和场有效区分割成三等份,并利用VS、HS、DE信号进行计数,以在特定位置设置固定值(如白色)来实现九宫格的添加,从而突出图像的主体。这种方法适用于不同分辨率和帧率的图像处理。
摘要由CSDN通过智能技术生成

       九宫格构图作为摄影中的重要辅助工具,因此现如今基本所有的手机相机中都带有九宫格。九宫格又称“井”字构图,九宫格构图是在上、中、下、左、中、右三分法的基础上衍生出来的。图中四个交叉点称为趣味中心,四个点都符合“黄金分割定律”,拍摄中可以安排相应的拍摄“主体”,在对应的位置,使主体更容易被识别,达到突出拍摄主体的目的。本文主要是利用FPGA实现给图像加上九宫格。

       图像加上九宫格,从FPGA的角度来说,无非就是将图像的行有效区、场有效区各自均分为三份,在对应的某行和某场给一个固定值,一般情况为白色。所以根据图像数据来进行计数就是最重要的一步。

        根据图像数据中的VS,HS,DE来对行场进行计数。

always @(posedge i_clk or negedge rstn) begin
    if(rstn == 1'b0) begin
        vs_d1 <= 1'b0;
        hs_d1 <= 1'b0;
        de_d1 <= 1'b0;
        data_d1 <= 16'b0;
    end
    else begin
        vs_d1 <= i_vs;
        hs_d1 <= i_hs;
        de_d1 <= i_de;
        data_d1 <= i_data;
    end
end

always @(posedge i_clk or negedge rstn) begin
    if(rstn == 1'b0) begin
        vs_d2 <= 1'b0;
        hs_d2 <= 1'b0;
        de_d2 <= 1'b0;
        data_d2 <= 16'b0;
    end
    else begin
        vs_d2 <= vs_d1;
        hs_d2 <= hs_d1;
        de_d2 <= de_d1;
        data_d2 <= data_d1;
    end
end

always @(posedge i_clk or negedge rstn) begin
    if (rstn == 1'b0) begin
        first_en_flag <= 1'b0;
    end
    else begin
        if (vs_d2 == 1'b0 && vs_d1 == 1'b1) begin
            first_en_flag <= 1'b1;
        end
        else begin
            if (de_d2 == 1'b1) begin
                first_en_flag <= 1'b0;
            end
            else begin
                first_en_flag <= first_en_flag;
            end
        end
    end
end

首先对VS打两拍,以vs_d1的上升沿和vs_d2高电平产生一个标志信号first_en_flag。

接着根据分辨率和帧率信息进行对不同分辨率帧率的图像进行分别计数。

always @(posedge i_clk or negedge rstn) begin
    if (rstn == 1'b0) begin
        pixel_num <= 13'd0;
        line_num <= 12'd0;
    end
    else begin
        if (hd_fhd_uhd == 2'b01) begin//720
            if (first_en_flag == 1'b1 && de_d2 == 1'b1) begin
                case (frame_rate)
                    3'b000 : begin
                             pixel_num <= 13'd2846;
                             line_num <= 12'd26;
                        end
                    3'b001 : begin
                             pixel_num <= 13'd2681;
                             line_num <= 12'd26;
                        end
                    3'b010 : begin
                             pixel_num <= 13'd2021;
                             line_num <= 12'd26;
                        end
                    3'b011 : begin
                             pixel_num <= 13'd701;
                             line_num <= 12'd26;
                        end
                    3'b100 : begin
                             pixel_num <= 13'd371;
                             line_num <= 12'd26;
                        end
                    default : begin
                             pixel_num <= 13'd371;
                             line_num <= 12'd26;
                        end
                endcase
            end
            else begin
                if (frame_rate == 3'b000) begin//1280*720@24P
                    if (pixel_num == 13'd4125) begin//13'd4124
                        pixel_num <= 13'd1;//13'd0;
                        if (line_num == 12'd750) begin
                            line_num <= 12'd1;
                        end
                        else begin
                            line_num <= line_num + 1;
                        end
                    end
                    else begin
                        pixel_num <= pixel_num + 1;
                        line_num <= line_num;
                    end
                end
                else if (frame_rate == 3'b001) begin//1280*720@25P
                    if (pixel_num == 13'd3960) begin//13'd3959
                        pixel_num <= 13'd1;//13'd0;
                        if (line_num == 12'd750) begin
                            line_num <= 12'd1;
                        end
                        else begin
                            line_num <= line_num + 1;
                        end
                    end
                    else begin
                        pixel_num <= pixel_num + 1;
                        line_num <= line_num;
                    end
                end
                else if (frame_rate == 3'b010) begin//1280*720@30P
                    if (pixel_num == 13'd3300) begin//13'd3299
                        pixel_num <= 13'd1;//13'd0;
                        if (line_num == 12'd750) begin
                            line_num <= 12'd1;
                        end
                        else begin
                            line_num <= line_num + 1;
                        end
                    end
                    else begin
                        pixel_num <= pixel_num + 1;
                        line_num <= line_num;
                    end
                end
                else if (frame_rate == 3'b011) begin//1280*720@50P
                    if (pixel_num == 13'd1980) begin//13'd1979
                        pixel_num <= 13'd1;//13'd0
                        if (line_num == 12'd750) begin
                            line_num <= 12'd1;
                        end
                        else begin
                            line_num <= line_num + 1;
                        end
                    end
                    else begin
                        pixel_num <= pixel_num + 1;
                        line_num <= line_num;
                    end
                end
                else if (frame_rate == 3'b100) begin//1280*720@60P
                    if (pixel_num == 13'd1650) begin
                        pixel_num <= 13'd1;
                        if (line_num == 12'd750) begin
                            line_num <= 12'd1;
                        end
                        else begin
                            line_num <= line_num + 1;
                        end
                    end
                    else begin
                        pixel_num <= pixel_num + 1;
                        line_num <= line_num;
                    end
                end
            end
        end
        else if (hd_fhd_uhd == 2'b10) begin//1080
            if (first_en_flag == 1'b1 && de_d2 == 1'b1) begin
                if (frame_rate == 3'b010 || frame_rate == 3'b100) begin//1920*1080@30/60
                    pixel_num <= 13'd281;//2200-1920
                    line_num <= 12'd42;
                end
                else if (frame_rate == 3'b001 || frame_rate == 3'b011) begin//1920*1080@25/50
                    pixel_num <= 13'd721;//2640-1920
                    line_num <= 12'd42;
                end
                else if (frame_rate == 3'b000) begin//1920*1080@24
                    pixel_num <= 13'd831;//2750-1920
                    line_num <= 12'd42;
                end
            end
            else begin
                if (frame_rate == 3'b010 || frame_rate == 3'b100) begin//1920*1080@30/60
                    if (pixel_num == 13'd2200) begin
                        pixel_num <= 13'd1;
                        if (line_num == 12'd1125) begin
                            line_num <= 12'd1;
                        end
                        else begin
                            line_num <= line_num + 1;
                        end
                    end
                    else begin
                        pixel_num <= pixel_num + 1;
                        line_num <= line_num;
                    end
                end
                else if (frame_rate == 3'b001 || frame_rate == 3'b011) begin//1920*1080@25/50
                    if (pixel_num == 13'd2640) begin
                        pixel_num <= 13'd1;
                        if (line_num == 12'd1125) begin
                            line_num <= 12'd1;
                        end
                        else begin
                            line_num <= line_num + 1;
                        end
                    end
                    else begin
                        pixel_num <= pixel_num + 1;
                        line_num <= line_num;
                    end
                end
                else if (frame_rate == 3'b000) begin//1920*1080@24
                    if (pixel_num == 13'd2750) begin
                        pixel_num <= 13'd1;
                        if (line_num == 12'd1125) begin
                            line_num <= 12'd1;
                        end
                        else begin
                            line_num <= line_num + 1;
                        end
                    end
                    else begin
                        pixel_num <= pixel_num + 1;
                        line_num <= line_num;
                    end
                end
            end
        end
    end
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值