开源计算机视觉库OpenCV详解

news2024/11/16 7:31:39

目录

1、概述

2、OpenCV详细介绍

2.1、OpenCV的起源

2.2、OpenCV开发语言

2.3、OpenCV的应用领域

3、OpenCV模块划分

4、OpenCV源码文件结构

4.1、根目录介绍

4.2、常用模块介绍

4.3、CUDA加速模块

5、OpenCV配置以及Visual Studio使用OpenCV

6、OpenCV和OpenGL的区别

7、OpenCV与YOLO的区别


VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N5K3https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N5K3https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具案例集锦(专栏文章正在更新中...)icon-default.png?t=N5K3https://blog.csdn.net/chenlycly/category_12279968.html

1、概述

       当下人工智能的发展可以说是前所未有的迅猛,而计算机视觉(Computer Vision)无疑是人工智能一个非常重要的分支,计算机视觉的发展也成为了很多科研人员和业界开发人员聚焦的热点。我们常常听说到的无人驾驶、智能安防、人脸识别、文字识别、以图搜图、VR/AR、3D重构等等都是以计算机视觉做为技术基础的应用实践。

       在计算机视觉项目的开发中,OpenCV作为最大众的开源库,拥有了丰富的常用图像处理函数库,采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上,能够快速的实现一些图像处理和识别的任务。此外,OpenCV还提供了java、python、cuda等的使用接口、机器学习的基础算法调用,从而使得图像处理和图像分析变得更加易于上手,让开发人员更多的精力花在算法的设计上。

        本文将主要介绍OpenCV开发的一些基础知识、入门上手的方法与步骤等。

2、OpenCV详细介绍

2.1、OpenCV的起源

       OpenCV诞生于Intel研究中心,其目的是为了促进CPU密集型应用。为了达到这一目的,Intel启动了多个项目,包括实时光线追踪和三维显示墙。一个在Intel工作的OpenCV作者在访问一些大学时,注意到许多顶尖大学中的研究组(如MIT媒体实验室)拥有很好的内部使用的开放计算机视觉库-- (在学生们之间互相传播的代码),这会帮助一个新生从高的起点开始他/她的计算机视觉研究。这样一个新生可以在以前的基础上继续开始研究,而不用从底层写基本函数。

       因此,OpenCV的目的是开发一个普遍可用的计算机视觉库。在Intel的性能库团队的帮助下 ,OpenCV实现了一些核心代码以及算法,并发给Intel俄罗斯的库团队。这就是OpenCV的诞生之地:在与软件性能库团队的合作下,它开始于Intel的研究中心,并在俄罗斯得到实现和优化。

       俄罗斯团队的主要负责人是Vadim Pisarevsky,他负责管理项目、写代码并优化OpenCV的大部分代码,在OpenCV中很大一部分功劳都属于他。跟他一起,Victor Eruhimov帮助开发了早期的架构,Valery Kuriakin管理俄罗斯实验室并提供了很大的支持。在开始时,OpenCV有以下三大目标。

       为基本的视觉应用提供开放且优化的源代码,以促进视觉研究的发展。能有效地避免“闭门造车”。通过提供一个通用的架构来传播视觉知识,开发者可以在这个架构上继续开展工作,所以代码应该是非常易读的且可改写。本库采用的协议不要求商业产品继续开放代码,这使得可移植的、性能被优化的代码可以自由获取,可以促进基于视觉的商业应用的发展。

       这些目标说明了OpenCV的起缘。计算机视觉应用的发展会增加对快速处理器的需求。与单独销售软件相比,促进处理器的升级会为Intel带来更多收入。这也许是为什么这个开放且免费的库出现在一家硬件生产企业中,而不是在一家软件公司中。从某种程度上说,在一家硬件公司里,在软件方面会有更多创新的空间。 

2.2、OpenCV开发语言

       OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

       OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。这些语言的API接口函数可以通过在线文档获得。如今也提供对于C#,Ch, Ruby的支持。

2.3、OpenCV的应用领域

       OpenCV是一个用于图像处理、分析、机器视觉方面的开源函数库。 无论你是做科学研究,还是商业应用,OpenCV都可以作为你理想的工具库,因为,对于这两者,它完全是免费的。同时,由于计算机视觉与机器学习密不可分,该库也包含了比较常用的一些机器学习算法。或许,很多人知道图像识别、机器视觉在安防领域有所应用。但很少有人知道,在航拍图片、街道图片(例如google street view)中,要严重依赖于机器视觉的摄像头标定、图像融合等技术。

       近年来,在入侵检测、特定目标跟踪、目标检测、人脸检测、人脸识别、人脸跟踪等领域,OpenCV可谓大显身手,而这些,仅仅是其应用的冰山一角。如今,来自世界各地的各大公司、科研机构的研究人员,共同维护支持着OpenCV的开源库开发。这些公司和机构包括:微软,IBM,索尼、西门子、google、intel、斯坦福、MIT、CMU、剑桥。

       计算机视觉市场巨大而且持续增长,且这方面没有标准API,如今的计算机视觉软件大概有以下三种:

1)研究代码(慢,不稳定,独立并与其他库不兼容)
2)耗费很高的商业化工具(比如Halcon, MATLAB+Simulink)
3)依赖硬件的一些特别的解决方案(比如视频监控,制造控制系统,医疗设备)这是如今的现状。

而标准的API将简化计算机视觉程序和解决方案的开发。OpenCV致力于成为这样的标准API。OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库(Integrated Performance Primitives)得到更快的处理速度(注:OpenCV 2.0版的代码已显著优化,无需IPP来提升性能,故2.0版不再提供IPP接口)。下图为OpenCV与当前其他主流视觉函数库的性能比较。

3、OpenCV模块划分

       OpenCV主体分为五个模块,其中四个模块如下所示:

OpenCV的CV模块包含基本的图像处理函数和高级的计算机视觉算法。ML是机器学习库,包含一些基于统计的分类和聚类工具。HighGUI包含图像和视频输入/输出的函数。CXCore包含OpenCV的一些基本数据结构和相关函数。

       目前,我们当前讨论的是OpenCV3.2.0版本。OpenCV3.0与OpenCV2.0的版本相比,他的主要改动如下:

1)大体上保留了OpenCV 2经典的C++和Python编程接口风格。其中,Python接口大大增强,也加入了Python 3.x的支持。一般来说,以前版本的程序只要做少数修改,就可以使用OpenCV 3了。另外还改善了Java接口,并且加入了MATLAB支持。
2)架构调整。图片、视频编解码从highgui模块分离出来,组成了imgcodecs和videoio。原先的OpenCL模块ocl事实上与其 它模块融为一体,而CUDA加速模块gpu分解成了数个以cuda开头的模块。此外,除了官方支持的OpenCV代码,还有一些自发贡献的内容、不稳定的 内容,或者版权尚存争议的内容,都放到了新的仓库opencv_contrib中。
3)更多新算法。新版本包括了TLD、鱼眼镜头模型等全新算法,还包括了一些更高层次可以直接拿来用的高级封装,比如汽车检测等。
4)引入T-API,使OpenCL加速更容易。目前可以参考OpenCV源代码中T-API的范例。可以发现,开启和关闭OpenCL加速,只需要一个语句就够了。这也就是为什么ocl模块会消失了吧。
5)更多指令集优化。除了之前为Intel CPU做的优化以外,OpenCV 3还容纳了ARM平台NEON指令集的支持。通过英特尔的帮助,OpenCV 3对x86和x64平台默认使用IPP。OpenCV3.0中部分函数得到加速的示意图如下:

4、OpenCV源码文件结构

        开源库OpenCV的github地址为:C++软件分析工具案例集锦(专栏文章正在更新中...)icon-default.png?t=N5K3https://blog.csdn.net/chenlycly/category_12279968.html,下文以OpenCV3.0版本展开讲述。

4.1、根目录介绍

        OpenCV3.0的sources文件结构如下:

1)3rdparty/,包含第三方的库,比如视频解码用的 ffmpeg,jpg、png、tiff等图片的开源解码库。
2)apps/,包含进行 haar 分类器训练的工具,opencv 进行人脸检测便是基于 haar 分类器。如果你想检测人脸以外的图片,千万不要错过这几个工具。
3)cmake/,包含生成工程项目时 cmake 的依赖文件,用于智能搜索第三方库,普通开发者不需要关心这个文件夹的内容。
4)data/,包含 opencv 库以及范例中用到的资源文件,haar 物体检测的分类器位于haarcascades子文件中。
5)doc/,包含生成文档所需的源文件以及辅助脚本。
6)include/,包含入口头文件。opencv 子文件夹中是 C 语言风格的API,也就是《Learning OpenCV (第一版)》中描述的API函数,官方将逐渐淘汰 C 风格函数,因此我不推荐大家使用该文件夹中的头文件。opencv2 子文件中只有一个 opencv.hpp 文件,这是 cv2 以及 cv3 推荐使用的头文件。
7)modules/,包含核心代码,opencv 真正的代码都在这个文件夹中。opencv 从2.0开始以模块的方式组织各种功能,近两年模块的数量增长得很快,后面我会依次介绍每个模块的作用。
8)platforms/,包含交叉编译所需的工具链以及额外的代码,交叉编译指的是在一个操作系统中编译供另一个系统使用的文件。
9)samples/,范例文件夹。

4.2、常用模块介绍

        modules目录中则包含了OpenCV的主要功能模块,包含了如下的多个模块:

1)androidcamera/,仅用于android平台,使得可以通过与其他平台相同的接口来控制android设备的相机。
2)core/,核心功能模块,定义了基本的数据结构,包括最重要的 Mat 类、XML 读写、opengl三维渲染等。
3)imgproc/,全称为 image processing,即图像处理。包括图像滤波、集合图像变换、直方图计算、形状描述子等。图像处理是计算机视觉的重要工具。
4)imgcodec/,负责各种格式的图片的读写,这个模块是从以前的 highgui 中剥离的。
5)highgui/,高级图形界面及与 QT 框架的整合。
6)video/,视频分析模块。包括背景提取、光流跟踪、卡尔曼滤波等,做视频监控的读者会经常使用这个模块。
7)videoio/,负责视频文件的读写,也包括摄像头、Kinect 等的输入。
8)calib3d/,相机标定以及三维重建。相机标定用于去除相机自身缺陷导致的画面形变,还原真实的场景,确保计算的准确性。三维重建通常用在双目视觉(立体视觉),即两个标定后的摄像头观察同一个场景,通过计算两幅画面中的相关性来估算像素的深度。
9)features2d/,包含 2D 特征值检测的框架。包含各种特征值检测器及描述子,例如 FAST、MSER、OBRB、BRISK等。各类特征值拥有统一的算法接口,因此在不影响程序逻辑的情况下可以进行替换。
10)objdetect/,物体检测模块。包括haar分类器、SVM检测器及文字检测。
11)ml/,全称为 Machine Learning,即机器学习。包括统计模型、K最近邻、支持向量机、决策树、神经网络等经典的机器学习算法。
12)flann/,用于在多维空间内聚类及搜索的近似算法,做图像检索的读者对它不会陌生。
13)photo/,计算摄影学。包括图像修补、去噪、HDR成像、非真实感渲染等。如果读者想实现Photoshop的高级功能,那么这个模块必不可少。
14)stitching/,图像拼接,可用于制作全景图。
15)nonfree/,受专利保护的算法。包含SIFT和SURF,从功能上来说这两个算法属于features2d模块的,但由于它们都是受专利保护的,想在项目中可能需要专利方的许可。
16)shape/,形状匹配算法模块。用于描述形状、比较形状。
17)softcascade/,另一种物体检测算法,Soft Cascade 分类器。包含检测模块和训练模块。
18)superres/,全称为 Super Resolution,用于增强图像的分辨率。
19)videostab/,全称为 Video Stabilization,用于解决相机移动时拍摄的视频不够稳定的问题。
20)viz/,三维可视化模块。可以认为这个模块实现了一个简单的三维可视化引擎,有各种UI控件和键盘、鼠标交互方式。底层实现基于 VTK 这个第三方库。

4.3、CUDA加速模块

        CUDA 是显卡制造商 NVIDIA 推出的通用计算语言,在cv3中有大量的模块已经被移植到了CUDA 语言:

1)cuda/,CUDA-加速的计算机视觉算法,包括数据结构 cuda::GpuMat、 基于cuda的相机标定及三维重建等。
2)cudaarithm/,CUDA-加速的矩阵运算模块。
3)cudabgsegm/,CUDA-加速的背景分割模块,通常用于视频监控。
4)cudacodec/,CUDA-加速的视频编码与解码。
5)cudafeatures2d/,CUDA-加速的特征检测与描述模块,与features2d/模块功能类似。
6)cudafilters/,CUDA-加速的图像滤波。
7)cudaimgproc/,CUDA-加速的图像处理算法,包含直方图计算、霍夫变换等。
8)cudaoptflow/,CUDA-加速的光流检测算法。
9)cudastereo/,CUDA-加速的立体视觉匹配算法。
10)cudawarping/,实现了 CUDA-加速的快速图像变换,包括透视变换、旋转、改变尺寸等。
11)cudaev/,实现 CUDA 版本的核心功能,类似 core/ 模块中的基础算法。

5、OpenCV配置以及Visual Studio使用OpenCV

        了解了OpenCV的数据结构和功能后,下面介绍OpenCV的配置,win7 64 + vs2013 + OpenCV3.0步骤。

1)下载安装opencv 3.0。下载地址:http://opencv.org/downloads.html。
2)配置环境变量:计算机属性->高级系统设置->环境变量->Path->变量值:

3)配置VS2013。首先打开VS2013建立一个Win32控制台项目。然后,在“项目->工程属性->VC++目录”中,加入包含目录
..\opencv\build\include; ..\opencv\build\include\opencv; 
..\opencv\build\include\opencv2。(..代表OpenCV安装的文件夹目录)

加入库目录..\opencv\build\x64\vc12\lib。“项目->工程属性->链接器->输入->附加依赖”中添加附加依赖项:
opencv_ts300d.lib;opencv_world300d.lib:

配置完成后,就可以在vs2013中使用opencv3.0中的函数了。

       经过以上的基础知识介绍后,就可以进行入门的实践了。在上面配置完成的工程中,来显示一幅图片,验证一下是否成功。在解决方案资源管理器中,打开源文件main.cpp(没有可以自己创6、建),添加以下代码

#include<opencv2\opencv.hpp>
using namespace cv;
int main()
{
    Mat src = imread("lena.jpg"); //图片必须添加到工程目录下
    imshow("src ", src);
    waitKey();
}

然后点击本地Windows调试器,或者按F5运行程序,成功后显示图像。

6、OpenCV和OpenGL的区别

       OpenCV和OpenGL都是用来处理图像和视频的,但两者有很大的区别。 

       OpenCV是一个开源计算机视觉库,用于图像和视频处理、分析和识别。它提供了各种算法和工具,如图像处理、特征检测、目标跟踪、人脸识别等,可以在计算机视觉应用中使用。

       OpenGL是一个开源图形库,用于创建3D图形和动画。它提供了各种功能和工具,如渲染、光照、纹理映射等,可以在游戏、虚拟现实、建筑和工程应用中使用。此外,OpenGL还提供了一个专用于嵌入式领域的OpenGL ES (OpenGL for Embedded Systems), 是 OpenGL 三维图形 API 的子集,主要针对手机、PAD和游戏主机等嵌入式设备而设计。

       虽然OpenCV和OpenGL都可以用于图像处理和计算机视觉应用,但它们的目的和功能不同。OpenCV主要用于图像和视频处理和分析,而OpenGL主要用于3D图形和动画的创建和渲染。

7、OpenCV与YOLO的区别

       OpenCV和YOLO都是计算机视觉领域的工具库,但它们的作用和使用方式有所不同。

       OpenCV是一个开源的计算机视觉库,提供了各种各样的图像处理和计算机视觉算法,如图像读取、图像处理、特征提取、目标检测、人脸识别等。OpenCV可以用于各种应用,如图像处理、视频处理、机器人视觉、自动驾驶等。

       YOLO(You Only Look Once)是一种开源目标检测算法,可以实现实时目标检测。它使用深度学习技术,通过单个神经网络模型实现目标检测,可以同时检测多个目标,并且速度快、准确率高。YOLO可以用于各种应用,如智能监控、自动驾驶、机器人视觉等。

       因此,OpenCV和YOLO都是计算机视觉领域的工具,但OpenCV更加通用,可以用于各种图像处理和计算机视觉应用,而YOLO则更加专注于目标检测领域,可以实现实时目标检测,检测效率要高一些。

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

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

相关文章

SpringBoot常用操作

SpringBoot常用操作 SpringBoot启动过程 1. 生成一个SpringApplication的对象1. webApplicationType 推测web应用类型&#xff08;NONE、REACTIVE、SERVLET&#xff09;2. 从spring.factories中获取BootstrapRegistryInitializer对象3. initializers 从spring.factories中获…

A brief taste of JIFA

JIFA 是阿里贡献给 Eclipse 的一个适用于 Java 应用的问题诊断应用。 它以图形化的方式展示 Heap Dump AnalysisGC Log AnalysisThread Dump Analysis 因为云环境/生产环境的一些限制&#xff0c;应用的问题可能不能被就地分析&#xff0c;所以Jifa provides a web solution…

关于运动模糊问题的分析及处理方法

1、问题背景 前段时间有做一个化妆镜项目&#xff0c;就是一面镜子上装有一个摄像头&#xff0c;用户对着镜子化妆时&#xff0c;可同时用来采集人脸信息&#xff0c;分析人脸用的。客户反馈抓拍静止的人脸图像时&#xff0c;画面正常&#xff0c;而当人脸稍微运动时&#xff…

java springboot整合MyBatis实现分页查询以及带条件的分页查询

之前的文章 java springboot整合MyBatis做数据库查询操作操作了springboot整合MyBatis&#xff0c;然后简单做了个按id查询的操作 那么 我们按上文搭建起的环境继续 我们直接在staffDao接口中声明一个分页函数 Select("select * from staff limit #{page},#{pageSize}&q…

【Vue】Vite 组件化开发

文章目录 组件化开发一、组件化开发思想二、Vue 组件的构成2.1 组件组成结构2.2 组件 template 节点2.2.1 在 template 中使用指令2.2.2 在 template 中定义根节点 2.3 组件的 script 模板 三、组件的基本使用3.1 组件的注册3.1.1 全局组件注册3.1.2 局部组件注册 3.2 组件样式…

ffmpeg命令参数

主要参数 -i 设定输入流 -f 设定输出格式&#xff08;format&#xff09; -ss 开始时间 -t 时间长度视频参数 -vframes 设置要输出的视频帧数 -b 设定视频码率 -b:v 视频码率 -r 设定帧率 -s 设定画面的宽与高 -vn 不处理视频 -aspect aspect 设置横纵比4:3 或16:9 或1.333或…

软件项目管理 第三章软件项目的启动过程课后习题参考答案——主编:李冰、张桥珍、刘玉娥

第三章 软件项目的启动过程 课后习题参考答案 1.选择题 &#xff08;1&#xff09;乙方在项目初始阶段的主要任务不包含以下哪一项&#xff08;D&#xff09;。 A. 项目分析 B. 竞标 C. 合同签署 D. 合同管理 &#xff08;2&#xff09;项目章程中不…

Spring Boot Configuration Annotation Processor not configured 问题解决

目录 问题抛出&#xff1a; ConfigurationProperties 问题抛出&#xff1a; 进行Spring Boot配置文件部署时&#xff0c;发出警告Spring Boot Configuration Annotation Processor not configured&#xff0c;但是不影响运行。 不过有时候springboot项目出错了并且排除了所有…

【裸机开发】中断系统 —— 中断向量表(设置中断向量偏移的原因)

之前的LED驱动不存在中断&#xff0c;也就不包含中断的初始化。如果程序包含了中断&#xff0c;我们应还需要初始化哪些内容&#xff1f;要解决这个问题&#xff0c;我们需要先了解一个中断系统包含了哪些内容。 ① 中断向量表&#xff1a;描述中断对应的中断服务函数&#xf…

C++笔记之stack、queue、priority_queue、deque

code review! C笔记之stack、queue、priority_queue、deque 文章目录 C笔记之stack、queue、priority_queue、deque一.cppreference介绍1.stack2.queue3.priority_queue4.deque 二.容器适配器三.stack详解1.创建一个不包含任何元素的 stack 适配器&#xff0c;并采用默认的 de…

Debian 12中再次安装R软件

上篇博客&#xff08;地址&#xff1a;https://blog.csdn.net/my1114/article/details/131347147?spm1001.2014.3001.5501&#xff09;中所述的&#xff0c;在Debian12中按默认方式编译安装R软件&#xff0c;有一定的局限性。 如下图所示&#xff1a; 因此&#xff0c;本…

Redis入门(2)-字符串

String是Redis最基础、最常见的类型&#xff0c;string类型的value中可存放任意数据&#xff0c;包括数值型、二进制的图片、音频、视频、序列化对象等。一个String类型的value最大是512M. 1.getset k v 若key存在返回之前的值&#xff0c;若不存在返回nil 2.strlen key 返…

【面试】标准库相关题型(三)

文章目录 1. unordered_map底层实现原理1.1 散列表1.2 STL 中的 unordered_map 的实现1.3 unordered_map 2. 迭代器底层实现原理及种类2.1 主要作用2.2 底层原理2.3 迭代器类型属性 3. 迭代器失效3.1 容器类别3.2 失效情况3.3 C11容器类别 4. STL容器的线程安全4.1 背景知识4.2…

Git分支使用方法

目录 前言 一、查看可用分支 二、创建新分支 三、切换到新分支 四、在新分支上进行工作 五、提交更改 六、切换回主分支 前言 分支是指在同一个代码仓库中的不同版本线。它们可以被用来同时开展不同的开发任务、修复bug或实现新功能&#xff0c;而不会影响到主要的代码…

【数据结构】栈和队列的应用

&#x1f387;[数据结构]栈和队列的应用&#x1f387; &#x1f31f; 正式开始学习数据结构啦~此专栏作为学习过程中的记录&#x1f31f; 文章目录 &#x1f387;[数据结构]栈和队列的应用&#x1f387;&#x1f370;一.栈在括号表达式中的应用&#x1f680;1.原理&#x1f680…

Linux1.基础指令(上)

1.Linux系统可创建多个用户。 2.创建用户:adduser 用户名 设置密码:passwd 用户名 (系统会提示再次输入密码&#xff0c;注意密码不回显)。 3.删除用户首先要在root权限下&#xff0c;输入指令:userdel -r 用户名。 4.ls指令 ls -a(显示所有文件&#xff0c;包括隐藏文件) :…

【软件设计师暴击考点】计算机组成原理与体系结构高频考点暴击系列【二】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…

【P3】kali 最强渗透工具 - metasploit(安装配置及使用教程详解)

文章目录 一、metasploit 是什么&#xff1f;二、metasploit 攻击 windows 操作系统三、metasploit 攻击永恒之蓝全流程四、metasploit 攻击成功后能做什么4.1、操作步骤4.2、攻击示例 五、msfvenom 绕过杀毒软件技巧5.1、捆绑木马5.2、加壳&#xff1a;压缩壳、加密壳5.2.1、T…

分片和一致性哈希

在设计大规模分布式系统时&#xff0c;你可能会遇到两个概念——分片&#xff08;sharding&#xff09;和一致性哈希&#xff08;consistent hashing&#xff09;。虽然我在网上找到了很多关于这些术语的解释&#xff0c;但它们让我感到有些困惑。我觉得分片和一致性哈希本质上…

Web网页制作-知识点(2)——常用文本标签、列表标签、表格标签、Form表单、块元素与行内元素(内联元素)

目录 常用文本标签 列表标签 有序列表 无序列表 定义列表 表格标签 表格组成与特点 表格标签 表格属性 ​​​合并表格单元格 Form表单 属性说明 表单元素 文本框 密码框 提交按钮 块元素与行内元素&#xff08;内联元素&#xff09; 内联元素和块级元素…