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