【OpenCV入门】第一部分——图像处理基础

本文结构

  • 图像处理的基本操作
    • 读取图像
      • imread()
    • 显示图像
      • imshow()
      • waitKey()
      • destroyAllWindows()
    • 保存图像
      • imwrite()
    • 复制图像
      • copy()
    • 获取图像属性
  • 像素
    • 确定像素的位置
    • 获取像素的BGR值
    • 修改像素的BGR值
  • 色彩空间
    • GRAY色彩空间
      • cvtColor()——从BGR色彩空间转换到GRAY色彩空间
    • HSV色彩空间
      • 从BGR色彩空间转换到HSV色彩空间
  • 通道
    • 拆分通道
      • 拆分一幅BGR图像中的通道
      • 拆分一幅HSV图像中的通道
    • 合并通道
    • 综合运用拆分通道和合并通道
    • alpha通道

图像处理的基本操作

图像处理包括4个基本操作:读取图像显示图像保存图像获取图像属性

读取图像

imread()

image = cv2.imread(filename,flags)
  • filename:目标图像的完整路径名。
  • flags:图像的颜色类型的标记,有0和1两个值,其中1为默认值。当读取一幅彩色图像时,如果想要得到一幅彩色图像,那么flags的值为1(此时flags的值可以省略);想要得到一幅灰度图像则为0。
  • image:是imread()方法的返回值,返回的是读取到的彩色图像或者灰度图像。

其实就是读取了一个存在filename路径的图片,然后用image去表示这个图片而已(image只是一个举例,你爱叫啥叫啥),flags是0还是1取决于你想要彩图还是灰白图。

实例1: 读取当前项目目录下的图像
在PyCharm中的Demos项目下,有一幅名为1.jpg的图像。
现在先使用imread()方法读取1.jpg,再使用print()方法打印1.jpg。代码如下所示:

import cv2 # 导入库image = cv2.imread("1.jpg",1) # 读取1.jpg,等价于image = cv2.imread("1.jpg")
print(image) # 打印1.jpg

部分结果如下:
图中输出的数字是1.jpg的部分像素值。图中输出的数字是1.jpg的部分像素值。

如果图像存储在电脑C盘中,示例代码如下:

import cv2 #opencv读取的格式是BGRimg = cv2.imread('C:/Users/lenovo/Pictures/Saved Pictures/castle.jpg') # 路径中不能出现中文
print(image)

注意:“D:/1.jpg"等价于"D:\1.jpg”

显示图像

imshow()

imshow()方法用于显示图像:

cv2.imshow(winname,mat)
  • winname: 显示图像的窗口名称。
  • mat: 要显示的图像

waitKey()

waitKey()方法用于等待用户按下键盘上的某个按键时将执行waitKey()方法,并且获取与这个按键相对应的ASCII码:

retval = cv2.waitKey(delay)
  • delay:等待用户按下键盘上按键的时间,单位为毫秒(ms)。当delay的值为负数,0或者空时,表示无限等待用户按下键盘上按键的时间。
  • retval:与被按下的按键相对应的ASCII码。例如ESC键的ASCII码是27,当用户按下该键时,waitKey()方法的返回值为27.如果没有按键被按下,waitKey()方法的返回值是-1。

destroyAllWindows()

destroyAllWindows()方法用于销毁所有正在显示图像的窗口:

cv2.destroyAllWindows()

实例2: 窗口显示图像

import cv2image = cv2.imread("1.jpg", 1)  # 读取1.jpg
cv2.imshow("image",image)       # 在名为 image 的窗口中显示1.jpg
cv2.waitKey()                   # 按下任何键盘按键中
cv2.destroyAllWindows()         # 销毁所有窗口

结果如下:
在这里插入图片描述
如果想设置窗口显示图像的时间为5s,示例代码如下:

import cv2image = cv2.imread("1.jpg", 1)  # 读取1.jpg
cv2.imshow("image",image)       # 在名为 image 的窗口中显示1.jpg
cv2.waitKey(5000)               # 括号内单位为ms
cv2.destroyAllWindows()         # 销毁所有窗口

注意:

  • 显示图像的窗口名称不能是中文,否则会乱码。
  • 为了能够正常显示图像,要在cv2.imshow()后紧跟着cv2.waitKey()。

保存图像

imwrite()

imwrite()可按照指定路径保存图像

cv2.imwrite(filename,img)
  • filename: 保存图像时所用的完整路径
  • img: 要保存的图像

实例3: 保存图像

import cv2image = cv2.imread("1.jpg", 1)  # 读取1.jpg
cv2.imwrite("D:/Pictures/1.jpg",image) # 把1.jpg保存为D盘根目录下,Pictures文件夹中的1.jpg

注意: 运行上述代码前,要在E盘根目录下新建一个空的Pictures文件夹

复制图像

copy()

在OpenCV中,图像是由二维数组或者三维数组表示的。因此,使用copy()方法除了能够复制数组外,还能够复制图像。

实例4:复制图像

import cv2image = cv2.imread("1.jpg", 1)  # 读取1.jpg
copyImage = image.copy()
cv2.imshow("img",image)
cv2.imshow("copyImage",copyImage)
cv2.waitKey()
cv2.destroyAllWindows()

结果如下:
在这里插入图片描述

获取图像属性

处理图像的过程中,经常需要获取图像的大小、类型等图像属性。为此,OpenCV提供了shape、size和dtype这3个常用属性。

  • shape: 如果是彩色图像,那么获取的是一个包含图像的像素行数、像素列数、通道数的数组,数组的格式为(像素行数,像素列数,通道数);如果是灰度图像,那么获取的是一个包含图像的像素列数、像素行数的数组,数组的格式为(像素行数,像素列数)
  • size: 获取的是图像包含的像素总数,其值为像素行数×像素列数×通道数(灰度图像的通道数为1)
  • dtype: 获取的是图像的数据类型

实例4: 打印彩色图像和灰度图像的属性

import cv2image_Color = cv2.imread("1.jpg", 1)  # 读取1.jpg
print("获取彩色图像的属性:")
print("shape =",image_Color.shape) #打印彩色图像的(像素行数,像素列数,通道数)
print("size =",image_Color.size) #打印彩色图像包含的像素总数
print("dtype =",image_Color.dtype) #打印彩色图像的数据类型image_Gray = cv2.imread("1.jpg", 0)  # 读取1.jpg的灰度图像
print("获取灰度图像的属性:")
print("shape =",image_Gray.shape) #打印灰度图像的(像素行数,像素列数)
print("size =",image_Gray.size) #打印灰度图像包含的像素总数
print("dtype =",image_Gray.dtype) #打印灰度图像的数据类型

结果如下:
在这里插入图片描述

像素

像素是构成数字图像的基本单位。将电脑上的一幅图片放大,会发现图像是由许多个小方块组成的,通常把一个小方块称作一个像素。因此,一个像素是具有一定面积的一个块,而不是一个点。需要注意的是,像素的形状是不固定的,大多数情况下,像素被认为是方形的,但有时也可能是圆形的或者是其他形状的。

确定像素的位置

在OpenCV中,正确表示图像中某个像素坐标的格式为 (y,x) ,方向示意图如下:
在这里插入图片描述

实例5: 表示图中的指定像素

import cv2image = cv2.imread("1.jpg", 1)  # 读取1.jpg
px = image[50,30] # 坐标(50,30)上的像素

获取像素的BGR值

人眼能够感知红色、绿色和蓝色这3种不同的颜色,称为三基色。计算机利用色彩空间对颜色进行编码,把与“三基色”对应的色彩空间称作“RGB色彩空间”。

在RGB色彩空间种包含3个通道:R通道、G通道、B通道,分别代表红色通道、绿色通道、蓝色通道,每个通道都在区间[0,255]内进行取值。这样,计算机通过为这3个色彩通道取不同的值来表示不同的颜色。

OpenCV默认的通道顺序是B->G->R。也就是说,当OpenCV获取图像内某个像素的值时,这个值指的是这个像素的BGR值,OpenCV默认使用的色彩空间是BGR色彩空间。
在实例5中,凭借一个标签px就成功地表示了坐标(50,30)上的像素。如果使用print()方法打印这个像素,就会得到这个像素的BGR值。

import cv2image = cv2.imread("1.jpg", 1)  # 读取1.jpg
px = image[50,30] # 坐标(50,30)上的像素,同时获取三个通道的值
blue = image[50, 30, 0]  # 坐标(50,30)上的像素的B通道的值
green = image[50, 30, 1]  # 坐标(50,30)上的像素的G通道的值
red = image[50, 30, 2]  # 坐标(50,30)上的像素的R通道的值
print(px)
print(blue,green,red)

结果如下:
在这里插入图片描述

修改像素的BGR值

import cv2image = cv2.imread("1.jpg", 1)  # 读取1.jpg
px = image[50, 30]  # 坐标(50,30)上的像素
print("像素的初试BGR值是:",px)
px = [255,255,255] # 把坐标上的像素的值修改为[255,255,255]
print("像素修改后的BGR值是:",px)

结果如下:
在这里插入图片描述
当图像中的每个像素的B、G、R这3个数值相等时,就可以得到灰度图像。其中,当B = G = R = 0时,像素呈现纯黑色;当B = G = R = 255时,像素呈现纯白色

实例6: 修改图像中的指定区域内的所有像素
在图像上设定4个点,将4个点围成的区域内的所有像素都修改为白色。

import cv2image = cv2.imread("1.jpg", 1)  # 读取1.jpg
cv2.imshow("img_01", image)  # 显示图像
for i in range(241, 292):  # i表示横坐标,在区间[241,291]内取值for j in range(168, 219):  # j表示纵坐标,在区间[168,218]内取值image[i, j] = [255, 255, 255]  # 把区域内的所有像素都修改为白色
cv2.imshow("img_02", image)  # 显示像素被修改后的图像
cv2.waitKey()
cv2.destroyAllWindows()  # 关闭所有的窗口时,销毁所有窗口

结果如下:
在这里插入图片描述

色彩空间

上文中简单介绍了RGB色彩空间和BGR色彩空间。接下来将介绍在OpenCV中另外两个比较常见的色彩空间:GRAY色彩空间和HSV色彩空间。

GRAY色彩空间

GRAY色彩空间通常指的是灰度图像。灰度图像是一种每个像素都是从黑到白,被处理为256个灰度级别的单色图像。这256个灰度级别分别用区间[0,255]中的数值表示。“0”表示黑色,“255”表示白色,0~255之间的数值表示不同亮度(即色彩的深浅程度)的深灰色和浅灰色。

cvtColor()——从BGR色彩空间转换到GRAY色彩空间

OpenCV可以使用imread()方法把图片读取为灰度图像。除此之外,OpenCV还提供了cvtColor()方法用于转换图像的色彩空间。

dst = cv2.cvtColor(src,code)
  • src: 转换色彩空间前的初始图象
  • code: 色彩空间转换码
  • dst: 转换色彩空间后的图像

当一幅彩色图像从BGR色彩空间转换到GRAY色彩空间时,需要使用的色彩空间转换码时cv2.COLOR_BGR2GRAY。

实例7: 从BGR色彩空间转换到GRAY色彩空间

import cv2image = cv2.imread("1.jpg", 1)  # 读取1.jpg
cv2.imshow("img_01", image)  # 显示图像
# 将1.jpg从BGR色彩空间转换到GRAY色彩空间
gray_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow("GRAY", gray_image)  # 显示灰度图像
cv2.waitKey()
cv2.destroyAllWindows()  # 关闭所有的窗口时,销毁所有窗口

结果如下;
在这里插入图片描述
虽然色彩空间类型转换是双向的,而且OpenCV也提供了cv2.COLOR_GRAY2BGR这个色彩空间转换码,但是灰度图像是无法转换成彩色图像的。这是因为在彩色图像转换成灰度图像的过程中,已经丢失了颜色比例。

HSV色彩空间

RGB色彩空间是基于三基色而言的,即红色、绿色和蓝色。而HSV色彩空间则是基于色调、饱和度和亮度而言的。

  • 色调(H)是指光的颜色。OpenCV中,色调在区间[0,180]内取值。例如代表红色、黄色、绿色和蓝色的色调值分别为0、30、60和120。
  • 饱和度(S)是指色彩的深浅。在OpenCV中,饱和度在[0,255]内取值。当饱和度为0时,图像将变为灰度图像。
  • 亮度(V)是指光的明暗。与饱和度相同,在OpenCV中,亮度在区间[0,255]内取值。亮度值越大,图像越亮;当亮度值为0时,图像呈纯黑色。

从BGR色彩空间转换到HSV色彩空间

当一幅彩色图像从BGR色彩空间转换到HSV色彩空间时,需要使用的色彩空间转换码是cv2.COLOR_BGR2HSV

实例8: 从BGR色彩空间转换到HSV色彩空间

import cv2image = cv2.imread("1.jpg", 1)  # 读取1.jpg
cv2.imshow("img_01", image)  # 显示图像
# 将1.jpg从BGR色彩空间转换到HSV色彩空间
hsv_image = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
cv2.imshow("HSV", hsv_image)  # 显示灰度图像
cv2.waitKey()
cv2.destroyAllWindows()  # 关闭所有的窗口时,销毁所有窗口

结果如下:
在这里插入图片描述

通道

在BGR色彩空间中,包含3个通道:B通道、G通道和R通道。

拆分通道

为了拆分一幅图像中的通道,OpenCV提供了split()方法。

拆分一幅BGR图像中的通道

b, g, r = cv2.split(bgr_image)
  • bgr_image: 一幅BGR图像
  • b: B通道图像
  • g: G通道图像
  • r: R通道图像

实例9: 拆分一幅BGR图像中的通道

import cv2image = cv2.imread("1.jpg", 1)  # 读取1.jpg
cv2.imshow("img_01", image)  # 显示图像
b,g,r=cv2.split(image)
cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)
cv2.waitKey()
cv2.destroyAllWindows()  # 关闭所有的窗口时,销毁所有窗口

结果如下:
在这里插入图片描述
可以看到结果是0三个不同亮度的灰度图像。这是因为当程序执行到cv2.imshow(“B”,b)时原图像B、G、R这3个通道的值都会被修改为B通道的值,即(B,B,B),其余同理。对于BGR图像,只要B=G=R(即数值相等),就可以得到灰度图像。

拆分一幅HSV图像中的通道

h, s, v = cv2.split(hsv_image)
  • hsv_image: 一幅HSV图像。
  • h: H通道图像
  • s: S通道图像
  • v: V通道图像

实例10: 拆分一幅HSV图像中的通道

import cv2image = cv2.imread("1.jpg", 1)  # 读取1.jpg
cv2.imshow("img_01", image)  # 显示图像
hsv_image = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
h,s,v=cv2.split(hsv_image)
cv2.imshow("H",h)
cv2.imshow("S",s)
cv2.imshow("V",v)
cv2.waitKey()
cv2.destroyAllWindows()  # 关闭所有的窗口时,销毁所有窗口

结果如下:
在这里插入图片描述

合并通道

使用merge()方法合并H、S、V通道图像。

hsv = cv2.merge([h, s, v])
  • h: H通道图像
  • s: S通道图像
  • v: V通道图像
  • hsv:合并H通道图像、S通道图像和V通道图像后得到的图像

实例11: 合并H、S、V通道图像
首先将图像从BGR色彩空间转换到HSV色彩空间,然后拆分得到HSV图像中的通道,接着合并拆分后的通道图像,最后显示合并通道的HSV图像。

import cv2image = cv2.imread("1.jpg", 1)  # 读取1.jpg
cv2.imshow("img_01", image)  # 显示图像
hsv_image = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
h,s,v=cv2.split(hsv_image)
hsv = cv2.merge([h,s,v])
cv2.imshow("HSV",hsv)
cv2.waitKey()
cv2.destroyAllWindows()  # 关闭所有的窗口时,销毁所有窗口

结果如下:
在这里插入图片描述

综合运用拆分通道和合并通道

在HSV色彩空间中,如果保持其中两个通道的值不变,调整第3个通道的值,会得到响应的艺术效果。

实例12: 只把H通道的值调整为180
首先将图像从BGR色彩空间转换到HSV色彩空间;然后拆分得到HSV图像中的通道;接着让S通道和V通道的值表示不变,把H通道的值调整为180;再接着合并拆分后的通道图像,把这个图像从HSV色彩空间转换到BGR色彩空间;最后显示得到的BGR图像。

import cv2image = cv2.imread("1.jpg", 1)  # 读取1.jpg
cv2.imshow("img_01", image)  # 显示图像
hsv_image = cv2.cvtColor(image,cv2.COLOR_BGR2HSV) # 将图像从BGR色彩空间转换到HSV色彩空间
h,s,v=cv2.split(hsv_image) # 拆分得到HSV图像中的通道
h[:,:] = 180 # 让S通道和V通道的值表示不变,把H通道的值调整为180
hsv = cv2.merge([h,s,v]) # 合并拆分后的通道图像
new_Image = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR) # 把这个图像从HSV色彩空间转换到BGR色彩空间
cv2.imshow("NEW",new_Image)
cv2.waitKey()
cv2.destroyAllWindows()  # 关闭所有的窗口时,销毁所有窗口

结果如下:
在这里插入图片描述

alpha通道

OpenCV在B、G、R三个通道的基础上,又增加了一个A通道,即alpha通道,用于设置图像的透明度。在BGRA色彩空间中,alpha通道在区间[0,255]内取值,其中0表示透明,255表示不透明。

实例13: 调整A通道的值

import cv2bgr_image = cv2.imread("1.jpg", 1)  # 读取1.jpg
bgra_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2BGRA)  # 把图片从BGR色彩空间转换到BGRA色彩空间
b, g, r, a = cv2.split(bgra_image)  # 拆分BGRA图像中的通道
a[:, :] = 172  # 将BGRA图像的透明度调整为172(半透明)
bgra_172 = cv2.merge([b, g, r, a])  # 合并拆分后并将透明度调整为172的通道图像
a[:, :] = 0  # 将BGRA图像的透明度调整为0(透明)
bgra_0 = cv2.merge([b, g, r, a])  # 合并拆分后并将透明度调整为0的通道图像
cv2.imwrite("D:/bgra_image.png", bgra_image)  # 在D盘根目录下,保存BGRA图像
cv2.imwrite("D:/bgra_172.png", bgra_172)  # 在D盘根目录下,保存透明度为172的BGRA图像
cv2.imwrite("D:/bgra_0.png", bgra_0)  # 在D盘根目录下,保存透明度为0的BGRA图像

如果使用imshow()方法的话,窗口里显示的图像是相同的。为了显示这3幅图像的不同效果,需要使用imwrite()方法来保存。

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

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

相关文章

Lua学习(一)

lua基础学习 LUA 语言1. 什么是lua?1.1 准备工作 2. 基本语法2.1 注释2.2 标识符2.3 关键字2.4 全局变量 3. 数据类型4. 变量4.1 赋值语句 5. 循环5.1 while循环5.2 for循环5.3泛型for循环5.4 repeat until 循环5.5 break 语句 6. 流程控制6.1 if语句6.2 if else 语…

GNU make系列之介绍Makefile(0)

一.欢迎来到我的酒馆 在本章节介绍Makefile。 目录 一.欢迎来到我的酒馆二.GNU make 预览三.一个简单的Makefile四.make程序如何处理Makefile文件五.在Makefile中使用变量 二.GNU make 预览 2.1 GNU make工具会自动决定哪些程序需要被重新编译,并且执行相应的命令来…

reactantd(12)动态表单的默认值问题

最近遇到一个需求是有一个表单可以输入各种信息,然后还需要有一个编辑功能,点击编辑的时候需要把当前数据填入到表单里面。在网上查了很多种方法,然后我的思路是使用initialValues搭配setState()使用。默认值都为空,然后点击单条数…

从零开始学习 Java:简单易懂的入门指南之查找算法及排序算法(二十)

查找算法及排序算法 常见的七种查找算法:1. 基本查找2. 二分查找3. 插值查找4. 斐波那契查找5. 分块查找6. 哈希查找7. 树表查找 四种排序算法:1. 冒泡排序1.1 算法步骤1.2 动图演示1.3 代码示例 2. 选择排序2.1 算法步骤2.2 动图演示 3. 插入排序3.1 算…

knife4j 整合 springboot

官方文档:https://doc.xiaominfo.com/knife4j 版本兼容说明:https://doc.xiaominfo.com/docs/quick-start/start-knife4j-version 升级说明:https://doc.xiaominfo.com/docs/upgrading/upgrading-to-v4版本兼容惯关系: springboot…

MySQL一行记录是如何存储的?

目录 MySQL的数据存放在哪个文件? 表空间文件的结构是怎么样的? 1、行(row) 2、页(page) 3、区(extent) 4、段(segment) InnoDB 行格式有哪些&#xf…

解读亚马逊云科技语义搜图检索方案

图像检索(包括文搜图和图搜图)是各个行业中常见的一个应用场景。比如在电商场景中,基于以图搜图做相似商品查找;在云相册场景中,基于文搜图来找寻所需的图像素材。 传统基于标签的图像检索方式,即先使用目标…

博流RISC-V芯片Eclipse环境搭建

文章目录 1、下载 Eclipse2、导入 bouffalo_sdk3、编译4、烧录5、使用ninja编译 之前编译是通过 VSCode 编译,通过手工输入 make 命令编译,我们也可以通过 Eclipse 可视化 IDE 来编译、烧录。 1、下载 Eclipse 至 Eclipse 官网 https://www.eclipse.org…

【微服务部署】02-配置管理

文章目录 1.ConfigMap1.1 创建ConfigMap方式1.2 使用ConfigMap的方式1.3 ConfigMap使用要点建议 2 分布式配置中心解决方案2.1 什么时候选择配置中心2.2 Apollo配置中心系统的能力2.2.1 Apollo创建配置项目2.2.2 项目使用2.2.3 K8s中使用Apollo 1.ConfigMap ConfigMap是K8s提供…

【第1章 数据结构概述】

目录 一. 基本概念 1. 数据、数据元素、数据对象 2. 数据结构 二. 数据结构的分类 1. 数据的逻辑结构可分为两大类:a. 线性结构;b. 非线性结构 2. 数据的存储结构取决于四种基本的存储方法:顺序存储、链接存储、索引存储、散列存储 3. …

iMX6ULL 库移植 | Libgpiod 库的交叉编译及使用指南(linux)

GPIO口的操作,是很常见的功能。传统的GPIO sysfs接口已被弃用。自Linux 4.8起,内核提供了全新的操作gpio的方式libgpiod(C library and tools for interacting with the linux GPIO character device),当然也更高效&am…

大数据Flink简介与架构剖析并搭建基础运行环境

文章目录 前言Flink 简介Flink 集群剖析Flink应用场景Flink基础运行环境搭建Docker安装docker-compose文件编写创建并运行容器访问Flink web界面 前言 前面我们分别介绍了大数据计算框架Hadoop与Spark,虽然他们有的有着良好的分布式文件系统和分布式计算引擎,有的有…

电脑识别不了固态硬盘怎么办?

在使用固态硬盘时,可能会出现电脑无法识别的情况,这时我们就无法使用固态硬盘中的数据。那么,电脑识别不了固态硬盘怎么办? 为什么电脑识别不了固态硬盘? 一般来说,电脑识别不了固态硬盘是因为以下3个原因…

软件工程(八) UML之类图与对象图

1、类图与对象图 1.1、类图与对象图的概念 类图(class diagram)描述一组类、接口、协作和它们之间的关系 对象图(object diagram)描述一组对象及它们之间的关系、对象图描述了在类图中所建立的事物实例的静态快照。 1.2、类图与对象图的区别 类图和对象图基本上是一样…

Python Opencv实践 - Canny边缘检测

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_GRAYSCALE) print(img.shape)#图像Canny边缘检测 #cv.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradien…

python web 开发与 Node.js + Express 创建web服务器入门

目录 1. Node.js Express 框架简介 2 Node.js Express 和 Python 创建web服务器的对比 3 使用 Node.js Express 创建web服务器示例 3.1 Node.js Express 下载安装 3.2 使用Node.js Express 创建 web服务器流程 1. Node.js Express 框架简介 Node.js Express 是一种…

Spring boot中调用C/C++(dll)

添加JNA依赖 <dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.5.0</version> </dependency>准备C代码/C代码 如下是C代码&#xff0c;文件名&#xff1a;xizi.c #include <std…

电子电路原理题目整理(1)

电子电路原理题目整理&#xff08;1&#xff09; 最近在学习《电子电路原理》&#xff0c;记录一下书后面试题目&#xff0c;答案为个人总结&#xff0c;欢迎讨论。 1.电压源和电流源的区别&#xff1f; 电压源在不同的负载电阻下可提供恒定的负载电压&#xff0c;而电流源对于…

Docker容器与虚拟化技术:Harbor私有仓库部署与迁移

目录 一、理论 1.本地私有仓库 2.Harbor 二、实验 1.Docker搭建本地私有仓库 2.docker-compose部署及配置 3.harbor部署及配置 4.登录创建项目 5.在其他客户端上传镜像 6. harbor维护 7.移除 Harbor 服务容器同时保留镜像数据/数据库&#xff0c;并进行迁移 三、问题…

ssm+vue校园教务系统源码和论文

ssmvue校园教务系统源码和论文086 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 1、课题背景 信息系统的目的是让人可以高效的进行工作&#xff0c;包括对信息的一-系列操作&#xff0c;如添加信息、修改信…