ZYNQ图像处理(4)——灰度图像转二值化图像

2023-05-16

1、二值化图像简介

前面已经完成了摄像头图像的采集和显示,以及RGB图像转灰度图。二值化图像在图像处理领域同样有广泛的应用,本节介绍如何用FPGA实现灰度转二值化图形。灰度实现二值化的原理很简单,只需要设置一个阈值,将每个像素的灰度和阈值比较,大于阈值就输出255,小于阈值就输出0。
在这里插入图片描述

2、二值化图像matlab仿真

这边简单添加了二值化的matlab代码,代码如下图所示。

clc;
clear all;

img_rgb=imread('dog.png');

%high and width
h=size(img_rgb,1);
w=size(img_rgb,2);

%rgb dog show
subplot(231);
imshow(img_rgb);
title('rgb dog');

% Relized method 2:myself Algorithm realized
% Y = ( R*77 + G*150 + B*29) >>8
% Cb = (-R*44 - G*84 + B*128) >>8
% Cr = ( R*128 - G*108 - B*20) >>8
img_rgb=double(img_rgb);
img_y=zeros(h,w);
img_u=zeros(h,w);
img_v=zeros(h,w);
for i = 1 : h
    for j = 1 : w
        img_y(i,j) = bitshift(( img_rgb(i,j,1)*77 + img_rgb(i,j,2)*150 + img_rgb(i,j,3)*29),-8);
        img_u(i,j) = bitshift((-img_rgb(i,j,1)*44 - img_rgb(i,j,2)*84 + img_rgb(i,j,3)*128 + 32678),-8);
        img_v(i,j) = bitshift(( img_rgb(i,j,1)*128 - img_rgb(i,j,2)*108 - img_rgb(i,j,3)*20 + 32678),-8);
    end
end
img_y = uint8(img_y); 
img_u = uint8(img_u); 
img_v = uint8(img_v); 

% gray to bin
% greater then threshold:1 
% smaller than threshold:0
img_bin=zeros(h,w);
img_bin1=zeros(h,w);
THRESHOLD_DATA=80;
THRESHOLD_DATA1=120;
for i=1:h
    for j=1:w
        if(img_y(i,j)>THRESHOLD_DATA)
            img_bin(i,j)=255;
        else
            img_bin(i,j)=0;
        end
        if(img_y(i,j)>THRESHOLD_DATA1)
            img_bin1(i,j)=255;
        else
            img_bin1(i,j)=0;
        end
    end
end

%dog show
subplot(232);
imshow(img_y);
title('gray dog');
subplot(233);
imshow(img_u);
title('u dog');
subplot(234);
imshow(img_v);
title('v dog');
subplot(235);
imshow(img_bin);
title('bin dog');
subplot(236);
imshow(img_bin1);
title('bin1 dog');

最后得到的图像如下图所示。可以看到第五张和第六张图像识二值化后的狗子,第五张图像的阈值是80,第六张图像的阈值是120,可以发现阈值对二值化影响很大,实际应用中应该合理选择阈值。
在这里插入图片描述

3、二值化图像FPGA实现

这边编写了gray2bin文件代码来实现灰度到二值化的一个转换,相对应的代码非常简单,如下图所示。

module gray2bin(
    input pclk,
    input rst_n,
    input [23:0] gray_data,
    input gray_data_vaild,
    input gray_clk_en,
    input gray_vsync,

    output wire [23:0] bin_data,
    output wire bin_data_vaild,
    output wire bin_clk_en,
    output wire bin_vsync
);

parameter  THRESHOLD_DATA = 8'd120;

wire [7:0] gray_data0;
reg bin_data0;
reg bin_data_vaild0;
reg bin_clk_en0;
reg bin_vsync0;

assign gray_data0=gray_data[23:16];
assign bin_data_vaild=bin_data_vaild0;
assign bin_clk_en=bin_clk_en0;
assign bin_vsync=bin_vsync0;
assign bin_data={24{bin_data0}};

//Binarization
always @(posedge pclk or negedge rst_n) begin
    if(~rst_n)begin
      bin_data0<=1'b0;
    end
    else if(gray_data0>THRESHOLD_DATA)begin
      bin_data0<=1'b1;
    end
    else bin_data0<=1'b0;
end

//delay 1 tclk
always @(posedge pclk or negedge rst_n) begin
    if(~rst_n)begin
      bin_data_vaild0<=1'b0;
      bin_clk_en0<=1'b0;
      bin_vsync0<=1'b0;
    end
    else begin
      bin_data_vaild0<=gray_data_vaild;
      bin_clk_en0<=gray_clk_en;
      bin_vsync0<=gray_vsync;
    end
end

endmodule

之后我们将它添加到bd中,完成连线如下图所示,因为工程后面连线都一样,所以只截取了前半部分。
在这里插入图片描述
最后导出硬件到sdk进行程序烧写即可查看效果如下图所示。可以发现,二值化受到环境光的影响很严重,不同图像的阈值也不同。
在这里插入图片描述
最后将gray2bin这个模块打包成ip核,如下图所示。我们将ip核替换进去后进行连线,最后同样可以得到二值化的图像。
在这里插入图片描述
在这里插入图片描述

4、ps端控制pl端图像的阈值

虽然在bd图里面可以改变图像的阈值后重新生成bit流,但每次改变阈值就得重新生成硬件,这个过程很繁琐也不方便。想到ZYNQ是带有arm核的,这里便打算封装一个带有axi4接口的二值化ip核,实现ps端对pl端的控制。接下来介绍带有axi接口的二值化模块。
(1)首先第一步是选择tool,选择打包ip,选择打包一个axi4接口的。
在这里插入图片描述
(2)之后是填写ip的相关信息,分别是ip名字、ip版本、ip显示名字、ip描述和ip路径。
在这里插入图片描述
(3)下一个是设置axi接口的相关信息,包括名字、类型、主从模式、位宽以及寄存器个数。
在这里插入图片描述
(4)之后将ip添加到工程中
在这里插入图片描述
(5)在ip catalog中找到刚刚的ip,右键选择编辑ip核edit in ip packager
在这里插入图片描述
(6)接下来就是比较关键的步骤,这个ip工程自动建立好了之后,会看到生成了这两个.v文件,我们还需要添加一个gray2bin的文件。全部添加好之后如下图所示。
在这里插入图片描述
在这里插入图片描述
(7)然后是更改接口和例化代码,我这边就之久放代码了,不做过多讲解。


`timescale 1 ns / 1 ps

	module axi_gray2bin_v1_0 #
	(
		// Users to add parameters here

		// User parameters ends
		// Do not modify the parameters beyond this line


		// Parameters of Axi Slave Bus Interface S00_AXI
		parameter integer C_S00_AXI_DATA_WIDTH	= 32,
		parameter integer C_S00_AXI_ADDR_WIDTH	= 4
	)
	(
		// Users to add ports here
		input pclk,
		input rst_n,
		input [23:0] gray_data,
		input gray_data_vaild,
		input gray_clk_en,
		input gray_vsync,

		output wire [23:0] bin_data,
		output wire bin_data_vaild,
		output wire bin_clk_en,
		output wire bin_vsync,
		// User ports ends
		// Do not modify the ports beyond this line


		// Ports of Axi Slave Bus Interface S00_AXI
		input wire  s00_axi_aclk,
		input wire  s00_axi_aresetn,
		input wire [C_S00_AXI_ADDR_WIDTH-1 : 0] s00_axi_awaddr,
		input wire [2 : 0] s00_axi_awprot,
		input wire  s00_axi_awvalid,
		output wire  s00_axi_awready,
		input wire [C_S00_AXI_DATA_WIDTH-1 : 0] s00_axi_wdata,
		input wire [(C_S00_AXI_DATA_WIDTH/8)-1 : 0] s00_axi_wstrb,
		input wire  s00_axi_wvalid,
		output wire  s00_axi_wready,
		output wire [1 : 0] s00_axi_bresp,
		output wire  s00_axi_bvalid,
		input wire  s00_axi_bready,
		input wire [C_S00_AXI_ADDR_WIDTH-1 : 0] s00_axi_araddr,
		input wire [2 : 0] s00_axi_arprot,
		input wire  s00_axi_arvalid,
		output wire  s00_axi_arready,
		output wire [C_S00_AXI_DATA_WIDTH-1 : 0] s00_axi_rdata,
		output wire [1 : 0] s00_axi_rresp,
		output wire  s00_axi_rvalid,
		input wire  s00_axi_rready
	);
// Instantiation of Axi Bus Interface S00_AXI
	axi_gray2bin_v1_0_S00_AXI # ( 
		.C_S_AXI_DATA_WIDTH(C_S00_AXI_DATA_WIDTH),
		.C_S_AXI_ADDR_WIDTH(C_S00_AXI_ADDR_WIDTH)
	) axi_gray2bin_v1_0_S00_AXI_inst (
		.pclk            ( pclk            ),
		.rst_n           ( rst_n           ),
		.gray_data       ( gray_data       ),
		.gray_data_vaild ( gray_data_vaild ),
		.gray_clk_en     ( gray_clk_en     ),
		.gray_vsync      ( gray_vsync      ),
		.bin_data        ( bin_data        ),
		.bin_data_vaild  ( bin_data_vaild  ),
		.bin_clk_en      ( bin_clk_en      ),
		.bin_vsync       ( bin_vsync       ),
		.S_AXI_ACLK(s00_axi_aclk),
		.S_AXI_ARESETN(s00_axi_aresetn),
		.S_AXI_AWADDR(s00_axi_awaddr),
		.S_AXI_AWPROT(s00_axi_awprot),
		.S_AXI_AWVALID(s00_axi_awvalid),
		.S_AXI_AWREADY(s00_axi_awready),
		.S_AXI_WDATA(s00_axi_wdata),
		.S_AXI_WSTRB(s00_axi_wstrb),
		.S_AXI_WVALID(s00_axi_wvalid),
		.S_AXI_WREADY(s00_axi_wready),
		.S_AXI_BRESP(s00_axi_bresp),
		.S_AXI_BVALID(s00_axi_bvalid),
		.S_AXI_BREADY(s00_axi_bready),
		.S_AXI_ARADDR(s00_axi_araddr),
		.S_AXI_ARPROT(s00_axi_arprot),
		.S_AXI_ARVALID(s00_axi_arvalid),
		.S_AXI_ARREADY(s00_axi_arready),
		.S_AXI_RDATA(s00_axi_rdata),
		.S_AXI_RRESP(s00_axi_rresp),
		.S_AXI_RVALID(s00_axi_rvalid),
		.S_AXI_RREADY(s00_axi_rready)
	);

	// Add user logic here

	// User logic ends

	endmodule


`timescale 1 ns / 1 ps

	module axi_gray2bin_v1_0_S00_AXI #
	(
		// Users to add parameters here

		// User parameters ends
		// Do not modify the parameters beyond this line

		// Width of S_AXI data bus
		parameter integer C_S_AXI_DATA_WIDTH	= 32,
		// Width of S_AXI address bus
		parameter integer C_S_AXI_ADDR_WIDTH	= 4
	)
	(
		// Users to add ports here
		input pclk,
		input rst_n,
		input [23:0] gray_data,
		input gray_data_vaild,
		input gray_clk_en,
		input gray_vsync,

		output wire [23:0] bin_data,
		output wire bin_data_vaild,
		output wire bin_clk_en,
		output wire bin_vsync,
		// User ports ends
		// Do not modify the ports beyond this line

		// Global Clock Signal
		input wire  S_AXI_ACLK,
		// Global Reset Signal. This Signal is Active LOW
		input wire  S_AXI_ARESETN,
		// Write address (issued by master, acceped by Slave)
		input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_AWADDR,
		// Write channel Protection type. This signal indicates the
    		// privilege and security level of the transaction, and whether
    		// the transaction is a data access or an instruction access.
		input wire [2 : 0] S_AXI_AWPROT,
		// Write address valid. This signal indicates that the master signaling
    		// valid write address and control information.
		input wire  S_AXI_AWVALID,
		// Write address ready. This signal indicates that the slave is ready
    		// to accept an address and associated control signals.
		output wire  S_AXI_AWREADY,
		// Write data (issued by master, acceped by Slave) 
		input wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_WDATA,
		// Write strobes. This signal indicates which byte lanes hold
    		// valid data. There is one write strobe bit for each eight
    		// bits of the write data bus.    
		input wire [(C_S_AXI_DATA_WIDTH/8)-1 : 0] S_AXI_WSTRB,
		// Write valid. This signal indicates that valid write
    		// data and strobes are available.
		input wire  S_AXI_WVALID,
		// Write ready. This signal indicates that the slave
    		// can accept the write data.
		output wire  S_AXI_WREADY,
		// Write response. This signal indicates the status
    		// of the write transaction.
		output wire [1 : 0] S_AXI_BRESP,
		// Write response valid. This signal indicates that the channel
    		// is signaling a valid write response.
		output wire  S_AXI_BVALID,
		// Response ready. This signal indicates that the master
    		// can accept a write response.
		input wire  S_AXI_BREADY,
		// Read address (issued by master, acceped by Slave)
		input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_ARADDR,
		// Protection type. This signal indicates the privilege
    		// and security level of the transaction, and whether the
    		// transaction is a data access or an instruction access.
		input wire [2 : 0] S_AXI_ARPROT,
		// Read address valid. This signal indicates that the channel
    		// is signaling valid read address and control information.
		input wire  S_AXI_ARVALID,
		// Read address ready. This signal indicates that the slave is
    		// ready to accept an address and associated control signals.
		output wire  S_AXI_ARREADY,
		// Read data (issued by slave)
		output wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_RDATA,
		// Read response. This signal indicates the status of the
    		// read transfer.
		output wire [1 : 0] S_AXI_RRESP,
		// Read valid. This signal indicates that the channel is
    		// signaling the required read data.
		output wire  S_AXI_RVALID,
		// Read ready. This signal indicates that the master can
    		// accept the read data and response information.
		input wire  S_AXI_RREADY
	);

	(中间省略部分代码,不需要做更改)

	// Add user logic here
	gray2bin u_gray2bin(
		.pclk            ( pclk            ),
		.rst_n           ( rst_n           ),
		.gray_data       ( gray_data       ),
		.gray_data_vaild ( gray_data_vaild ),
		.gray_clk_en     ( gray_clk_en     ),
		.gray_vsync      ( gray_vsync      ),
		.threshold_data  ( slv_reg3[7:0]   ),
		.bin_data        ( bin_data        ),
		.bin_data_vaild  ( bin_data_vaild  ),
		.bin_clk_en      ( bin_clk_en      ),
		.bin_vsync       ( bin_vsync       )
	);


	// User logic ends

	endmodule

module gray2bin(
    input pclk,
    input rst_n,
    input [23:0] gray_data,
    input gray_data_vaild,
    input gray_clk_en,
    input gray_vsync,
    input [7:0] threshold_data,

    output wire [23:0] bin_data,
    output wire bin_data_vaild,
    output wire bin_clk_en,
    output wire bin_vsync
);

wire [7:0] gray_data0;
reg bin_data0;
reg bin_data_vaild0;
reg bin_clk_en0;
reg bin_vsync0;

assign gray_data0=gray_data[23:16];
assign bin_data_vaild=bin_data_vaild0;
assign bin_clk_en=bin_clk_en0;
assign bin_vsync=bin_vsync0;
assign bin_data={24{bin_data0}};

//Binarization
always @(posedge pclk or negedge rst_n) begin
    if(~rst_n)begin
      bin_data0<=1'b0;
    end
    else if(gray_data0>threshold_data)begin
      bin_data0<=1'b1;
    end
    else bin_data0<=1'b0;
end

//delay 1 tclk
always @(posedge pclk or negedge rst_n) begin
    if(~rst_n)begin
      bin_data_vaild0<=1'b0;
      bin_clk_en0<=1'b0;
      bin_vsync0<=1'b0;
    end
    else begin
      bin_data_vaild0<=gray_data_vaild;
      bin_clk_en0<=gray_clk_en;
      bin_vsync0<=gray_vsync;
    end
end

endmodule

(8)修改好了代码之后,就是对接口进行一个定义和封装,主要包含了AXI接口、灰度输入接口、二值输出接口、时钟接口、灰度和二值的时钟有效信号。之后就打包ip核。
在这里插入图片描述
(9)这就是最终打包之后的带有axi接口的灰度转二值化模块了。
在这里插入图片描述
(10)将其加入到block design模块中,进行连线得到最终的bd图。然后生成比特流导出硬件即可进行sdk设计。
在这里插入图片描述

5、ps端控制pl端图像阈值的软件设计

前面已经得到了带有axi接口的灰度转二值ip核axi_gray2bin。并且设计好了硬件电路。在sdk中新建工程并且添加如下的代码,代码很简单,主要是调用了vivado帮我们生成的读写寄存器函数,对阈值进行读写就可以了。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "xil_types.h"
#include "xil_cache.h"
#include "xil_io.h"
#include "xparameters.h"
#include "xaxivdma.h"
#include "xaxivdma_i.h"
#include "vdma_api/vdma_api.h"
#include "axi_gray2bin.h"
#include "sleep.h"

//宏定义
#define VDMA_ID         XPAR_AXIVDMA_0_DEVICE_ID
#define HEIGHT			768
#define WIDTH			1024
#define GRAY2BIN_ADDR   XPAR_AXI_GRAY2BIN_0_S00_AXI_BASEADDR
#define REG0_OFFSET		AXI_GRAY2BIN_S00_AXI_SLV_REG0_OFFSET
#define REG1_OFFSET     AXI_GRAY2BIN_S00_AXI_SLV_REG1_OFFSET
#define REG2_OFFSET		AXI_GRAY2BIN_S00_AXI_SLV_REG2_OFFSET
#define REG3_OFFSET		AXI_GRAY2BIN_S00_AXI_SLV_REG3_OFFSET
//frame buffer的起始地址
unsigned int const frame_buffer_addr =0x03000000;
//驱动实例
XAxiVdma     vdma;



int main(void)
{
	int status;
	//配置阈值
	AXI_GRAY2BIN_mWriteReg(GRAY2BIN_ADDR, REG3_OFFSET, 0x00000084);
	sleep(1);
	//配置VDMA
	run_vdma_frame_buffer(&vdma, VDMA_ID,WIDTH,HEIGHT,frame_buffer_addr,0,0,BOTH);
	status=AXI_GRAY2BIN_mReadReg(GRAY2BIN_ADDR, REG3_OFFSET);
	printf("the threshold data is: %d\r\n",status);
    return 0;
}

这边测试了下阈值对相同环境同一图像的影响,如下图所示。
在这里插入图片描述
(阈值116)
在这里插入图片描述
(阈值132)
在这里插入图片描述
(阈值148)

6、总结

到此为止,摄像头+hdmi显示的环境搭建完成,然后一些基本的图像处理包括RGB2YUV、灰度转二值也做的差不多了。之后会陆续做一些图像的滤波算法、边缘检测、数字识别等。不过要先写我的小论文了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ZYNQ图像处理(4)——灰度图像转二值化图像 的相关文章

  • 固定翼无人机结构分类

    一 固定翼无人机常见的气动布局 常规布局 常规布局就是水平尾翼在主翼之后 xff0c 有一个或者两个垂危的气动布局方式 这种布局技术最成熟 xff0c 理论研究已经非常完善 xff0c 生产技术也成熟而稳定 xff0c 同其他气动布局相比各
  • 互联网笔试——服务器启动题

    某厂笔试题 xff0c 居然瞎胡做出来了 xff0c 先把不优雅得答案记录一下 第一行n xff0c p表示有n台机器 xff0c p次操作 第 i 行第一个整数 c 表示第 i 个服务所依赖的服务数量 xff0c 后面 c 个整数表示它所
  • Kubernetes的Secret和ConfigMap实践

    欢迎大家进群 xff0c 一起探讨学习 公众号 博主技术文档地址 博主开源微服架构前后端分离技术博客项目源码地址 xff0c 欢迎各位star 1 Secret Secret解决了密码 token 密钥等敏感数据的配置问题 xff0c 而不
  • 【KAWAKO】TVM-在ubuntu服务器上的安装

    目录 下载源码 安装依赖库 修改config cmake文件 编译 安装python库 添加tophub 简单验证 官方的安装教程在这里 下载源码 从Download Page中下载下来的源码是0 8版本的 xff0c 亲测该版本不可用 x
  • 【Ubuntu 无法使用ifconfig解决办法】

    Ubuntu 无法使用ifconfig解决办法 在使用ubuntu时需要使用ifconfig命令提示 Command span class token char 39 ifconfig 39 span span class token op
  • Jetson tx2刷机指南及gparted扩容全踩坑实录

    这几周试了下jetson tx2刷机 xff0c 出了很多报错 xff0c 特在此记录 本文包括tx2的大概刷机流程 xff0c 以及gparted的扩容方式 前期注意事项 1 如果能直接用ubuntu系统刷 xff0c 请一定不要用虚拟机
  • ROS 下使用codeblocks进行代码快速编辑

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 安装codeblocks二 配置ROS头库路径三 设置codeblocks为默认打开软件效果展示总结 前言 学习ROS
  • Python查看图片模式及像素

    1 以彩色图像为例 xff1a 2 代码 xff1a span class token keyword import span sys span class token keyword from span PIL span class to
  • Python统计RAF-DB数据集中各类情感类别对应的图像数

    一 统计basic部分各类情感类别对应的图像数 1 需要说明的是 xff0c RAD DB数据集对情感的标记是从1开始而非从0开始 xff0c 具体如下 xff1a 1 xff1a Surprise 2 xff1a Fear 3 xff1a
  • Eclipse中查看JAVA源代码显示SOURCE NOT FOUND解决办法

    Eclipse中查看JAVA源码显示SOURCE NOT FOUND解决办法 写代码或者看别人代码的时候总想知道引用函数的内部构造 快捷键Ctrl 43 鼠标左键快捷查看源码 xff0c 不过小白在开始使用的时候一般未关联源码 xff0c
  • QGC地面站环境搭建问题

    1 ubuntu系统环境配置 参照如下博文进行配置 https blog csdn net qq 39751352 article details 125847392 2 ubuntu系统环境 xff0c qt5 12 6 43 qgc环境
  • ros msg文件数组定义与使用

    float32 ranges 注意这里的数组使用的是无长度限制的 xff0c 也就是方扩号内没有东西 在使用的时候 xff0c 不能够直接用数组赋值那样去做 xff0c 它实际上是一个向量 xff0c 往里面填充数据应使用c 43 43 中
  • Git(七)——删除历史版本,保留当前状态

    来自 git删除历史版本 xff0c 保留当前状态 LANGKYE 博客园 1 创建并切换到lastest branch分支 git checkout orphan latest branch 2 添加所有文件 git add A 3 提交
  • JVM 1:基础知识

    目录 一 JVM从编译到执行1 Java 程序的执行过程2 JVM JRE JDK 的关系 二 JVM的跨平台与语言无关性1 跨平台2 跨语言 xff08 语言无关性 xff09 三 JVM 整体知识模块 一 JVM从编译到执行 1 Jav
  • 软件在环SIL和硬件在环PIL实现过程记录

    标题Matlab Simulink 自动代码生成 基于模型设计学习教程 NO 1 软件在环SIL和硬件在环PIL实现过程记录 在完成模型算法的过程当中 xff0c 为了验证算法的准确性 xff0c 依此为模型验证 软件在环验证 xff0c
  • pandas读取excel,遍历数据

    1 迭代数据 以键值对的形式 获取 每行的数据 df 61 pd read excel io 61 excel path 默认读取sheet 61 0的 columns 61 df columns values tolist 获取excel
  • spring jpa 懒加载出现-could not initialize proxy - no Session

    1 could not initialize proxy no Session 一对多 xff0c 多对多关系映射中 xff0c 配置的懒加载 xff0c 会出现这个错误 配置文件配置配置即可 xff1a spring jpa open i
  • python 做的request模块封装工具类

    1 python 做的request模块封装工具类 记录下 xff0c 避免以后用到 import time from requests adapters import HTTPAdapter import json import requ
  • python发送email邮件

    1 使用QQ邮箱做服务转发邮 2 使用 coding utf 8 from import res import smtplib from email mime text import MIMEText from email utils im
  • MySQL实现连表查询

    一 创建相应的表 1 xff09 创建一张学生信息的表 xff0c 包含 id xff08 自增 xff09 xff0c 学号 xff0c 姓名 xff0c 性别 xff0c 身高 xff0c 体重 xff0c 备注 CREATE TABL

随机推荐

  • 解决Eclipses下tomcat部署端口号占用和server.xml修改之后被重置无效的问题,即使修改了也会被改回来的问题

    首先介绍一下tomcat部署的常用三个方式 xff1a 直接部署到host虚拟主机管理的目录 xff0c 通过eclipse直接发布到这个目录 需要每次启动tomcat 直接在server xml下配置Context 路径 xff0c 直接
  • Linux下安装redis及遇到的问题解决

    1 Linux安装redis wget http download redis io releases redis 5 0 3 tar gz tar xzf redis 5 0 3 tar gz cd redis 5 0 3 make 启动
  • 在spring boot中使用configuration注解无法注入bean

    1 在spring boot和spring中bean注入的方式 xff0c 基于Java类配置的 xff0c 即通过configuration注解注入 xff0c 其中遇到发现在springboot中 xff0c 无法自动注入 xff0c
  • 电路学习笔记( 一)——上拉电阻(编码器电路)

    来自于编码器接口电路 Encoder1和Encoder2经过510电阻和一个上拉10k电阻后输入到最小系统中 问题在于 xff0c 为什么要接上拉电阻 之前的知识仅理解到了拉高电压一项 xff0c 但原因不明 在单片机引脚作为输入端时 xf
  • 64位系统下运行32位程序

    现象 xff1a bash make ext4fs No such file or directory 解决 xff1a 一般出现该错误是由于应用程序是 32 位导致的 xff0c 可以使用 file 命令来查看 xff1a cpp vie
  • 安装mybatisx插件失败Fail to load plugin descriptor from file MyBatis-4.02.jar

    我想大概会有人出错的 hhhh Fail to load plugin descriptor from file MyBatis 4 02 jar 只需要把jar包改为zip格式即可 这种方式是先下载好jar包 其它博客有怎么下载
  • 4、DockerFile文件的使用

    文章目录 一 DockerFile 文件1 1 DockerFile构建过程1 1 1 基础知识1 1 2 docker执行DockerFile的大致流程 1 2 Dockerfile常见的关键字1 3 自定义镜像mycentosjava8
  • git 的使用笔记 编辑工具vscode

    vscode与git对应命令 Changes 里的文件 43 会放到 Staged Changes 61 61 git add 全部修改的文件 Staged Changes 里的文件 34 34 会撤回到Changes里 61 61 git
  • 使用Python,Opencv检测AprilTag

    这篇博客将介绍AprilTags 这是一组基准标记 通常用于机器人技术 校准和3D计算机视觉项目 通常在执行实时检测时使用AprilTags 以及密切相关的ArUco标记 AprilTags是一种基准标记 更简单地说是 标记 基准点是在捕获
  • DIY 属于自己的OPENMV4, 附openmv4部分的原理图。

    很多小白想要用AD来DIYopenmv4 xff0c 拥有属于自己DIY的openmv4 但是却没有找到好的参考资料 xff0c 现总结如下所示 现在官方还在众筹 xff0c 官方的开源的资料 xff0c 也是在三月份GitHub才向大家公
  • 30道最新Linux内核大厂面试题(含答案)

    1 Linux 中主要有哪几种内核锁 xff1f Linux 的同步机制从 2 0 到 2 6 以来不断发展完善 从最初的原子操作 xff0c 到后来 的信号量 xff0c 从大内核锁到今天的自旋锁 这些同步机制的发展伴随 Linux 从单
  • 最新腾讯等大厂c/c++后端 linux开发常见面试题汇总

    计算机操作系统 xff08 Linux xff09 1 命令 xff1a netstat tcpdump ipcs ipcrm 这四个命令的熟练掌握程度基本上能体现实际开发和调试程序的经验 2 cpu 内存 硬盘 等等与系统性能调试相关的命
  • C++高性能大规模服务器开发实践

    本文摘录自腾讯高级工程师在 全球C 43 43 及系统软件技术大会 上的专题演讲 01Lego简介 首先介绍一下 CDN 非常早期的时候有一个大牛创建了一个公司叫阿卡曼 xff0c 他把服务器部署到全球各地 xff0c 然后把源站的内容缓存
  • 梯度、散度、旋度、拉普拉斯算子

    梯度 运算的对象是纯量 xff08 即标量 xff0c 只有大小 xff0c 没有方向 xff09 xff0c 运算出来的结果是向量 xff08 矢量 xff0c 既有大小 xff0c 又有方向 xff09 定义 xff1a 函数在某点的梯
  • 【VINS-Fusion-gpu在NX的部署】

    VINS Fusion gpu在NX的部署 1 移除nx中已经默认的opencv sudo apt span class token operator span get purge libopencv span class token op
  • 电机扭矩计算

    转自 xff1a http blog sina com cn s blog 521a53b001011xdl html 扭矩的定义 xff1a 垂直方向的力 到旋转中心的距离 1 电动机有一个共同的公式 xff1a P 61 M N 955
  • px4ctrl代码-fsm.process()

    主进程 初始状态为MANUAL CTRL Finite State Machine 控制系统启动 v gt 手动控制 lt gt 自动起飞
  • px4ctrl代码解读-calculateControl()

    compute u thrust and u q controller gains and other parameters are in param quadrotor msgs Px4ctrlDebug LinearControl ca
  • linux系统启动过程(面试热点)

    linux系统启动过程 启动过程总览1 内核的引导2 运行init3 系统初始化4 建立终端5 用户登录系统6 进入login shell 启动过程总览 1 内核的引导 当计算机打开电源后 xff0c 首先是BIOS开机自检 xff0c 按
  • ZYNQ图像处理(4)——灰度图像转二值化图像

    1 二值化图像简介 前面已经完成了摄像头图像的采集和显示 xff0c 以及RGB图像转灰度图 二值化图像在图像处理领域同样有广泛的应用 xff0c 本节介绍如何用FPGA实现灰度转二值化图形 灰度实现二值化的原理很简单 xff0c 只需要设