6.RGB转YCbcr

news2024/7/6 19:58:58

1.方法

RGB转灰度有很多种方式
  1.将RGB中任意分量拿出来当做灰度值。
  2.取RGB三通道的均值来当灰度值。
  3.将RGB转YUV(YCbCr)然后取Y分量作为灰度值。
  其余的几种实现方式较为简单,这里不做介绍。重点实现RGB转YCbCr。

1.1 YUV(YCbCr)格式

  Y表示亮度,U和V表示色度,用于描述影像的饱和度和色调。RGB转YUV的转换一般是色彩空间的转换。YUV主要用在模拟系统中,而YCbCr是通过YUV信号的发展,并通过校正
的主要应用在数字视频中的一种编码方法。YUV适用于PAL和SECAM彩色电视制式,而YCrCb适用于计算机用的显示器。 一般意义上 YCbCr 即为 YUV 信号,没有严格的划分。 CbCr 分别为蓝色色度分量、红色色度分量。
RGB注重人色彩的感知,YUV则注重亮度的敏感程度。
使用YUV描述图像的好处在于:
  (1)亮度(Y)与色度(U、V)是独立的;
  (2)人眼能够识别数千种不同的色彩,但只能识别20多种灰阶值,采用YUV标准可以降低数字彩色图像所需的储存容量。

1.1.1 YUV4:4:4

  YUV三个通道采样率相同,因此每个分量相互独立。通常一个分量占8bit,一个像素占3byte。

1.1.2 YUV4:2:2

  YUV三个通道采样率不同,UV分量只有Y的一半,两个UV共占用一个Y。

1.2 RGB转YCbCr公式

在这里插入图片描述
  但是由于Verilog HDL无法进行浮点运算,因此使用扩大256倍,再向右移8Bit的方式来转换公式,(0.083 = 00010101)
在这里插入图片描述

2.算法验证平台搭建

2.1 图片转txt文本

  首先将图片转化为txt文本格式方便其他模块读取。

clear ;
clc ;
close;
RGB = imread('../img/1920x1080.bmp');
imshow(RGB);
[row,col,chn] = size(RGB);
fid = fopen('../data//pre.txt','w+');
for i = 1:row
    for j = 1:col
        for k = 1:chn
            fprintf(fid,'%02x',RGB(i,j,k));
        end
        fprintf(fid,'\n');
    end
end

fclose(fid); 

2.2 txt文本数据仿真回传

2.2.1 文本读取

  这里首先读取MATLAB生成的pre.txt文本,读取txt文本的模块为img_gen3,表示读取的RGB888的数据。

`timescale 1ns / 1ps

module img_gen3
#(
 	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 	[23:0] 		data 	
);

reg 	[23:0] 	raw_array 	[ACTIVE_IW*ACTIVE_IH-1:0];

integer 	i;

initial 	begin
	for(i=0;i<ACTIVE_IW*ACTIVE_IH;i=i+1)
		raw_array[i] = 0;
end

initial begin
	$readmemh("H:/picture/Z7/lesson6/data/pre.txt",raw_array);
end

reg 	[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(index == ACTIVE_IW * ACTIVE_IH-1)
		index_de <= 1'b0;
	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_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 <= 1'b0;
	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)
	if(index_de == 1'b1)
		data <= raw_array[index];
	else 
		data <= 0;
endmodule

2.2.1 读取写入

  读取的数据在顶层写入为post.txt。

`timescale 1ns / 1ps
module tb_top(
    );

reg 	clk 	;
reg 	rst_n 	;

integer 	outfile;

initial 	begin
	clk = 0;
	rst_n = 0;
	#20
	rst_n = 1;

	outfile = $fopen("H:/picture/Z7/lesson6/data/post.txt","w");
end
always #5 clk = ~clk;

wire 	vs ;
wire 	de ;
wire 	[23:0] 	data;

img_gen3  #(
 	.ACTIVE_IW 	(1920 	),
 	.ACTIVE_IH 	(1080 	),
 	.TOTAL_IW 	(2200 	),
 	.TOTAL_IH 	(1100 	),
 	.H_START 	(100 	),
 	.V_START 	(4 		) 		
)u_img_gen3(
	.clk 	 	(clk 	 	),
	.rst_n 	 	(rst_n 	 	),
	.vs 		(vs 		),
	.de 		(de 		),
	.data 	 	(data 	 	)
);

reg 	vs_r 	;

always @(posedge clk)
	if(rst_n == 0)
		vs_r 	<= 1'b0;
	else 
		vs_r 	<= vs;

always @(posedge clk)
	if(~vs&&vs_r)
		$stop;
	else if(de == 1)
		$fdisplay(outfile,"%h\t%h\t%h",data[23:16],data[15:8],data[7:0]);
endmodule

2.2.3 MATLAB数据读取

  这里对比pre.txt和post.txt是否相等的方式有很多中,可以直接用文本对比工具,也可以用MATLAB做对比。这里只做一个txt转bmp。

clear ;
clc ;
close;
RGB = imread('../img/1920x1080.bmp');
imshow(RGB);
[row,col,chn] = size(RGB);
fid = fopen('../data//pre.txt','w+');
for i = 1:row
    for j = 1:col
        for k = 1:chn
            fprintf(fid,'%02x',RGB(i,j,k));
        end
        fprintf(fid,'\n');
    end
end
fclose(fid); 

搭建后对比pre.txt与post.txt的数据一致。可以开始验证算法了。

3 rgb2ycbcr算法实现与仿真

3.1 rgb2ycbcr算法实现

  本算法实现包括三个时钟周期,第一个时钟周期算乘法,第二个时钟周期算加减,第三个时钟周期算触发(截位)。

module	rgb2ycbcr(
	input	wire				clk				,	//系统时钟
	input	wire				rst_n			,	//复位信号
	input	wire				pre_hsync		,	//输入的场同步
	input	wire				pre_vsync		,	//输入行同步
	input	wire				pre_de			,	//数据有效信号
	input	wire	[ 7:0]		pre_r 			,	//输入像素数据
	input 	wire 	[ 7:0] 		pre_g 			,
	input 	wire 	[ 7:0] 		pre_b 			,

	output	reg 				post_hsync 		,	//输出行同步
	output	reg 				post_vsync 		,	//输出场同步
	output	reg 				post_de 		,	//输出数据有效信号
	output	reg 	[7:0]		post_y 			,	//输出y(亮度)分量
	output	reg 	[7:0]		post_cb 		,	//输出蓝色色度分量
	output	reg 	[7:0]		post_cr				//输出红色色度分量
	);
	reg 	[15:0] 	pre_r0 	;
	reg 	[15:0] 	pre_r1 	;
	reg 	[15:0] 	pre_r2 	;

	reg 	[15:0] 	pre_g0 	;
	reg 	[15:0] 	pre_g1 	;
	reg 	[15:0] 	pre_g2 	;

	reg 	[15:0] 	pre_b0 	;
	reg 	[15:0] 	pre_b1 	;
	reg 	[15:0] 	pre_b2 	;

	reg 	[15:0] 	post_y0 ;
	reg 	[15:0] 	post_cb0;	
	reg 	[15:0] 	post_cr0;

	reg 			pre_hsync_d0;
 	reg 			pre_vsync_d0;
 	reg 			pre_de_d0 	;

	reg 			pre_hsync_d1;
 	reg 			pre_vsync_d1;
 	reg 			pre_de_d1 	;

/*********************************************************
RGB888 to YCbCr
Y = 0.299R +0.587G + 0.114B
Cb = 0.568(B-Y) + 128 = -0.172R-0.339G + 0.511B + 128
CR = 0.713(R-Y) + 128 = 0.511R-0.428G -0.083B + 128

Y = (77 *R + 150*G + 29 *B)>>8
Cb = (-43*R - 85 *G + 128*B)>>8 + 128
Cr = (128*R - 107*G - 21 *B)>>8 + 128

Y = (77 *R + 150*G + 29 *B )>>8
Cb = (-43*R - 85 *G + 128*B + 32768)>>8
Cr = (128*R - 107*G - 21 *B + 32768)>>8
*********************************************************/
//计算乘法项

always @(posedge clk)begin
	if(rst_n == 0)begin
		pre_r0 	<= 	'd0;
		pre_r1 	<= 	'd0;
		pre_r2 	<= 	'd0;
	end
	else begin
		pre_r0 	<= 	pre_r *77;
		pre_r1 	<= 	pre_r *43;
		pre_r2 	<= 	pre_r *128;		
	end
end

always @(posedge clk)begin
	if(rst_n == 0)begin
		pre_g0 	<= 	'd0;
		pre_g1 	<= 	'd0;
		pre_g2 	<= 	'd0;
	end
	else begin
		pre_g0 	<= 	pre_g *150;
		pre_g1 	<= 	pre_g *85 ;
		pre_g2 	<= 	pre_g *107;		
	end
end

always @(posedge clk)begin
	if(rst_n == 0)begin
		pre_b0 	<= 	'd0;
		pre_b1 	<= 	'd0;
		pre_b2 	<= 	'd0;
	end
	else begin
		pre_b0 	<= 	pre_b *29;
		pre_b1 	<= 	pre_b *128 ;
		pre_b2 	<= 	pre_b *21;		
	end
end

//计算加减法
always @(posedge clk)begin
	if(rst_n == 0)begin
		post_y0 	<= 	0;
		post_cb0 	<= 	0;
		post_cr0 	<= 	0;
	end
	else begin
		post_y0 	<= 	 		pre_r0 + pre_g0 + pre_b0;
		post_cb0 	<= 	32768 - pre_r1 - pre_g1 + pre_b1;
		post_cr0 	<= 	32768 + pre_r2 - pre_g2 - pre_b2;
	end
end

//移位赋值
always @(posedge clk)begin
	if(rst_n == 0)begin
		post_y 	 	<= 	0;
		post_cb 	<= 	0;
		post_cr 	<= 	0;
	end
	else begin
		post_y 		<= 	post_y0 /256;
		post_cb 	<= 	post_cb0/256;
		post_cr 	<= 	post_cr0/256;
	end
end

//本次计算一共用了三个时钟周期  所以其余的信号需要打三拍出来
always @(posedge clk)begin
	if(rst_n == 0)begin
		pre_hsync_d0 	<= 	'd0;
		pre_vsync_d0 	<= 	'd0;
		pre_de_d0 	 	<= 	'd0;
		pre_hsync_d1 	<= 	'd0;
		pre_vsync_d1 	<= 	'd0;
		pre_de_d1 	 	<= 	'd0;
		post_hsync 		<= 	'd0;
		post_vsync 		<= 	'd0;
		post_de 	 	<= 	'd0;		
	end
	else begin
		pre_hsync_d0 	<= 	pre_hsync 		;
		pre_vsync_d0 	<= 	pre_vsync 		;
		pre_de_d0 	 	<= 	pre_de 	 		;
		pre_hsync_d1 	<= 	pre_hsync_d0 	;
		pre_vsync_d1 	<= 	pre_vsync_d0 	;
		pre_de_d1 	 	<= 	pre_de_d0 	 	;
		post_hsync 		<= 	pre_hsync_d1 	;
		post_vsync 		<= 	pre_vsync_d1 	;
		post_de 	 	<= 	pre_de_d1 	 	;		
	end
end

endmodule

3.2 算法仿真与验证

3.2.1 算法仿真模块

`timescale 1ns / 1ps

module tb_rgb2ycbcr();

reg 	 		clk 			;
reg 	 		rst_n 			;



reg 			pre_hsync		;
wire 			pre_vsync		;
wire 			pre_de			;
wire 	[7:0] 	pre_r 			;
wire 	[7:0] 	pre_g 			;
wire 	[7:0] 	pre_b 	 		;
wire 			post_hsync 	 	;
wire 			post_vsync 	 	;
wire 			post_de 		;
wire 	[7:0] 	post_y 		 	;
wire 	[7:0] 	post_cb 		;
wire 	[7:0] 	post_cr			;	

integer 	outfile;

always #10 clk = ~clk;
initial 	begin
	clk = 0;
	rst_n = 0;
	pre_hsync = 1;
	#200
	rst_n = 1;
	outfile = $fopen("H:/picture/Z7/lesson6/data/post.txt","w");
end

img_gen3#(
 	.ACTIVE_IW 	(1920 	),
 	.ACTIVE_IH 	(1080 	),
 	.TOTAL_IW 	(2200 	),
 	.TOTAL_IH 	(1100 	),
 	.H_START 	(100 	),
 	.V_START 	(4 		) 		
)u_img_gen3(
	.clk 	 	(clk 	 			),
	.rst_n 	 	(rst_n 	 			),
	.vs 		(pre_vsync 			),
	.de 		(pre_de 			),
	.data 	 	({pre_r,pre_g,pre_b})
);

rgb2ycbcr u1_rgb2ycbcr(
	.clk			(clk			),	//系统时钟
	.rst_n			(rst_n			),	//复位信号
	.pre_hsync		(pre_hsync		),	//输入的场同步
	.pre_vsync		(pre_vsync		),	//输入行同步
	.pre_de			(pre_de			),	//数据有效信号
	.pre_r 			(pre_r 			),	//输入像素数据
	.pre_g 			(pre_g 			),
	.pre_b 			(pre_b 			),

	.post_hsync 	(post_hsync 	),	//输出行同步
	.post_vsync 	(post_vsync 	),	//输出场同步
	.post_de 		(post_de 		),	//输出数据有效信号
	.post_y 		(post_y 		),	//输出y(亮度)分量
	.post_cb 		(post_cb 		),	//输出蓝色色度分量
	.post_cr		(post_cr		)	//输出红色色度分量
	);

reg 	vs_r 	;

always @(posedge clk)
	if(rst_n == 0)
		vs_r 	<= 1'b0;
	else 
		vs_r 	<= post_vsync;

always @(posedge clk)
	if(~post_vsync&&vs_r)
		$stop;
	else if(post_de == 1)
		$fdisplay(outfile,"%h",post_y);
endmodule

3.2.2 算法的MATLAB验证

clc;
clear all;
RGB = imread('../img/1920x1080.bmp');
[row,col,chn] = size(RGB);
RGB = double(RGB);
for i = 1:row
    for j = 1:col
        for k = 1:chn
            Y(i,j)  = (77*RGB(i,j,1)    + 150*RGB(i,j,2)    + 29*RGB(i,j,3)            )/256;
            Cb(i,j) = (-43*RGB(i,j,1)   - 85*RGB(i,j,2)     + 128*RGB(i,j,3)   +32768  )/256;
            Cr(i,j) = (128*RGB(i,j,1)   - 107*RGB(i,j,2)    - 21*RGB(i,j,3)    +32768  )/256;
        end
    end
end
matlab_Y = uint8(floor(Y));

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));

  最终MATLAB读取MolelSim的仿真数据以及MATLAN本身实现的rgb2ycbcr算法模块做对比。两者数据完全一样。
在这里插入图片描述
在这里插入图片描述

3.2.3 TXT转bmp

clear;
clc;
close all;

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');
imshow('../img/post.bmp');

在这里插入图片描述

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

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

相关文章

Web开发-Django学习笔记

客户端如何获取服务端的数据信息&#xff1f; 通常 是 HTTP网络协议&#xff0c;通过网络传输数据信息。 客户端通过HTTP协议发送请求信息给服务端&#xff0c;并从服务端接收响应信息。 Web 前端开发&#xff1a; &#xff08;HTML、CSS、JS&#xff09;文件部署在后端服务…

华为广告打包报错,问题思考

华为广告打包时报错 fata日志不一样能反映出完整的错误日志信息&#xff0c;仅看fata日志具有误导性&#xff0c;有可能指向错误的方向。 通过看完整的日志可见&#xff0c;错误的原因为 Caused by: java.lang.ClassNotFoundException: com.huawei.hms.ads.base.R$dimenfata日…

Java基础概念(二)

idea 工欲善其事&#xff0c;必先利其器&#xff0c;所以在真正编写代码之前先下载idea工具&#xff0c;idea是用于java语言开发的集成环境&#xff0c;是业界目前公认的用于Java开发最好的工具&#xff0c;把代码编写、编译、运行、调试等功能综合到一起的开发工具 下载地址…

解决npm init vue@latest证书过期问题:npm ERR! code CERT_HAS_EXPIRED

目录 一. 问题背景 二. 错误信息 三. 解决方案 3.1 临时解决办法 3.2 安全性考量 一. 问题背景 我在试图创建一个新的Vue.js项目时遇到了一个问题&#xff1a;npm init vuelatest命令出现了证书过期的错误。不过这是一个常见的问题&#xff0c;解决起来也简单。 二. 错误…

uni-app项目打包步骤和踩过的坑(一)

最近接了一个前同事留下的uni-app的项目&#xff0c;之前没有接触过&#xff0c;好在以前的工作中用到过vue做过前台开发&#xff0c;虽然时间不长&#xff0c;但是有些方面还是可以借鉴的。经过前几篇文章的介绍&#xff0c;我已经补完了后台服务代码&#xff0c;打算发布到设…

QT布局管理和空间提升为和空间间隔

QHBoxLayout&#xff1a;按照水平方向从左到右布局&#xff1b; QVBoxLayout&#xff1a;按照竖直方向从上到下布局&#xff1b; QGridLayout&#xff1a;在一个网格中进行布局&#xff0c;类似于HTML的table&#xff1b; 基本布局管理类包括&#xff1a;QBoxLayout、QGridL…

AI人像写真解决方案,满足企业多样化视觉需求

美摄科技&#xff0c;作为一家专注于人工智能技术研发与应用的高新企业&#xff0c;深知企业对于高质量、高效率视觉内容的需求&#xff0c;特推出AI人像写真解决方案&#xff0c;为企业打开全新的视觉营销通道。 我们的AI人像写真解决方案&#xff0c;基于深度学习和计算机视…

3D分割项目 | 基于Pytorch+3DUnet实现的3D体积语义分割算法

项目应用场景 用于 3D 体积语义分割场景&#xff0c;适用于各种物体的 3D 语义分割&#xff0c;比如大米、大豆的体积分割等 项目效果&#xff1a; 项目流程 > 具体参见项目内README.md (1) 安装 conda install -c conda-forge mamba mamba create -n pytorch-3dunet -c p…

第十四届蓝桥杯JavaA组省赛真题 - 互质数的个数

解题思路&#xff1a; 快速幂 欧拉函数 快速幂比较常见于数据较大的取模场景&#xff0c;欧拉函数感觉还是有点抽象 注意&#xff1a; 取模的时候就不要简写了&#xff0c;例如&#xff1a;res res * a % mod;不要写成res * a % mod; import java.util.Scanner;public c…

cesium vue 绘制标记实体(撒点),监听鼠标左击事件

添加实体 const viewer new Cesium.Viewer(cesiumContainer, {})viewer.entities.add()查看实体 const viewer new Cesium.Viewer(cesiumContainer, {}) const billboard viewer.entities.add({...})viewer.zoomTo(billboard)删除实体 根据实体删除 if (billboard.value…

ElementUI 周组件展示成月的第几周

ElementUI 周组件展示成月的第几周 组件展示 <el-date-picker unlink-panels :clearable"false" change"weekChange":editable"false" :type"dateType":value-format"valueFormat" :format"format"v-if&qu…

怎样一次性给多篇word文档标注拼音?一键批量注音

随着办公自动化的普及&#xff0c;我们经常会遇到需要处理大量Word文档的情况。在这些文档中&#xff0c;有时需要将文字标注上拼音&#xff0c;特别是在处理一些包含生僻字或需要拼音辅助阅读的文档时。然而&#xff0c;手动一篇篇地给Word文档标注拼音不仅效率低下&#xff0…

深度剖析MySQL锁:解开数据库并发控制的神秘面纱

MySQL 锁是 MySQL 数据库管理系统中为了实现并发控制和数据一致性的机制。在多用户并发访问数据库时&#xff0c;锁可以确保多个事务在对同一数据进行操作时不会相互干扰&#xff0c;以防止数据不一致的现象发生。 一、锁分类 MySQL支持多种类型的锁&#xff0c;主要包括…

DataX-Oracle新增writeMode支持update

目录 前言 第一步下载源码 第二步修改源码 1、Oraclewriter 2、WriterUtil 2.1、修改getWriteTemplate方法 2.2、新增onMergeIntoDoString与getStrings方法 3、CommonRdbmsWriter 3.1、修改startWriteWithConnection 3.2、修改doBatchInsert 3.3、修改fillPreparedStatem…

苹果应用商店上架利器:推荐几款常用的应用发布工具

摘要 移动应用app上架是开发者关注的重要环节&#xff0c;但常常会面临审核不通过等问题。为帮助开发者顺利完成上架工作&#xff0c;各种辅助工具应运而生。本文探讨移动应用app上架原理、常见辅助工具功能及其作用&#xff0c;最终指出合理使用工具的重要性。 引言 移动应…

洛谷_P1803 凌乱的yyy / 线段覆盖_python写法

P1803 凌乱的yyy / 线段覆盖 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这道题是不是用python做只能做到70分啊&#xff1f;&#xff1f; n int(input()) data [] for i in range(n):data.append(list(map(int,input().split())))data.sort(keylambda x:x[1])ans 1 mi…

Solidity Uniswap V2 Router swapTokensForExactTokens

最初的router合约实现了许多不同的交换方式。我们不会实现所有的方式&#xff0c;但我想向大家展示如何实现倒置交换&#xff1a;用未知量的输入Token交换精确量的输出代币。这是一个有趣的用例&#xff0c;可能并不常用&#xff0c;但仍有可能实现。 GitHub - XuHugo/solidit…

景联文科技高质量大模型训练数据汇总!

3月25日&#xff0c;2024年中国发展高层论坛年会上&#xff0c;国家数据局局长刘烈宏在“释放数据要素价值&#xff0c;助力可持续发展”的演讲中表示&#xff0c;中国10亿参数规模以上的大模型数量已超100个。 当前&#xff0c;国内AI大模型发展仍面临诸多困境。其中&#xff…

批量剪辑视频,批量调整片头片尾时长,批量剪辑更高效!

在视频剪辑的世界里&#xff0c;有时候我们需要对视频的片头片尾进行精细调整&#xff0c;以适应不同的需求和创意。然而&#xff0c;传统的视频剪辑软件往往操作繁琐&#xff0c;效率低下&#xff0c;让人望而却步。今天&#xff0c;我要为您介绍一种全新的批量剪辑方式&#…

一个传入省市区ID的级联框

省市区ID 功能edit页面(主要)script逻辑如何拿到当前级联下所有ID数组长ID数组是如何回显的 (1)长ID数组是如何回显的 (2) 功能 选择第一层传第一层下的所有 id 数组&#xff0c;选择第二层传递第二层以及第二层下的所有 id 数组 edit页面(主要) 编辑页的一个 Table&#xff0c…