BMP图片与VGA(HDMI)时序互转

1.BMP介绍

BMP(Bitmap)是一种用于存储位图图像的文件格式,广泛应用于 Windows 操作系统中。BMP 文件可以存储高质量的图像数据,包括颜色深度较高的图片,同时支持无压缩或可选的简单压缩方式。

BMP格式

文件头(14 字节):

  • 文件类型:2 字节,通常为 BM
  • 文件大小:4 字节,整个 BMP 文件的大小。
  • 保留字段:4 字节,保留字段,值为 0。
  • 像素数据偏移量:4 字节,图像数据开始的位置。

信息头(40 字节,常见的 BITMAPINFOHEADER):

  • 头大小:4 字节,信息头的大小。
  • 图像宽度:4 字节,以像素为单位。
  • 图像高度:4 字节,以像素为单位(正数表示自下而上,负数表示自上而下)。
  • 颜色平面数:2 字节,通常为 1。
  • 每像素位数:2 字节,表示颜色深度,常见值为 24。
  • 压缩方式:4 字节,通常为 0 表示无压缩。
  • 图像大小:4 字节,图像数据的大小,压缩时有效。
  • 水平分辨率:4 字节,水平方向像素每米数。
  • 垂直分辨率:4 字节,垂直方向像素每米数。
  • 使用颜色数:4 字节,调色板中使用的颜色数。
  • 重要颜色数:4 字节,调色板中重要的颜色数。

图像数据:包含每个像素的颜色值,对于 24 位 BMP,每个像素由 3 个字节组成,分别表示红色绿色蓝色

示例
在这里插入图片描述

Tip:

  1. BMP的54个字节的文件头都是小端模式,即36_00_03_00实际的十六进制是(30036)h = (196,662)d = (256(宽)* 256 (高)*3+对齐字节+信息头)
  2. BMP图像的每行需要是4的倍数(即对齐),如果不够需要填充0,如上图256%4 = 0,所以196,662 = (256(宽)* 256 (高)*3(字节)+0+54)
  3. BMP中图像数据的存储是从左下开始的,即坐标(width:0,height:height)开始存贮的,而matlab中imread函数或者软件打开bmp查看数值时(如上图)是从左下读的,所以不用考虑存储的位置

2.BMP转VGA时序

首先,在verilog中是无法直接读取bmp图片的,需要将bmp通过脚本将其转为.dat文件,然后使用$readmemh函数去读取到数组中后,根据模拟的时钟信号将数据发出,下面是转bmp图片转dat文件的matlab代码:

注意:以下所有代码都是针对仿真的时候使用,且都需要替换文件名和路径!!!

clear;%从工作区中删除项目释放内存
clc;
close all;%关闭所有窗口
%main
% 1.读取图片数据
img = imread('1.bmp');
% imread函数两个参数:文件路径和读取格式
imtool(img,[]);
[h, w, ~] = size(img);      % 获取图像高度、宽度
fid = fopen('image_data.dat', 'w');
% 遍历图像数据,将其保存为十六进制形式
for i = h:-1:1              % 从底部开始for j = 1:wpixel_val = img(i,j,:);  % 获取每个像素的RGB值r = pixel_val(1);        % 红色通道g = pixel_val(2);        % 绿色通道b = pixel_val(3);        % 蓝色通道fprintf(fid, '%02X%02X%02X\n', r, g, b);  % 输出为 6 位十六进制,RGB 顺序end
end

当生成.dat文件之后,就可以直接将时序数据转换成VGA/HDMI 时序,如下所示:

module SIM_Generate_Data
#(parameter           P_CLK_PERIOD        = 5      ,    // 5nsparameter           P_RST_DURATION      = 50     ,    // 100nsparameter           P_H_MAX_CNT         = 800    ,    // 8bitparameter           P_H_SYNC            = 96     ,   parameter           P_H_FRONT           = 144    ,   //96  40 8parameter           P_V_MAX_CNT         = 525    ,   // 8bitparameter           P_V_SYNC            = 35     ,   //2  25  8parameter           P_V_FRONT           = 144    , parameter           P_SCREEN_WIDTH      = 640    ,   //96  40 8 640 8 8  = 800parameter           P_SCREEN_HEIGHT     = 480    ,   //2  25  8 480 8 2  = 525parameter           P_IMAGE_WIDTH       = 256    ,parameter           P_IMAGE_HEIGHT      = 256    ,parameter           P_BACKFROUND_COLOR  = 24'h000000
)
(   output  wire            o_clk           ,output  wire            o_rst_n         ,output  wire    [7:0]   o_r_channel     ,output  wire    [7:0]   o_g_channel     ,output  wire    [7:0]   o_b_channel     ,output  reg             o_hsync         ,output  reg             o_vsync    
);localparam      P_H_IMG_START = P_H_FRONT+P_SCREEN_WIDTH/2-P_IMAGE_WIDTH/2-1;
localparam      P_H_IMG_END   = P_H_FRONT+P_SCREEN_WIDTH/2+P_IMAGE_WIDTH/2-1;
localparam      P_V_IMG_START = P_V_FRONT+P_SCREEN_HEIGHT/2-P_IMAGE_HEIGHT/2-1;
localparam      P_V_IMG_END   = P_V_FRONT+P_SCREEN_HEIGHT/2+P_IMAGE_HEIGHT/2-1;initial beginr_clk   = 1'b0;r_rst_n = 1'b0;#(P_RST_DURATION)r_rst_n = 1'b1;
endinitial begin$readmemh("../../../../../sim_data/image_data.dat", r_image_data);$display("Tip\:last image data read from file: %h",r_image_data[P_IMAGE_WIDTH*P_IMAGE_HEIGHT-1]);
endalways #(P_CLK_PERIOD/2) r_clk = ~r_clk;reg                 r_clk           ;
reg                 r_rst_n         ;
reg     [23:0]      r_image_data  [P_IMAGE_WIDTH*P_IMAGE_HEIGHT-1:0];
reg     [15:0]      r_width_cnt     ;
reg     [15:0]      r_height_cnt    ;
reg     [7:0]       r_r_channel     ;
reg     [7:0]       r_g_channel     ;
reg     [7:0]       r_b_channel     ;
reg                 r_img_hsync     ;
reg                 r_img_vsync     ;
reg     [15:0]      r_h_cnt         ;
reg     [15:0]      r_v_cnt         ;
reg     [15:0]      r_total_cnt     ;
reg     [7:0]       or_r_channel    ;
reg     [7:0]       or_g_channel    ;
reg     [7:0]       or_b_channel    ;
reg     [7:0]       or_r_channel_1d ;
reg     [7:0]       or_g_channel_1d ;
reg     [7:0]       or_b_channel_1d ;assign  o_clk       =   r_clk        ;
assign  o_rst_n     =   r_rst_n      ;
assign  o_r_channel =   or_r_channel_1d;
assign  o_g_channel =   or_g_channel_1d;
assign  o_b_channel =   or_b_channel_1d;always @(posedge r_clk) beginif (!r_rst_n) begino_hsync <= 1'b0;o_vsync <= 1'b0;end else begino_hsync <= r_hsync;o_vsync <= r_vsync;end
end//gererate r_hsync,r_vsync
always @(posedge r_clk,negedge r_rst_n) beginif(!r_rst_n)r_h_cnt <= 16'd0;else if(r_h_cnt == P_H_MAX_CNT-1) r_h_cnt <= 16'd0;elser_h_cnt <= r_h_cnt + 16'd1;
endalways @(posedge r_clk,negedge r_rst_n) beginif(!r_rst_n)r_v_cnt <= 16'd0;else if(r_v_cnt == P_V_MAX_CNT-1 && r_h_cnt == P_H_MAX_CNT-1) r_v_cnt <= 16'd0;else if(r_h_cnt == P_H_MAX_CNT-1)r_v_cnt <= r_v_cnt + 16'd1;elser_v_cnt <= r_v_cnt;
endalways @(posedge r_clk,negedge r_rst_n) beginif(!r_rst_n)r_img_hsync <= 1'b0;else if(r_h_cnt < P_H_SYNC)r_img_hsync <= 1'b1;elser_img_hsync <= 1'b0;
end
always @(posedge r_clk , negedge r_rst_n) beginif(!r_rst_n)beginr_vsync <= 1'b0;end else if(r_v_cnt >P_V_IMG_START && r_v_cnt <= P_V_IMG_END)beginr_vsync <= 1'b1;end else beginr_vsync <= 1'b0;end
endalways @(posedge r_clk,negedge r_rst_n) beginif(!r_rst_n)r_img_vsync <= 1'b0;else if(r_v_cnt < P_V_SYNC)r_img_vsync <= 1'b1;elser_img_vsync <= 1'b0;
endalways @(posedge r_clk,negedge r_rst_n) beginif(!r_rst_n)beginr_width_cnt <= 16'd0;r_height_cnt <= 16'd0;r_r_channel <= 8'd0;r_g_channel <= 8'd0;r_b_channel <= 8'd0;end else if(r_h_cnt > P_H_IMG_START && r_h_cnt <= P_H_IMG_END && r_v_cnt > P_V_IMG_START && r_v_cnt <= P_V_IMG_END)begin  //show image datar_r_channel <= r_image_data[r_width_cnt+r_height_cnt*P_IMAGE_WIDTH][23:16];r_g_channel <= r_image_data[r_width_cnt+r_height_cnt*P_IMAGE_WIDTH][15:8];r_b_channel <= r_image_data[r_width_cnt+r_height_cnt*P_IMAGE_WIDTH][7:0];r_width_cnt <= r_width_cnt + 16'd1;if(r_h_cnt == P_H_IMG_END )r_height_cnt = r_height_cnt + 16'd1;elser_height_cnt = r_height_cnt;end else if(r_h_cnt > P_H_FRONT-1 && r_h_cnt < (P_H_FRONT+P_SCREEN_WIDTH) && r_v_cnt > P_V_FRONT-1 && r_v_cnt < (P_V_FRONT+P_SCREEN_HEIGHT))begin  //show background color)beginr_r_channel <= P_BACKFROUND_COLOR[23:16];r_g_channel <= P_BACKFROUND_COLOR[15:8];r_b_channel <= P_BACKFROUND_COLOR[7:0];endelse beginr_width_cnt <= 16'd0;r_r_channel <= 8'd0;r_g_channel <= 8'd0;r_b_channel <= 8'd0;end
end//actully generated image data output
always @(posedge r_clk,negedge r_rst_n) beginif(!r_rst_n)beginor_r_channel <= 8'd0;or_g_channel <= 8'd0;or_b_channel <= 8'd0;r_hsync <= 1'b0;end else if(r_h_cnt > P_H_IMG_START && r_h_cnt <= P_H_IMG_END && r_v_cnt > P_V_IMG_START && r_v_cnt <= P_V_IMG_END)begin  //show image datar_hsync <= 1'b1;or_r_channel <= r_image_data[r_width_cnt+r_height_cnt*P_IMAGE_WIDTH][23:16];or_g_channel <= r_image_data[r_width_cnt+r_height_cnt*P_IMAGE_WIDTH][15:8];or_b_channel <= r_image_data[r_width_cnt+r_height_cnt*P_IMAGE_WIDTH][7:0];end else beginr_hsync <= 1'b0;or_r_channel <= 8'd0;or_g_channel <= 8'd0;or_b_channel <= 8'd0;end
endalways @(posedge r_clk,negedge r_rst_n) beginif(!r_rst_n)beginor_r_channel_1d <= 8'd0;or_g_channel_1d <= 8'd0;or_b_channel_1d <= 8'd0;end else beginor_r_channel_1d <= or_r_channel;or_g_channel_1d <= or_g_channel;or_b_channel_1d <= or_b_channel;end
endalways @(posedge r_clk,negedge r_rst_n) beginif(!r_rst_n)beginr_total_cnt <= 16'd0;end else if(!r_vsync)r_total_cnt <= 16'd0;else if(r_hsync && r_vsync)r_total_cnt <= r_total_cnt + 16'd1;elser_total_cnt <= r_total_cnt;
end
endmodule

3.将VGA时序转成BMP 图片

在转的时候,同时生成了.dat文件,如果生成的bmp不对,可以查看对应的.dat与原.dat文件的差异,也可以直接比较生成的BMP文件差异。

在这里插入图片描述

module SIM_output_image_TB
#(parameter                   P_DATA_WIDTH = 8    ,parameter                   P_IMG_WIDTH  = 256  ,parameter                   P_IMG_HEIGHT = 256
)
(input                       i_clk    ,input                       i_rst_n  ,input                       i_h_sync ,input                       i_v_sync ,input  [P_DATA_WIDTH-1:0]   i_data  
);// 定义输入信号
reg                             ri_h_sync       ,ri_v_sync       ;
reg         [P_DATA_WIDTH-1:0]  ri_data         ;
wire                            w_valid_signal  ;assign w_valid_signal = ri_h_sync && ri_v_sync  ;always @(posedge i_clk or negedge i_rst_n) beginif (!i_rst_n) beginri_h_sync <= 'd0;ri_v_sync <= 'd0;ri_data   <= 'd0;end else beginri_h_sync <= i_h_sync;ri_v_sync <= i_v_sync;ri_data   <= i_data  ;end
end/*--------------大端模式转小端模式----------------*/
//bmp采取的是小端模式
function [31:0] big_convert_little_endian(input   [31:0] fi_data 
);
beginbig_convert_little_endian[7:0]   = fi_data[31:24] ;big_convert_little_endian[15:8]  = fi_data[23:16] ;big_convert_little_endian[23:16] = fi_data[15:8]  ;big_convert_little_endian[31:24] = fi_data[7:0]   ;
end
endfunction
/*--------------宽度4字节对齐----------------*/
/*
在 BMP 文件中,图像数据的每一行必须是 4 字节对齐的,这意味着每行的数据大小必须是 4 的倍数。如果图像的每行像素数据没有达到 4 字节的倍数,就需要在每行的末尾添加一些填充字节,使其达到 4 字节的倍数
*/
function [31:0] f_image_width_align(input [31:0] fi_image_width
);if(fi_image_width>0)beginf_image_width_align = fi_image_width + (4-((fi_image_width * 3) % 4))%4;end else$display("image_width is less than or equal to zero!");
endfunction/*--------------bmp文件写入----------------*/
task bmp_file_write(input   integer  ti_fp,input   [23:0]   ti_image_data
);begin$fwrite(ti_fp, "%c%c%c", ti_image_data[7:0],ti_image_data[15:8],ti_image_data[23:16]);end
endtask
/*--------------bmp文件关闭----------------*/
task bmp_file_close(input   integer  fp
);begin$fclose(fp);$display("BMP file already closed!");end
endtask/*--------------bmp文件末尾补0----------------*/
task bmp_paddings_zero(input   integer  ti_fp      ,input   integer  ti_zero_num
);integer i;
beginif(ti_zero_num>0)beginfor (i=0;i<ti_zero_num;i=i+1) begin$fwrite(ti_fp,"%c",0);  // 填充字节endend
end
endtask
/*--------------建立bmp文件----------------*/
task bmp_file_create(input   integer         ti_image_width       ,input   integer         ti_image_height      ,output  reg     [31:0]  to_real_row_width ,output  integer         o_fp  
);reg [7:0]   bmp_header [53:0]; // bmp文件头reg [31:0]  binary_file_size ; // 文件大小reg [31:0]  little_endian_width,little_endian_height; // 宽度转为小端模式integer     i;beginto_real_row_width = f_image_width_align(ti_image_width); // 真实行宽$display("image_width = %03d,real_image_width = %03d",ti_image_width,to_real_row_width);little_endian_width  =  big_convert_little_endian(to_real_row_width); // 宽度转为小端模式little_endian_height =  big_convert_little_endian(ti_image_height);   // 宽度转为小端模式binary_file_size = big_convert_little_endian(to_real_row_width*3*ti_image_height + 54);/*--------------bmp文件头(14bytes)---------------*///标识符:2 字节 ("BM")bmp_header[0]   = 8'h42;bmp_header[1]   = 8'h4d;// 文件大小:4 字节bmp_header[2]   = binary_file_size[31:24]; //因为前面大端转小端的已经转了,所以这里直接赋值bmp_header[3]   = binary_file_size[23:16];bmp_header[4]   = binary_file_size[15:8] ;bmp_header[5]   = binary_file_size[7:0]  ;// 保留位:4 字节(通常为 0)bmp_header[6]   = 8'h00;bmp_header[7]   = 8'h00;bmp_header[8]   = 8'h00;bmp_header[9]   = 8'h00;// 像素数据的偏移量:4 字节bmp_header[10]  = 8'h36;bmp_header[11]  = 8'h00;bmp_header[12]  = 8'h00;bmp_header[13]  = 8'h00;/*--------------bmp信息头(40bytes)---------------*///信息头大小:4 字节(通常为 40)bmp_header[14]  = 8'h28;bmp_header[15]  = 8'h00;bmp_header[16]  = 8'h00;bmp_header[17]  = 8'h00;// 图像宽度:4 字节bmp_header[18]  = little_endian_width[31:24];bmp_header[19]  = little_endian_width[23:16];bmp_header[20]  = little_endian_width[15:8] ;bmp_header[21]  = little_endian_width[7:0]  ;// 图像高度:4 字节bmp_header[22]  = little_endian_height[31:24];bmp_header[23]  = little_endian_height[23:16];bmp_header[24]  = little_endian_height[15:8] ;bmp_header[25]  = little_endian_height[7:0]  ;// 颜色平面数:2 字节(必须为 1)bmp_header[26]  = 8'h01;bmp_header[27]  = 8'h0;// 每像素位数:2 字节(例如 24 位表示 RGB)bmp_header[28]  = 8'h18;bmp_header[29]  = 8'h0;// 压缩方式:4 字节(0 表示不压缩)bmp_header[30]  = 8'h0;bmp_header[31]  = 8'h0;bmp_header[32]  = 8'h0;bmp_header[33]  = 8'h0;// 图像数据大小:4 字节bmp_header[34]  = 8'h0;bmp_header[35]  = 8'h0;bmp_header[36]  = 8'h0;bmp_header[37]  = 8'h0;// 水平方向分辨率:4 字节bmp_header[38]  = 8'h0;bmp_header[39]  = 8'h0;bmp_header[40]  = 8'h0;bmp_header[41]  = 8'h0;// 垂直方向分辨率:4 字节bmp_header[42]  = 8'h0;bmp_header[43]  = 8'h0;bmp_header[44]  = 8'h0;bmp_header[45]  = 8'h0;// 使用的颜色数:4 字节(0 表示使用所有颜色)bmp_header[46]  = 8'h0;bmp_header[47]  = 8'h0;bmp_header[48]  = 8'h0;bmp_header[49]  = 8'h0;// 重要的颜色数:4 字节(0 表示所有颜色都重要)bmp_header[50]  = 8'h0;  bmp_header[51]  = 8'h0;bmp_header[52]  = 8'h0;bmp_header[53]  = 8'h0;//打开文件o_fp = $fopen("../../../../../sim_data/result.bmp", "w");if(o_fp!= 0)begin$display("width:%d,height:%d",ti_image_width,ti_image_height);for (i = 0;i <= 53 ;i = i + 1) begin$fwrite(o_fp,"%c",bmp_header[i]);endend else$display("Error opening result.bmp file!\n");end
endtask/*--------------建立输出dot文件指针,方便后续写入数据----------------*/
task output_create_dot_file(output      integer to_fp
);
beginto_fp = $fopen("../../../../../sim_data/output.dat", "w"); if (to_fp == 0)$display("Error creating dot file!\n");else$display("Dot file created successfully!\n");
end
endtask/*--------------根据.dat文件指针,持续写入数据----------------*/
task output_write_dot_file(input   integer     ti_fp,input   [23:0]      ti_data 
);
beginif(ti_fp!= 0) begin$fwrite(ti_fp,"%04X\n",ti_data);$display("Expected uppercase hex output: %04X", ti_data);endelse$display("Error writing dot file!\n");
end
endtask/*--------------根据.dat文件指针,关闭----------------*/
task output_close_dot_file(input   integer     ti_fp
);
beginif (ti_fp != 0) begin$display("Closing dot file: %d", ti_fp);$fclose(ti_fp);end else begin$display("Error closing dot file: Invalid file pointer");end
end
endtask// 定义输出信号
integer bmp_file    ; // 文件指针
integer dot_file    ; // 文件指针
integer real_width  ;
integer w, h        ; // 当前像素坐标
integer i, j        ; // 循环变量
// 存储像素数据
reg [23:0] image_data [0:P_IMG_WIDTH*P_IMG_HEIGHT-1]; // 24位色,每个像素3字节// 初始化仿真信号
initial begini = 0;j = 0;bmp_file_create(P_IMG_WIDTH, P_IMG_HEIGHT, real_width, bmp_file); // 创建BMP文件,写入bmp文件头output_create_dot_file(dot_file); // 创建输出文件
end
// 仿真结束时写入图像数据
always @(posedge i_clk or negedge i_rst_n) beginif (!i_rst_n) beginw <= 0;h <= 0;  // 从左下角开始填充end else if (w_valid_signal) begin// 存储像素数据,8位输入拼接为24位RGB数据image_data[h * P_IMG_WIDTH + w] <= {ri_data, ri_data, ri_data};$display("h:%04d, w:%04d, data:%04X", h, w, {ri_data, ri_data, ri_data});output_write_dot_file(dot_file,{ri_data, ri_data, ri_data});// 坐标递增if (w == P_IMG_WIDTH - 1) beginw <= 0;if (h == P_IMG_HEIGHT - 1) beginh <= 0;output_close_dot_file(dot_file);  // 关闭输出的对比文件文件// 当图像数据全部写入时,输出 BMP 文件for (i = 0; i < P_IMG_HEIGHT; i = i + 1) beginfor (j = 0; j < P_IMG_WIDTH; j = j + 1) beginbmp_file_write(bmp_file, image_data[i * P_IMG_WIDTH + j]);// 行填充部分 0bmp_paddings_zero(bmp_file, real_width - P_IMG_WIDTH);endendbmp_file_close(bmp_file);#10; $finish;  // 仿真结束end elseh <= h + 1;  // 填充下一行end else w <= w + 1;  // 填充下一列end
end
endmodule

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【运维资料】网络监控运维管理解决方案(PPT原件完整版)

构建一体化运维监控平台的核心策略涵盖了几个关键维度&#xff0c;旨在打造一个高效、灵活且稳定的系统管理体系。首要任务是确立清晰的监控目标&#xff0c;这要求深入理解业务需求&#xff0c;确保监控范围覆盖关键性能指标、服务状态及潜在风险点。随后&#xff0c;整合现有…

Qt Model/View之代理

概念 与模型-视图-控制器模式不同&#xff0c;模型/视图设计没有包含一个完全独立的组件来管理与用户的交互。通常&#xff0c;视图负责向用户展示模型数据&#xff0c;并负责处理用户输入。为了在获取输入的方式上具有一定的灵活性&#xff0c;交互由委托执行。这些组件提供输…

C++---内存管理

1 C/C内存分布 栈区&#xff1a;由编译器自动分配和释放&#xff0c;存放运行时候的局部变量&#xff0c;函数参数&#xff0c;返回数据&#xff0c;返回地址。 堆区&#xff1a;一般由程序员自己分配&#xff0c;然后自己释放&#xff0c;例如栈的实现malloc开辟的数组空间。…

中秋假期用向日葵,临时工作需求远程控制随时解决

不知你是否在这美好时刻赏月看灯&#xff1f;有没有收到公司发的月饼呢&#xff1f; 在如今这个讲究降本增效的时代&#xff0c;仪式感早已变得稀少。公司发的月饼还没拆开&#xff0c;新消息就已弹出在公司群里。 此刻心里仿佛有万马奔腾&#xff0c;但很快又如湖水般平静&am…

拒绝千篇一律,AI帮你定制独一无二的个人写真

每个女人都渴望展现最美的自己&#xff0c;你是否厌倦了拍出千篇一律的照片&#xff1f;今天&#xff0c;我要告诉你一个秘密&#xff0c;用简单三步&#xff0c;即可打造属于你的独一无二个人写真&#xff01;文生图、蒙版换脸、图生图&#xff0c;三步化身超级模特&#xff0…

基于TRIZ的救援机器人轻量化设计

在救援机器人设计中&#xff0c;轻量化是一个至关重要的目标&#xff0c;它直接关系到机器人的便携性、运输效率以及在复杂环境中的作业能力。TRIZ理论为我们提供了一套系统化的工具和方法&#xff0c;用于解决设计过程中遇到的各种挑战&#xff0c;特别是在实现轻量化目标时&a…

初识爬虫4

1.理解代理ip&#xff0c;正向代理和反向代理 2.代理ip分类&#xff0c;根据匿名度分类&#xff1a;透明&#xff0c;匿名&#xff0c;高匿 3.防止频繁向同一个域名发送请求被封ip,需使用代理ip # -*- coding: utf-8 -*- import requestsurl https://www.baidu.comproxies {…

从关键新闻和最新技术看AI行业发展(第三十一期2024.8.26-9.8) |【WeThinkIn老实人报】

写在前面 【WeThinkIn老实人报】旨在挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对其中的关键信息进行解读&#xff0c;力求让读者们能从容掌握AI科技潮流。 欢迎大家关注Rocky的公众号&#xff1a;WeThinkIn 欢迎大家关注Rocky的知乎&#xff1a;Rocky Ding AIGC算…

微型导轨加工环境需避免的隐患!

微型导轨是一种小巧精密的线性定位解决方案&#xff0c;其高速度、低噪音的特点使得它在现代制造业中扮演着越来越重要的角色。而微型导轨对于加工环境的要求主要体现在以下几个方面&#xff1a; 1、温度控制&#xff1a;加工环境需要保持在适宜的温度范围内&#xff0c;过高或…

一分钟教你 全平台隔空投送文件 LoaclSend保姆级教程

主要内容 什么是LoaclSend 详细步骤 1.下载LoaclSend 2.使用MoleSDN 异地访问 3.一切就绪&#xff0c;打开LocalSend 发送文件 什么是LoaclSend 一款开源的文件传输工具&#xff0c;旨在提供简单、安全、快速的本地文件传输。 LocalSend可以免费使用且无需注册登录&…

音视频直播应用场景探讨之RTMP推流还是GB28181接入?

技术背景 好多开发者跟我们沟通音视频解决方案的时候&#xff0c;不清楚什么时候用RTMP推送模块&#xff0c;什么时候用GB28181设备接入模块&#xff0c;也不清楚二者差异化。实际上&#xff0c;RTMP推流和GB28181接入模块&#xff0c;在很多方面存在差异&#xff0c;如应用领…

个人学习笔记7-5:动手学深度学习pytorch版-李沐

#人工智能# #深度学习# #语义分割# #计算机视觉# #神经网络# 计算机视觉 13.10 转置卷积 例如&#xff0c;卷积层和汇聚层&#xff0c;通常会减少下采样输入图像的空间维度&#xff08;高和宽&#xff09;。然而如果输入和输出图像的空间维度相同&#xff0c;在以像素级分类…

【MPC】无人机模型预测控制复现Data-Driven MPC for Quadrotors项目(Part 1)

无人机模型预测控制复现Data-Driven MPC for Quadrotors项目 参考链接背景和问题方法与贡献实验结果安装ROS创建工作空间下载RotorS仿真器源码和依赖创建Python虚拟环境下载data_driven_mpc仓库代码下载并配置ACADO求解器下载并配置ACADO求解器的Python接口下载并配置rpg_quadr…

智能智造和工业软件研发平台SCSAI功能介绍

用爱编程30年&#xff0c;倾心打造工业和智能智造软件研发平台SCIOT,用创新的方案、大幅的让利和极致的营销&#xff0c;致力于为10000家的中小企业实现数字化转型&#xff0c;打造数字化企业和智能工厂&#xff0c;点击上边蓝色字体&#xff0c;关注“AI智造AI编程”或文末扫码…

union和union all的区别,别再傻傻分不清楚了!

union和union all的区别 一、 显示结果不同二、对重复结果的处理不同三、对排序的处理不同四、测试验证1.创建user表并插入测试数据2.通过union关联查询&#xff0c;发现结果自动去重3.通过union all关联查询&#xff0c;发现结果查询所有&#xff0c;并未去重 一、 显示结果不…

记录开发一个英语听力训练网站

背景 在当前全球经济衰退的背景下&#xff0c;IT相关的工作在国内的竞争也是越来越激烈&#xff0c;为了能够获得更多的可能性&#xff0c;英语的学习也许能为程序员打开一扇新的窗户&#xff0c;比如很多远程的工作尤其是国际化背景的工作团队&#xff0c;英语的协作沟通是必…

pdf怎么加页码?5种pdf添加页码指南分享,快来领取!

如何在一个包含大量页面的大型pdf文件中快速找到特定的页面或信息呢&#xff1f;最简便的方法就是为pdf添加页码。pdf添加页码能够清晰显示页面顺序&#xff0c;帮助读者轻松浏览大型pdf文档&#xff0c;同时也便于寻找特定章节和确定整体长度。然而&#xff0c;并非所有pdf文件…

【LeetCode】每日一题 2024_9_14 从字符串中移除星号(模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 今天的题目曾经的我做过了 . . . 又是复习的一天 题目&#xff1a;从字符串中移除星号 代码与解题思路 func removeStars(s string) string {// 本题的核心&#xff1a;生成的输入保证总是可以执行题面中…

【大数据】MapReduce的“内存增强版”——Spark

【大数据】MapReduce的“内存增强版”——Spark 文章脉络 Spark架构 Spark-core SparkConf 和 SparkContext RDD Spark集群 Spark-sql 在大数据时代&#xff0c;数据处理和分析成为企业竞争的重要手段。Hadoop作为大数据处理的基石&#xff0c;其核心组件MapReduce在众多…

完结马哥教育SRE课程--就业篇

文章目录 一、Linux基础入门1.Linux基本架构2.什么是shell3.执行命令4.Shell中的两类命令5.常见命令6.输出信息echo7.tab键补全8.获取帮助 二、文件管理和IO重定向1.文件系统目录结构2.文件系统目录功能3.linux下的文件类型4.文件操作命令5.文件状态stat6.确定文件内容7.文件通…