VGA项目:联合精简帧+双fifo+sobel算法 实现VGA显示

news2024/9/24 21:28:35

前言:该项目实际上是在很多基础的小练习上合成起来的,例如涉及到uart(rs232)的数据传输、双fifo流水线操作、VGA图像显示,本次内容在此基础上又增添了sobel算法,能实现图像的边沿监测并VGA显示。

文章目录

  • 1.项目描述
  • 2.sobel算法解析:
  • 3.模块结构示意图:
  • 4.sobel_ctrl模块设计
    • 4.1波形设计
    • 4.2代码
  • 5.VGA_shift模块设计
    • 5.1 显示效果示意图:
    • 5.2 简易波形示意图:
    • 5.3 代码
  • 6.uart_rx模块设计(直接用之前的设计 略)
  • 7.顶层设计
  • 8.最终的显示效果:

在这里插入图片描述

1.项目描述

通过串口助手把 200 行 x200 列数据传入 FPGA,对应三行三列的九个数进行 sobel算法,把边缘检测的结果(198x198的数据)通过 vga 来显示,用两种颜色来区分是否是边界点(边界用白色显示,其他用黑色)。

2.sobel算法解析:

在这里插入图片描述

  1. 把图像每三行三列的数据分别乘上算子中对应位置的值再相加。然后进行如下运算,得到相应方向(x 和 y)的 Dx 和 Dy。
    Dx=(a3-a1)+(b3-b1)*2+c3-c1;
    Dy=(a1-c1)+(a2-c2)*2+a3-c3;

  2. 对上面求得的 Dx 和 Dy 做平方和的平方根,再取近似值 Dx 和 Dy 的绝对值的和得到 Dxy:

在这里插入图片描述

  1. 如果 Dxy 的值大于一个阈值(这个阈值是多次尝试试出来的,本次项目中设置为5),表示该点为边界点,就让 VGA 显示一个白点,否则显示黑点。

  2. 把计算的结果通过 vga 显示,显示器会把是边界点的以白色像素显示,不是边界点的以黑色像素点显示,于是得到了一幅图像的轮廓

在这里插入图片描述

3.模块结构示意图:

在这里插入图片描述

其中:
uart_rx模块在:手写一个uart协议——rs232
sobel_ctrl模块的核心是双fifo的流水线操作參考(需在此基础上进行改动):双fifo流水线操作
VGA_shift模块參考(原移动框为200x200这里变成198x198,且添加了ram方便rgb图像的存储与读取):VGA接口驱动与图像显示动态移动

4.sobel_ctrl模块设计

4.1波形设计

在这里插入图片描述

4.2代码

module sobel_ctrl(
    input wire clk,
    input wire rst,
    input wire [7:0] rx_data,
    input wire pi_flag,
    output reg [7:0] rgb,
    output reg po_flag
    );
reg[9:0] cnt_col,cnt_row;
reg wr_en1_r,wr_en2_r;
wire wr_en1,wr_en2;

reg [7:0] data_in1_r;
wire [7:0] data_in1;
wire [7:0] dout1,dout2;

reg [7:0] dout1_t,dout1_tt,dout2_t,dout2_tt;
reg [7:0] rx_data_t,rx_data_tt;
reg rd_en_r;
wire rd_en;

reg shift_flag;

reg flag_d;

reg [7:0] Dx,Dy;

reg flag_abs,flag_dxy,flag_rgb;
reg [7:0] abs_dx,abs_dy;
reg [7:0] dxy;

parameter COL_MUX=199;
parameter ROW_MUX=199;
parameter VALUR=5;  //不断调试得到一个合适的阈值

// cnt_col
always @(posedge clk) begin 
    if(rst==1'b1) begin
        cnt_col <= 'd0;
    end 
    else if (pi_flag==1'b1 && cnt_col==COL_MUX) begin
         cnt_col<='d0;
    end
    else if (pi_flag==1'b1) begin
         cnt_col<=cnt_col+1'b1;
    end
end

// cnt_row
always @(posedge clk) begin 
    if(rst==1'b1) begin
        cnt_row <= 'd0;
    end
    else if (cnt_row==ROW_MUX && pi_flag==1'b1 && cnt_col==COL_MUX) begin
        cnt_row<='d0;
    end
    else if (pi_flag==1'b1 && cnt_col==COL_MUX) begin
       cnt_row<=cnt_row+1'b1;
    end
end

// wr_en1_r
assign wr_en1=wr_en1_r;
always @(posedge clk) begin 
    if(rst==1'b1) begin
        wr_en1_r <= 'd0;
    end
    else if (cnt_row=='d0) begin
        wr_en1_r<=pi_flag;
    end
    else if (cnt_row>'d1 && cnt_row<ROW_MUX) begin
        wr_en1_r<=shift_flag;
    end
end

// wr_en2_r
assign wr_en2=wr_en2_r;
always @(posedge clk) begin 
    if(rst==1'b1) begin
        wr_en2_r <= 'd0;
    end 
    else if (cnt_row>'d0 && cnt_row<ROW_MUX) begin
        wr_en2_r<=pi_flag;
    end
    else
        wr_en2_r<='d0;
end

// data_in1_r
assign data_in1=data_in1_r;
always @(posedge clk) begin 
    if(rst==1'b1) begin
         data_in1_r<= 'd0;
    end 
    else if (cnt_row=='d0) begin
        data_in1_r<=rx_data;
    end
    else if (cnt_row>'d1 && cnt_row<ROW_MUX) begin
       data_in1_r<=dout2;
    end
end

// rd_en_r
assign rd_en=rd_en_r;

always @(posedge clk) begin 
    if(rst==1'b1) begin
         rd_en_r<= 'd0;
    end 
    else if (cnt_row>'d1) begin
        rd_en_r<=pi_flag;
    end
    else 
        rd_en_r<='d0;
end

// shift_flag
always @(posedge clk) begin 
    if(rst==1'b1) begin
        shift_flag <= 'd0;
    end 
    else
        shift_flag<=rd_en_r;
end

// dout1_t,dout1_tt,dout2_t,dout2_tt,rx_data_t,rx_data_tt
always @(posedge clk) begin 
	if (shift_flag==1'b1) begin
		{dout1_tt,dout1_t}={dout1,dout1_t};
		{dout2_tt,dout2_t}={dout2,dout2_t};
		{rx_data_tt,rx_data_t}={rx_data_t,rx_data};
	end
end

always @(posedge clk) begin 
	if(rst==1'b1) begin
		flag_d <= 'd0;
	end 
	else if (cnt_row>=2 && cnt_col>2) begin
		flag_d<=rd_en_r;
	end
end

always @(posedge clk) begin 
	if(rst==1'b1) begin
		Dx <= 'd0;
		Dy <= 'd0;
	end 
	else if (flag_d==1'b1) begin
		Dx<=(dout1_tt-dout1)+(dout2_tt-dout2)<<1+(rx_data_tt-rx_data);
		Dy<=(dout1_tt-rx_data_tt)+(dout1_t-rx_data_t)<<1+(dout1-rx_data);
	end
	
end

always @(posedge clk) begin 
	if (rst==1'b1) begin
		flag_abs<='d0;
		flag_dxy<='d0;
		flag_rgb<='d0;
		po_flag<='d0;

	end
	else
		{po_flag,flag_rgb,flag_dxy,flag_abs}<={flag_rgb,flag_dxy,flag_abs,flag_d};
end

// abs_dx
always @(posedge clk) begin 
	if(rst==1'b1) begin
		 abs_dx<='d0;
	end 
	else if (flag_abs==1'b1 ) begin
		if (dx[7]==1'b1) begin
			abs_dx<=(~Dx)+1'b1;
		end
		else
			abs_dx<=Dx;
	end
end

// abs_dy
always @(posedge clk) begin 
	if(rst==1'b1) begin
		abs_dy <= 'd0;
	end 
	else if (flag_abs==1'b1) begin
		if (dy[7]==1'b1) begin
			abs_dy<=(~Dy)+1'b1;
		end
		else 
			abs_dy<=Dy;
	end
end

// dxy
always @(posedge clk) begin 
	if(rst==1'b1) begin
		 dxy<= 'd0;
	end 
	else if (flag_dxy==1'b1) begin
		dxy<=abs_dx+abs_dy;
	end
end

// rgb
always @(posedge clk) begin 
	if(rst==1'b1) begin
		rgb <= 'd0;
	end 
	else if (flag_rgb==1'b1) begin
		if (dxy>VALUR) begin
			rgb<=8'hff;
		end
		else
			rgb<=8'h00;
	end
end


sfifo_8X256 sfifo1_8X256 (
  .clk(clk),      // input wire clk
  .din(data_in1),      // input wire [7 : 0] din
  .wr_en(wr_en1),  // input wire wr_en
  .rd_en(rd_en),  // input wire rd_en
  .dout(dout1),    // output wire [7 : 0] dout
  .full(),    // output wire full
  .empty()  // output wire empty
);


sfifo_8X256 sfifo2_8X256 (
 .clk(clk),      // input wire clk
  .din(rx_data),      // input wire [7 : 0] din
  .wr_en(wr_en2),  // input wire wr_en
  .rd_en(rd_en),  // input wire rd_en_r
  .dout(dout2),    // output wire [7 : 0] dout
  .full(),    // output wire full
  .empty()  // output wire empty
);
endmodule

5.VGA_shift模块设计

5.1 显示效果示意图:

在这里插入图片描述

5.2 简易波形示意图:

在这里插入图片描述

5.3 代码

module vga_shift(
    input wire sclk,//50mhz
    input wire clk_25,
    input wire rst,
    input wire [7:0] rgb_in,
    input wire pi_flag,
    output reg hsync,
    output reg vsync,
    output reg [7:0] rgb
    );

parameter HSYNC_END=95;
parameter CNT_H_END=799;

parameter VSYNC_END=1;
parameter CNT_V_END=524;

parameter RED=8'b11100000;
parameter GREEN=8'b00011100;
parameter BLUE=8'b00000011;
parameter WHITE=8'b11111111;

parameter ADDR_MUX=16'd39203;
reg [9:0] cnt_h;
reg [9:0] cnt_v;

reg [8:0] x;
reg [8:0] y;

reg flag_x;
reg flag_y;

reg [15:0] addra,addrb;
wire [7:0] doutb;

  // cnt_h
  always @(posedge clk_25) begin 
       if(rst==1'b1) begin
            cnt_h<= 'd0;
       end 
       else if (cnt_h==CNT_H_END) begin
           cnt_h<='d0;
       end
       else 
            cnt_h<=cnt_h+1'b1;
   end 

// hsync
   always @(posedge clk_25) begin 
       if(rst==1'b1) begin
            hsync<= 'd1;
       end
       else if (cnt_h==CNT_H_END) begin
           hsync<='d1;
       end 
       else if (cnt_h==HSYNC_END) begin
           hsync<='d0;
       end
   end

// cnt_v
always @(posedge clk_25) begin 
    if(rst==1'b1) begin
        cnt_v <= 'd0;
    end 
    else if (cnt_v==CNT_V_END && cnt_h==CNT_H_END) begin
        cnt_v<='d0;
    end
    else if (cnt_h==CNT_H_END) begin
        cnt_v<=cnt_v+1'b1;
    end
end

// vsync
always @(posedge clk_25) begin
    if(rst==1'b1) begin
        vsync <= 'd1;
    end 
    else if (cnt_v==VSYNC_END && cnt_h==CNT_H_END) begin
        vsync<='d0;
    end
    else if (cnt_v==CNT_V_END && cnt_h==CNT_H_END) begin
        vsync<='d1;
    end
   
end
// x
always @(posedge clk_25) begin 
	if(rst==1'b1) begin
		x <= 'd0;
	end 
	else if (cnt_h==CNT_H_END && cnt_v==CNT_V_END && flag_x=='d0) begin
		x<=x+1'b1;
	end
	else if (cnt_h==CNT_H_END && cnt_v==CNT_V_END && flag_x=='d1) begin
		x<=x-1'b1;
	end
end

// flag_x
always @(posedge clk_25) begin 
	if(rst==1'b1) begin
		 flag_x<= 'd0;
	end 
	else if (cnt_h==CNT_H_END && cnt_v==CNT_V_END && x=='d441 && flag_x=='d0) begin
		flag_x<='d1;
	end
	else if (cnt_h==CNT_H_END && cnt_v==CNT_V_END && x=='d1 && flag_x=='d1) begin
		flag_x<='d0;
	end
end

//y
always @(posedge clk_25) begin 
	if(rst==1'b1) begin
		 y<= 'd0;
	end 
	else if (cnt_h==CNT_H_END && cnt_v==CNT_V_END && flag_y=='d0) begin
		y<=y+1'b1;
	end 
	else if (cnt_h==CNT_H_END && cnt_v==CNT_V_END && flag_y=='d1) begin
		y<=y-1'b1;
	end
end

// flag_y
always @(posedge clk_25) begin 
	if(rst==1'b1) begin
		flag_y <= 'd0;
	end 
	else if (cnt_h==CNT_H_END && cnt_v==CNT_V_END && y=='d281 && flag_y<='d0) begin
		flag_y<='d1;
	end
	else if (cnt_h==CNT_H_END && cnt_v==CNT_V_END && y=='d1 && flag_y<='d1) begin
		flag_y<='d0;
	end
end

// rgb 
always @(posedge clk_25) begin 
    if(rst=='b1) begin
         rgb<= 'd0;
    end
    //注意198x198像素时,白框范围需要改变
    else if (cnt_h>=144+x && cnt_h<=341+x && cnt_v>=35+y && cnt_v<=232+y) begin
    	rgb<=doutb;
    end
    else if (cnt_h>=144 && cnt_h<=783) begin
        if (cnt_v>=35 && cnt_v<=194) begin
            rgb<=RED;
        end
        else if (cnt_v>=195 && cnt_v<=354) begin
            rgb<=GREEN;
        end
        else if (cnt_v>=355 && cnt_v<=514) begin
            rgb<=BLUE;
        end
    end 
    else
        rgb<='d0;
    
end


// addra  这里注意写ram的时钟为50mhz,读ram的时钟为25mhz(VGA的时钟)
always @(posedge sclk) begin 
  if(rst) begin
     addra<= 'd0;
  end
  else if (pi_flag==1'b1 && addra==ADDR_MUX) begin
    addra<='d0;
  end
  else if (pi_flag==1'b1) begin
    addra<=addra+1'b1;
  end 

end

// addrb 注意ram读数据相对于读地址有一拍延迟,所以地址要早一拍给出
always @(posedge clk_25) begin 
  if(rst==1'b1) begin
    addrb <= 'd0;
  end 
  else if (cnt_h>=144+x-1 && cnt_h<=341+x-1 && cnt_v>=35+y && cnt_v<=232+y && addrb==ADDR_MUX) begin
    addrb<='d0;
  end
  else if (cnt_h>=144+x-1 && cnt_h<=341+x-1 && cnt_v>=35+y && cnt_v<=232+y) begin
    addrb<=addrb+1'b1;
  end
end


asblk_mem_8x198x198 your_instance_name (
  .clka(sclk),    // input wire clka
  .wea(pi_flag),      // input wire [0 : 0] wea
  .addra(addra),  // input wire [15 : 0] addra
  .dina(rgb_in),    // input wire [7 : 0] dina
  .clkb(clk_25),    // input wire clkb
  .addrb(addrb),  // input wire [15 : 0] addrb
  .doutb(doutb)  // output wire [7 : 0] doutb
);

endmodule

6.uart_rx模块设计(直接用之前的设计 略)

7.顶层设计

module top_sobel(
	input wire clk,//50mhz
	input wire rst,
	input wire rx,
	output wire vsync,
	output wire hsync,
	output wire [7:0]rgb
    );


wire clk_out25;
wire clk_out50;

wire rx_data;
wire pi_flag_rx_to_sobel;
wire pi_flag_sobel_to_vga;

wire [7:0] rgb_in;

 clk_wiz_gen25 instance_name
   (
    // Clock out ports
    .clk_out50(clk_out50),     // output clk_out50
    .clk_out25(clk_out25),     // output clk_out25
   // Clock in ports
    .clk_in50(clk));      // input clk_in50
	uart_rx inst_uart_rx (
			.clk     (clk_out50),
			.rst     (rst),
			.rx      (rx),
			.po_data (rx_data),
			.po_flag (pi_flag_rx_to_sobel)
		);
	sobel_ctrl  inst_sobel_ctrl (
			.clk     (clk_out50),
			.rst     (rst),
			.rx_data (rx_data),
			.pi_flag (pi_flag_rx_to_sobel),
			.rgb     (rgb_in),
			.po_flag (pi_flag_sobel_to_vga)
		);
	vga_shift inst_vga_shift (
			.sclk    (clk_out50),
			.clk_25  (clk_out25),
			.rst     (rst),
			.rgb_in  (rgb_in),
			.pi_flag (pi_flag_sobel_to_vga),
			.hsync   (hsync),
			.vsync   (vsync),
			.rgb     (rgb)
		);


endmodule

8.最终的显示效果:

上位机通过MATLAB处理,用友善助手下发原图像数据:

在这里插入图片描述
经过一系列图像处理后,最终在vga的显示效果:
在这里插入图片描述

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

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

相关文章

算法学习007-进制转换 c++递归算法实现 中小学算法思维学习 信奥算法解析

目录 C进制转换 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C进制转换 一、题目要求 1、编程实现 小明学c有一段时间了&#xff0c;今天他想做一个进制转换的小程序&#xff0c;将十进…

如何省下5000培训费学会月薪8000的嵌入式Linux?

嵌入式底层开发无疑是一项极为关键的技术&#xff0c;它在众多嵌入式系统中都有着广泛而重要的应用。在当今科技飞速发展的时代&#xff0c;嵌入式系统已经深入到我们生活的每一个角落&#xff0c;成为了我们日常生活中不可或缺的一部分&#xff0c;这也更加凸显了嵌入式开发的…

【Linux极简教程】常见实用命令不断更新中......

【Linux极简教程】常见实用命令不断更新中...... 常见问题1.Waiting for cache lock: Could not get lock /var/lib/dpkg/lock. It is held by process xxxx(dpkg) 常见问题 1.Waiting for cache lock: Could not get lock /var/lib/dpkg/lock. It is held by process xxxx(dp…

关于图形库

文章目录 1. 概念介绍2. 使用方法2.1 普通路由2.2 命名路由 3. 示例代码4. 内容总结 我们在上一章回中介绍了"使用get显示Dialog"相关的内容&#xff0c;本章回中将介绍使用get进行路由管理.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

stm32单片机开发五、使用I2C连接MPU6050

10轴就是3轴加速度、3轴角速度、3轴磁场强度和1个气压强度 任何一种传感器都不能获得精确且稳定的欧拉角&#xff0c;要想获得精确且稳定的欧拉角&#xff0c;就必须进行数据融合&#xff0c;把这几种传感器的数据结合起来&#xff0c;常见的数据融合算法&#xff0c;一般有互补…

可编程 IP 新星 Story Protocol 何以引领链上文艺复兴浪潮?

当前&#xff0c;随着 Web3 行业发展进入全新阶段&#xff0c;与生成式人工智能&#xff08;AIGC&#xff09;技术融合正在创造潜力新星项目。也是目前的互联网生态下&#xff0c;任何普通民众都有权利创作高质量的音乐、艺术、散文和视频内容&#xff0c;带来了用户生成内容&a…

Verilog中求两个数的差值

根据输入信号a,b的大小关系&#xff0c;求解两个数的差值&#xff1a;输入信号a,b为8bit位宽的无符号数。如果a>b&#xff0c;则输出a-b&#xff0c;如果a≤b&#xff0c;则输出b-a。 接口信号图如下&#xff1a; 代码如下&#xff1a; &#xff08;CSDN代码块不支持Veril…

去斯洛文尼亚旅游最有趣的徒步路线推荐

春天当然要去徒步呀&#xff01;斯洛文尼亚的徒步和登山小径纵横交错&#xff0c;遍布全国&#xff0c;尽管很多人首先想到的是高山地区连绵起伏的山峰&#xff0c;但实际上&#xff0c;在其他地区也有许多值得游览的徒步目的地。 ​ 这些低地地区的徒步路线将带你穿过如画的风…

【小行星数据预处理py-】

#数据的导入 import pandas as pd import numpy as np#导入EXCEL表格数据;na_values指定了将Excel文件中的空单元格转换为NaN df_excelpd.read_excel(C:/Users/galax/Desktop/MBA小行星数据/4000.xls,na_values0) #定义0为缺失值 see_datadf_excel #统计每一列的缺失值个数 pri…

可代替IRS2003的半桥栅极驱动器KP85211A 225V耐压 1A/1.5A

KP85211A是一款 225V 耐压&#xff0c;具有 1A 拉电流和 1.5A 灌电流能力的半桥栅极驱动器&#xff0c;专用于驱动功率MOSFET或IGBT。采用高压器件工艺技术&#xff0c;具有良好的电流输出及出色的抗瞬态干扰能力。可保证开关节点 VS 瞬态 -7V 情况下系统正常工作。可支持开关节…

Leetcode—706. 设计哈希映射【简单】(constexpr)

2024每日刷题&#xff08;127&#xff09; Leetcode—706. 设计哈希映射 数组实现代码 class MyHashMap { public:MyHashMap() {memset(arr, -1, sizeof(arr));}void put(int key, int value) {arr[key] value;}int get(int key) {if(arr[key] -1) {return -1;} return arr…

基于openEuler22.03 LTS环境的docker容器基础

一、说明 本文配置环境为VMware虚拟机或华为云服务器&#xff08;4核CPU&#xff0c;8 GB内存&#xff0c;40GB磁盘&#xff09;&#xff0c;OS为openEuler 22.03 LTS &#xff0c;Linux服务器要求能联网。 二、安装docker 2.1 安装docker软件包 [rootnode01 ~]# dnf -y in…

leetcode尊享面试——二叉树(python)

250.统计同值子树 使用dfs深度搜索&#xff0c;同值子树&#xff0c;要满足三个条件&#xff1a; 对于当前节点node&#xff0c;他的左子树血脉纯净&#xff08;为同值子树&#xff09;&#xff0c;右子树血脉纯净&#xff08;为同值子树&#xff09;&#xff0c;node的值等于…

第27章-配置PPP

1. 概述 2. 工作机制 3. 验证 4. PPP-MP 1. 概述 1.1 背景引入 以太网使用双绞线&#xff0c;广域网使用光纤&#xff1b; ① 定义&#xff1a;PPP协议即点到点协议&#xff1b; ② 应用场景&#xff1a;在串行线路上运行&#xff1b;主要是广域网 ③ 特点&#xff1a; 支持…

PHP 框架安全:ThinkPHP 序列 漏洞测试.

什么是 ThinkPHP 框架. ThinkPHP 是一个流行的国内 PHP 框架&#xff0c;它提供了一套完整的安全措施来帮助开发者构建安全可靠的 web 应用程序。ThinkPHP 本身不断更新和改进&#xff0c;以应对新的安全威胁和漏洞。 ThinkPHP 框架的安全特性&#xff1a; (1) 输入过滤和验证…

既能自动仿写公众号爆文,还能批量帮你上架闲鱼商品,打造自己的数字员工,简直yyds

「想象一下&#xff0c;如果有一个机器人在你的计算机上24小时不间断地工作&#xff0c;会不会做梦都笑着」 一、RPA机器人是什么&#xff1f; RPA——机器人流程自动化&#xff0c;它可以帮助人们完成重复性的、繁琐的工作&#xff0c;比如数据输入、网页爬取、自动化流程等…

[JUCE]从一个有关右值引用的bug,探幽移动语义

一、问题 当我尝试在\JUCE\extras\WindowsDLL\Builds\VisualStudio2022目录下编译JUCE库的时候&#xff0c;提示报错如下&#xff1a; 报错提示如下&#xff1a; 这里涉及到两个问题 一、这个std::move是干嘛用的 二、为什么这里会报错&#xff1f; 另外&#xff0c;我在实…

OpenAI 也要做搜索?传 SearchGPT 将迎击谷歌核心业务!OpenAI 与金融时报新协议已定,将进行链接和引用

OpenAI也要杀入AI搜索领域分一杯羹&#xff1f;非常可能&#xff01;毕竟连SearchGPT的入口已经准备好了&#xff01; 图片 X平台上网友甚至还发现了SearchGPT的medo视频&#xff01; OpenAI凭借自身的技术积累&#xff0c;如果真的进入搜索应用业务&#xff0c;必然…

震撼来袭!AI创新燃爆2024中关村论坛,唯迈医疗破解心脑血管“命门”危机

4月29日&#xff0c;备受瞩目的2024中关村论坛圆满闭幕。国内领先的介入诊疗全流程解决方案企业——唯迈医疗&#xff0c;携新一代Taikon太空 DSA和介入手术机器人惊艳亮相&#xff0c;以AI赋能介入诊疗&#xff0c;为心脑血管疾病治疗带来了革命性的突破&#xff0c;引发党央媒…

最新优质电商API接口,附带教程【多语言环境高并发】

给大家更新一波24年一月份的新接口吧。 01 接口信息 线路推荐: 多仓&#xff1a; 1.春盈&#xff1a; https://wds.ecsxs.com/230989.json 2.无意&#xff1a; http://www.wya6.cn/tv/yc.json 3.主流电商平台API数据采集 单仓&#xff1a; 1.饭太硬&#xff1a; http:/…