8.均值滤波

1 简介

  均值滤波是一种低通滤波,它可以有效过滤图片中的椒盐噪声,但是副作用也同样明显,会使图片的边缘过于模糊。
  均值滤波的卷积核系数均为1。
  这里最终重复一下算法实现以及验证的步骤:
    1.MATLAB读取图片并转化为TXT格式,命名为pre.txt。
    2.ModelSim读取pre.txt文本并输入给FPGA实现的算法模块进行仿真,并将仿真后的数据写入TXT文本,命名为post.txt。
    3.MATLAB对读取图像并用算法对图像进行处理,同时读取步骤2的post.txt文本进行数据对比,如果数据完全一致,则FPGA算法实现与MALAB算法实现均正确。
    4.MATLAB读取post.txt转化为图片,查看算法实现效果。
  由步骤可知MATLAB共有三个文件,一个图片转TXT,一个算法实现与比较,一个TXT转图片。

2 MATLAB的格式转换

  本试验采用的图片为第六章的RGB转YCBCR最后生成的图片。点击此处跳转到文章,
  转化的MATLAB代码为:

clear;
clc;
close all;
a = imread('../img/gray.bmp');
imshow(a);
[row,col] = size(a);p_fid = fopen('../data/pre.txt','w+');
for i = 1:rowfor j = 1:col fprintf(p_fid,'%02x' ,a(i,j));fprintf(p_fid,'\n');endend
fclose(p_fid);

3 均值滤波的FPGA实现与仿真。

  均值滤波要用到3X3的卷积核,这里我们选择边沿复制的方式,卷积核系数均为1,卷积核的生成方式查看第七章点击跳转,在此模块的基础上继续编写均值滤波部分。由于均值滤波需要除以9,在FPGA中的除法实现较为消耗资源与时间,除以9采用先乘以7281再除以65536来实现。

3.1 均值滤波的FPGA实现

3.1.1 3X3卷积核实现

module 	padding_matrix #(parameter 	COL 	= 	1920 	 	,parameter 	ROW 	= 	1080 	 	,parameter 	PADDING = 	0 		 	
)(input 	wire 			clk 		,input 	wire 			rst_n 		,input 	wire 	[7:0] 	data 		,input 	wire 	 		data_de 	, output 	wire  			matrix_de 	,output 	reg 	[7:0] 	matrix11 	,output 	reg 	[7:0] 	matrix12 	,output 	reg 	[7:0] 	matrix13 	,output 	reg 	[7:0] 	matrix21 	,output 	reg 	[7:0] 	matrix22 	,output 	reg 	[7:0] 	matrix23 	,output 	reg 	[7:0] 	matrix31 	,output 	reg 	[7:0] 	matrix32 	,output 	reg 	[7:0] 	matrix33 	
);reg 	[1:0] 	 data_de_r 	;
reg 	[7:0] 	 data_r1 	;
reg 	[7:0] 	 data_r2 	;reg 	[15:0] 	 col_cnt 	;
reg 	[15:0] 	 row_cnt 	;	reg 			data_valid 	;
reg 	[4:0]	data_valid_r;
reg 			fake_data_valid;wire 	[7:0] 	row1_data 	;
wire 	[7:0] 	row2_data 	;
reg 	[7:0] 	row3_data 	;wire  	[1:0] 	padding 	;
assign 	padding  	= 	PADDING;always @(posedge clk )begindata_de_r <= {data_de_r[1:0],data_de};data_valid_r 	<= 	{data_valid_r[3:0],data_valid};data_r1 	<= 	data 		;
end
wire 	pos_data_de;
assign 	pos_data_de = {data_de_r[0],data_de} == 2'b01;always @(posedge clk or negedge rst_n)beginif(rst_n == 0)begincol_cnt 	<= 0;endelse if(col_cnt == COL + 1)begincol_cnt 	<= 0;endelse if(data_valid || fake_data_valid)begincol_cnt 	<= col_cnt + 1;end
endalways @(posedge clk or negedge rst_n)beginif(rst_n == 0)beginrow_cnt 	<= 0;endelse if(col_cnt == COL + 1 && row_cnt == ROW )beginrow_cnt	 	<= 0;endelse if(col_cnt == COL + 1)beginrow_cnt 	<= row_cnt + 1;end
endalways @(posedge clk or negedge rst_n) beginif (rst_n == 0) begin		fake_data_valid 	<= 0;endelse if (data_valid_r[4] == 0 && row_cnt == ROW && col_cnt <= COL  ) beginfake_data_valid 	<= 1;endelse beginfake_data_valid 	<= 	0;end
endalways @(posedge clk or negedge rst_n)beginif(rst_n == 0)beginrow3_data 	<= 0;endelse if(col_cnt == 0 && pos_data_de && padding == 0)beginrow3_data 	<= 0 ;endelse if(col_cnt == 0 && pos_data_de && padding == 1)beginrow3_data 	<= 8'hFF ;endelse if(col_cnt == 0 && pos_data_de)beginrow3_data 	<= data ;endelse if(col_cnt == COL && data_de_r[1] && padding == 0)beginrow3_data 	<= 0;endelse if(col_cnt == COL && data_de_r[1] && padding == 1)beginrow3_data 	<= 8'hFF;endelse if(col_cnt == COL && data_de_r[1])beginrow3_data 	<= row3_data;endelse beginrow3_data 	<= data_r1;end
endalways@(posedge clk or negedge rst_n)beginif(rst_n == 0)begindata_valid <= 0;endelse if(data_de || data_de_r[1])begindata_valid <= 1'b1;endelse begindata_valid <= 1'b0;end
endwire 			rd_en 	;	fifo_matrix_buf u1_fifo_matrix_buf (.rst 		(!rst_n		),  .wr_clk 	(clk  	 	),  .rd_clk 	(clk 	 	),  .din 		(row2_data 	),  .wr_en 		(data_valid ),  .rd_en 		(rd_en 	 	),  .dout 		(row1_data 	),  .full 		( 	 		),  .empty 		( 	 		)   
);fifo_matrix_buf u2_fifo_matrix_buf (.rst 		(!rst_n		),  .wr_clk 	(clk  	 	),  .rd_clk 	(clk 	 	),  .din 		(row3_data 	),  .wr_en 		(data_valid ),  .rd_en 		(rd_en 		),  .dout 		(row2_data 	), .full 		(   		),  .empty 		(    		)   
);assign rd_en = (row_cnt > 0 & (data_valid | fake_data_valid) )? 1'b1 : 1'b0;always @(posedge clk or negedge rst_n)beginif(rst_n == 0)begin{matrix11,matrix12,matrix13} 	<= 	24'd0;{matrix21,matrix22,matrix23} 	<= 	24'd0;{matrix31,matrix32,matrix33} 	<= 	24'd0;endelse if(rd_en)beginif(row_cnt == 1)beginif (padding == 0) begin{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,  	8'h0};{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row3_data};				endif (padding == 1) begin{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,    8'hFF};{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row3_data};				endelse begin{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row2_data};{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row3_data};				endend	else if (row_cnt == ROW) beginif (padding == 0) begin{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row1_data};{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,     8'h0};				endelse if(padding == 1) begin{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row1_data};{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,    8'hff};				endelse begin{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row1_data};{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row2_data};				end			endelse begin{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row1_data};{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row3_data};end	endendreg 	[2:0] 	rd_en_r;
always @(posedge clk)beginrd_en_r 	<= 	{rd_en_r[1:0],rd_en};
endassign 	matrix_de 	= 	rd_en_r[2] & rd_en_r[0] ;
endmodule 	

3.1.2 均值滤波算法的FPGA实现

`timescale 1ns / 1psmodule ave_filter#(parameter DW = 8
)(input   wire                clk         ,input   wire                rst_n       ,input   wire                matrix_de   ,input   wire    [DW-1:0]    matrix11    ,input   wire    [DW-1:0]    matrix12    ,input   wire    [DW-1:0]    matrix13    ,input   wire    [DW-1:0]    matrix21    ,input   wire    [DW-1:0]    matrix22    ,input   wire    [DW-1:0]    matrix23    ,input   wire    [DW-1:0]    matrix31    ,input   wire    [DW-1:0]    matrix32    ,input   wire    [DW-1:0]    matrix33    ,output  wire                ave_data_de ,output  wire    [DW-1:0]    ave_data );reg     [2:0]           matrix_de_r     ;reg     [DW+1:0]        one_line        ;
reg     [DW+1:0]        two_line        ;
reg     [DW+1:0]        three_line      ;
reg     [DW+3:0]        sum_matrix      ;
reg     [DW+15:0]       pre_ave_data    ;always @(posedge clk)beginif(rst_n == 0)beginmatrix_de_r     <=  0;end else beginmatrix_de_r     <=  {matrix_de_r[1:0],matrix_de};end
end always @(posedge clk)beginif(rst_n == 0)beginone_line    <=  0;two_line    <=  0;three_line  <=  0;end else if(matrix_de)beginone_line    <=  matrix11 + matrix12 + matrix13;two_line    <=  matrix21 + matrix22 + matrix23;three_line  <=  matrix31 + matrix32 + matrix33;endelse beginone_line    <=  0;two_line    <=  0;three_line  <=  0;end
endalways @(posedge clk)beginif(rst_n == 0)beginsum_matrix  <=  0;end else if(matrix_de_r[0])beginsum_matrix  <=  one_line + two_line + three_line ;endelse beginsum_matrix  <=  0;end
endalways @(posedge clk)beginif(rst_n == 0)beginpre_ave_data    <=  0;end else if(matrix_de_r[1])beginpre_ave_data    <=  sum_matrix * 7281;endelse beginpre_ave_data    <=  0;end
endassign  ave_data    =   pre_ave_data[DW+15:16];
assign  ave_data_de = matrix_de_r[2];
endmodule

3.1.3 3X3卷积核生成与均值滤波模块的连接

`timescale 1ns / 1ps
module top_ave_filter#(parameter COL       = 1920  ,parameter ROW       = 1080  ,parameter PADDING   = 2     ,parameter DW        = 8     
)(input   wire                clk             ,input   wire                rst_n           ,input   wire                data_de         ,input   wire    [DW-1:0]    data            ,output  wire                ave_data_de     ,output  wire    [DW-1:0]    ave_data          
);wire    [DW-1:0]      matrix11    ;
wire    [DW-1:0]      matrix12    ;
wire    [DW-1:0]      matrix13    ;
wire    [DW-1:0]      matrix21    ;
wire    [DW-1:0]      matrix22    ;
wire    [DW-1:0]      matrix23    ;
wire    [DW-1:0]      matrix31    ;
wire    [DW-1:0]      matrix32    ;
wire    [DW-1:0]      matrix33    ;    padding_matrix #(.COL 	    (COL        ),.ROW 	    (ROW        ),.PADDING    (PADDING    )
)u_padding_matrix(.clk 		    (clk 		    ),.rst_n 		    (rst_n 		    ),.data 		    (data 		    ),.data_de 	    (data_de 	    ), .matrix_de 	    (matrix_de 	    ),.matrix11 	    (matrix11 	    ),.matrix12 	    (matrix12 	    ),.matrix13 	    (matrix13 	    ),.matrix21 	    (matrix21 	    ),.matrix22 	    (matrix22 	    ),.matrix23 	    (matrix23 	    ),.matrix31 	    (matrix31 	    ),.matrix32 	    (matrix32 	    ),.matrix33 	    (matrix33 	    )
);ave_filter #(.DW         (DW)
)u_ave_filter(.clk            (clk            ),.rst_n          (rst_n          ),.matrix_de      (matrix_de      ),.matrix11       (matrix11       ),.matrix12       (matrix12       ),.matrix13       (matrix13       ),.matrix21       (matrix21       ),.matrix22       (matrix22       ),.matrix23       (matrix23       ),.matrix31       (matrix31       ),.matrix32       (matrix32       ),.matrix33       (matrix33       ),.ave_data_de    (ave_data_de    ),.ave_data       (ave_data       ));
endmodule

在这里插入图片描述

3.2 FPGA仿真

3.2.1 像素读入

`timescale 1ns / 1psmodule img_gen
#(parameter 	ACTIVE_IW 	= 	1920 	,parameter 	ACTIVE_IH 	= 	1080 	,parameter 	TOTAL_IW 	= 	2200 	,parameter 	TOTAL_IH 	= 	1100 	,parameter 	H_START 	= 	100 	,parameter 	V_START 	= 	4 		 		
)(input 	wire 				clk 	,input 	wire 				rst_n 	,output 	reg 				vs 		,output 	reg  	 	 		de 		,output 	reg 	[7:0] 		data 	
);reg  	[7:0] 	raw_array 	 [ACTIVE_IW*ACTIVE_IH-1:0];integer i;
initial beginfor (i=0 ;i<ACTIVE_IH*ACTIVE_IW ; i=i+1) beginraw_array[i] = 0;end
endinitial begin$readmemh("H:/picture/Z7/lesson7/data/pre.txt",raw_array);
endreg 	[15:0] 	hcnt 	;
reg 	[15:0] 	vcnt 	;reg 			h_de 	;
reg 			v_de  	;reg  			index_de 	;
reg 	[31:0] 	index 	 	;always @(posedge clk or negedge rst_n)if(!rst_n)hcnt <= 'd0;else if(hcnt == TOTAL_IW - 1)hcnt <= 'd0;else hcnt <= hcnt + 1'b1;always @(posedge clk or negedge rst_n)if(!rst_n)vcnt <= 'd0;else if(hcnt == TOTAL_IW - 1 && vcnt == TOTAL_IH - 1)vcnt <= 'd0;else if(hcnt == TOTAL_IW - 1)vcnt <= vcnt + 1'b1;else vcnt <= vcnt;always @(posedge clk or negedge rst_n)if(!rst_n)vs <= 'd0;else if(vcnt>=2)vs <= 1'b1;else vs <= 1'b0;always @(posedge clk or negedge rst_n)if(!rst_n)h_de <= 'd0;else if(hcnt >= H_START && hcnt < H_START + ACTIVE_IW)h_de <= 1'b1;else h_de <= 1'b0;always @(posedge clk or negedge rst_n)if(!rst_n)v_de <= 'd0;else if(vcnt >= V_START && vcnt < V_START + ACTIVE_IH)v_de <= 1'b1;else v_de <= 1'b0;always @(posedge clk or negedge rst_n)if(!rst_n)index_de <= 'd0;else if(h_de == 1'b1 && v_de == 1'b1)index_de <= 1'b1;else index_de <= 1'b0;always @(posedge clk or negedge rst_n)if(!rst_n)index <= 'd0;else if(index == ACTIVE_IW * ACTIVE_IH-1)index <= 0;else if(index_de == 1'b1)index <= index + 1;else index <= index;always @(posedge clk or negedge rst_n)if(!rst_n)de <= 'd0;else de <= index_de;always @(posedge clk or negedge rst_n)beginif(index_de == 1'b1)data 	<= 	raw_array[index];else data 	<= 0;
end
endmodule

3.2.1 顶层TB连接

`timescale 1ns / 1psmodule img_gen
#(parameter 	ACTIVE_IW 	= 	1920 	,parameter 	ACTIVE_IH 	= 	1080 	,parameter 	TOTAL_IW 	= 	2200 	,parameter 	TOTAL_IH 	= 	1100 	,parameter 	H_START 	= 	100 	,parameter 	V_START 	= 	4 		 		
)(input 	wire 				clk 	,input 	wire 				rst_n 	,output 	reg 				vs 		,output 	reg  	 	 		de 		,output 	reg 	[7:0] 		data 	
);reg  	[7:0] 	raw_array 	 [ACTIVE_IW*ACTIVE_IH-1:0];integer i;
initial beginfor (i=0 ;i<ACTIVE_IH*ACTIVE_IW ; i=i+1) beginraw_array[i] = 0;end
endinitial begin$readmemh("H:/picture/Z7/lesson7/data/pre.txt",raw_array);
endreg 	[15:0] 	hcnt 	;
reg 	[15:0] 	vcnt 	;reg 			h_de 	;
reg 			v_de  	;reg  			index_de 	;
reg 	[31:0] 	index 	 	;always @(posedge clk or negedge rst_n)if(!rst_n)hcnt <= 'd0;else if(hcnt == TOTAL_IW - 1)hcnt <= 'd0;else hcnt <= hcnt + 1'b1;always @(posedge clk or negedge rst_n)if(!rst_n)vcnt <= 'd0;else if(hcnt == TOTAL_IW - 1 && vcnt == TOTAL_IH - 1)vcnt <= 'd0;else if(hcnt == TOTAL_IW - 1)vcnt <= vcnt + 1'b1;else vcnt <= vcnt;always @(posedge clk or negedge rst_n)if(!rst_n)vs <= 'd0;else if(vcnt>=2)vs <= 1'b1;else vs <= 1'b0;always @(posedge clk or negedge rst_n)if(!rst_n)h_de <= 'd0;else if(hcnt >= H_START && hcnt < H_START + ACTIVE_IW)h_de <= 1'b1;else h_de <= 1'b0;always @(posedge clk or negedge rst_n)if(!rst_n)v_de <= 'd0;else if(vcnt >= V_START && vcnt < V_START + ACTIVE_IH)v_de <= 1'b1;else v_de <= 1'b0;always @(posedge clk or negedge rst_n)if(!rst_n)index_de <= 'd0;else if(h_de == 1'b1 && v_de == 1'b1)index_de <= 1'b1;else index_de <= 1'b0;always @(posedge clk or negedge rst_n)if(!rst_n)index <= 'd0;else if(index == ACTIVE_IW * ACTIVE_IH-1)index <= 0;else if(index_de == 1'b1)index <= index + 1;else index <= index;always @(posedge clk or negedge rst_n)if(!rst_n)de <= 'd0;else de <= index_de;always @(posedge clk or negedge rst_n)beginif(index_de == 1'b1)data 	<= 	raw_array[index];else data 	<= 0;
end
endmodule

4 MATLAB实现与比较

4.1 MATLAB实现

clc;
clear all;
GRAY = imread('../img/gray.bmp');
[row,col] = size(GRAY);
GRAY = double(GRAY);
ave_padding = zeros(row+2,col+2);
ave_result  =   zeros(row,col);
for i = 1:rowfor j = 1:colave_padding(i+1,j+1) = GRAY(i,j);end
endfor i = 1:row+2ave_padding(i,1) = ave_padding(i,2);ave_padding(i,col+2) = ave_padding(i,col+1);
endfor i = 1:col+2ave_padding(1,i) = ave_padding(2,i);ave_padding(row+2,i) = ave_padding(row+1,i);
endfor i = 2:row+1for j = 2:col+1matrix11 = ave_padding(i-1,j-1);matrix12 = ave_padding(i-1,j);matrix13 = ave_padding(i-1,j+1);matrix21 = ave_padding(i,j-1);matrix22 = ave_padding(i,j);matrix23 = ave_padding(i,j+1);matrix31 = ave_padding(i+1,j-1);matrix32 = ave_padding(i+1,j);matrix33 = ave_padding(i+1,j+1); ave_result(i-1,j-1) = (matrix11+matrix12+matrix13+matrix21+matrix22+matrix23+matrix31+matrix32+matrix33)/9;end
end
matlab_Y = uint8(floor(ave_result));a = textread('../data/post.txt','%s');
IMdec = hex2dec(a);col = 1920;
row = 1080;IM = reshape(IMdec,col,row);
fpga_Y = uint8(IM)';subplot(1,2,1)
imshow(matlab_Y),title('MATLAB算法图像');
subplot(1,2,2)
imshow(fpga_Y),title('FPGA算法图像');sub = matlab_Y - fpga_Y;min_sub = min(min(sub));
max_sub = max(max(sub));

4.2 比较

4.2.1 数据比较

在这里插入图片描述
  两者实现像素做差可以看出FPGA实现与MATLAB实现在部分像素区域有着一个像素点的误差,这在定浮点数中无可避免。

4.2.2 算法结果比较

在这里插入图片描述

4.2.3算法前后比较

  将FPGA仿真得到的post.txt图像数据转化为BMP格式的图片并显示出来。转化代码为:

clear ;
clc ;
close;
a = textread("../data/post.txt",'%s');
IMdec = hex2dec(a);col = 1920;
row = 1080;IM = reshape(IMdec,col,row);
b = uint8(IM)';
imwrite(b,'../img/post.bmp');
subplot(1,2,1)
imshow('../img/post.bmp'),title('FPGA算法图像');
subplot(1,2,2)
imshow('../img/gray.bmp'),title('原图像');

  得到的图像对比如下图,可以看出边缘明显变模糊,这也是均值滤波的缺点,所以一般情况下不会用均值滤波来做图像处理,一般采用中值滤波等。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/777997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

macOS Sonoma如何查看隐藏文件

在使用Git进行项目版本控制时&#xff0c;我们可能会遇到一些隐藏文件&#xff0c;比如.gitkeep文件。它通常出现在Git项目的子目录中&#xff0c;主要作用是确保空目录也可以被跟踪。 终端命令 在尝试查看.gitkeep文件时&#xff0c;使用Terminal命令来显示隐藏文件 default…

【Pt】马灯贴图绘制过程 03-制作油渍、积尘效果

目录 效果 一、制作油渍效果 1.1 基本油渍 1.2 流淌的油渍痕迹 二、制作浮尘效果 三、制作积尘效果 效果 一、制作油渍效果 1.1 基本油渍 将上篇制作的“锈迹_深色”和“锈迹_浅色”两个文件夹再次合并为一个文件夹 这里就命名为“锈迹” 添加一个填充图层 设置Base …

七月论文审稿GPT第4版:通过paper-review数据集微调Mixtral-8x7b

模型训练 Mixtral-8x7b地址&#xff1a;魔搭社区 GitHub: hiyouga/LLaMA-Factory: Unify Efficient Fine-tuning of 100 LLMs (github.com) 环境配置 git clone https://github.com/hiyouga/LLaMA-Factory.git conda create -n llama_factory python3.10 conda activate lla…

支持 java22,Solon v2.7.3 发布(非 java-ee 架构)

Java Solon 是什么框架&#xff1f; 是一个可平替 Spring 生态的 Java 应用开发框架。从零开始构建&#xff08;非 java-ee 架构&#xff09;&#xff0c;有自己的标准规范与开放生态。&#xff08;历时七年&#xff0c;具备全球第二级别的生态规模&#xff09; 追求&#xf…

小程序利用WebService跟asp.net交互过程发现的问题并处理

最近在研究一个项目&#xff0c;用到asp.net跟小程序交互&#xff0c;简单的说就是小程序端利用wx.request发起请求。获取asp.net 响应回来的数据。但经常会报错。点击下图的测试按钮 出现如下错误&#xff1a; 百思不得其解&#xff0c;试了若干方法&#xff0c;都不行。 因为…

多线程基础:线程通信内容补充

多线程基础&#xff1a;线程通信内容补充 文章目录 多线程基础&#xff1a;线程通信内容补充前言一、wait(), notify(), notifyAll()二、join()三、Lock 和 Condition四、并发集合和原子变量1、并发集合2、原子变量 总结 前言 前文内容中讲了线程通信的内容&#xff0c;但是不…

企业网站建设的方法的相关问题的解决办法的问题

现在市场上比较大的公司都建立了自己的企业网站&#xff0c;比如华为、小米等&#xff0c;在他们的企业网站中&#xff0c;可以充分展示自己产品的优势&#xff0c;介绍公司的优质服务。 这都是让顾客改变购买想法的重要因素。 现在互联网发达了&#xff0c;很多人在购买产品的…

Typescript再学习-接口interface扩展(5)

接口可以通过extends继承&#xff0c;看代码如下 interface commonPerson {name: string;age: number;sex: string;address: string; }interface Police extends commonPerson {idCard: string;job: string; } let LiHanxing: Police {name: "李汉星",age: 22,sex:…

智慧工地安全生产与风险预警大平台的构建,需要哪些技术?

随着科技的不断发展&#xff0c;智慧工地已成为现代建筑行业的重要发展趋势。智慧工地方案是一种基于先进信息技术的工程管理模式&#xff0c;旨在提高施工效率、降低施工成本、保障施工安全、提升施工质量。一般来说&#xff0c;智慧工地方案的构建&#xff0c;需要通过集成物…

计算机网络:物理层 - 信道极限容量

计算机网络&#xff1a;物理层 - 信道极限容量 实际信道中的数字信号奈式准则香农公式练习 实际信道中的数字信号 信号在传输过程中会受到各种因素的影响&#xff0c;如图所示&#xff1a; 这是一个数字信号&#xff0c;当它通过实际的信道后&#xff0c;波形会产生失真&#…

java中正则表达式第一次特殊使用

记录第一次使用~ 正则表达式的使用 正则表达式&#xff08;Regular Expression&#xff09;是一种用于模式匹配的强大工具&#xff0c;它由普通字符&#xff08;例如字母、数字、符号&#xff09;和特殊字符&#xff08;元字符&#xff09;组成。以下是使用正则表达式的一些…

Flutter 内置按钮介绍及使用

Flutter 提供了多种内置按钮&#xff0c;可以满足不同场景的需求。本文将介绍 Flutter 中常见的按钮类型&#xff0c;以及它们的属性和使用方法。 按钮类型 Flutter 中常见的按钮类型包括&#xff1a; ElevatedButton: 凸起按钮&#xff0c;默认带有阴影和灰色背景。TextBut…

如何使用C语言进行异常处理?C语言中的可变参数函数

一、如何使用C语言进行异常处理&#xff1f; 在C语言中&#xff0c;并没有像C或Java等语言那样内置的异常处理机制。C语言主要依赖于返回值、错误码以及条件编译指令来进行错误处理。然而&#xff0c;你仍然可以通过一些方法模拟异常处理的行为。 一种常见的模拟异常处理的方…

Linux学习:进程(3)与 环境变量

目录 1. 进程的优先级1.1 什么是进程的优先级1.2 优先级的具体表示与查看方式 2. 进程的切换与调度2.1 切换2.2 调度 3. 环境变量3.1 main参数/命令行参数3.2 什么是环境变量3.3 环境变量的使用与特性3.5 本地变量与环境变量的脚本配置文件 1. 进程的优先级 在计算机运行的过程…

stamac Ethernet DTS配置

目录 Demo 配置 compatible reg interrupts & interrupt-names phy-mode phy-handle Snps,reset-gpio

【JavaScript】数组 ② ( JavaScript 数组索引 | JavaScript 遍历数组 | 使用 for 循环遍历数组 )

文章目录 一、JavaScript 数组索引1、数组索引2、数组索引 - 代码示例 二、JavaScript 遍历数组1、使用 for 循环遍历数组2、使用 for 循环遍历数组 - 代码示例 一、JavaScript 数组索引 1、数组索引 在 JavaScript 中 , 数组 的 " 索引 " 又称为 " 下标 "…

将yolov5s部署到安卓上实战经验总结

最近需要在手机端实现一个目标检测的功能&#xff0c;于是选择了小巧又在目标检测方面表现很好的yolov5s&#xff0c;官网下载yolov5代码&#xff0c;用自己做的数据集进行了训练&#xff0c;然后把模型转换成torchscript格式&#xff0c;这些过程网上都有很多讲解&#xff0c;…

电脑突然死机怎么办?

死机是电脑常见的故障问题&#xff0c;尤其是对于老式电脑来说&#xff0c;一言不合电脑画面就静止了&#xff0c;最后只能强制关机重启。那么你一定想知道是什么原因造成的吧&#xff0c;一般散热不良最容易让电脑死机&#xff0c;还有系统故障&#xff0c;比如不小心误删了系…

手机卫星通信

1. 前言 手机卫星通信&#xff0c;顾名思义&#xff0c;就是手机可以与卫星建立通信连接实现数据交互的技术。手机卫星高速数据连接是目前手机通话短信的下一代技术&#xff0c;也是新一代通信生态中的重要组成部分&#xff0c;即非地面网络&#xff08;Non-Terrestrial Networ…

React 应用实现监控可观测性最佳实践

前言 React 是一个用于构建用户界面的 JavaScript 框架。它采用了虚拟 DOM 和 JSX&#xff0c;提供了一种声明式的、组件化的编程模型&#xff0c;以便更高效地构建用户界面。无论是简单还是复杂的界面&#xff0c;React 都可以胜任。 YApi 是使用 React 编写的高效、易用、功…