当前位置: 首页 > news >正文

Opencv计算机视觉编程攻略-第七节 提取直线、轮廓和区域

第七节 提取直线、轮廓和区域

  • 1.用Canny 算子检测图像轮廓
  • 2.用霍夫变换检测直线;
  • 3.点集的直线拟合
  • 4.提取连续区域
  • 5.计算区域的形状描述子

图像的边缘区域勾画出了图像含有重要的视觉信息。正因如此,边缘可应用于目标识别等领域。但是简单的二值边缘分布图有两个主要缺点:

  1. 检测到的边缘过厚,这加大了识别物体边界的难度
  2. 也是更重要的,通常不可能找到既低到足以检测到图像中所有重要边缘,又高到足以避免产生太多无关紧要边缘的阈值

1.用Canny 算子检测图像轮廓

canny算子在低阈值边缘分布图上只保留具有连续路径的边缘点,同时把那些边缘点连接到属于高阈值边缘分布图的边缘上。高阈值分布图上的所有边缘点都被保留下来,而低阈值分布图上边缘点的孤立链全部被移除,只要指定适当的阈值,就能获得高质量的轮廓。这种基于两个阈值获得二值分布图的策略被称为滞后阈值化,可用于任何需要用阈值化获得二值分布图的场景,计算复杂度比较高。
另外,Canny 算法用了一个额外的策略来优化边缘分布图的质量。在进行滞后阈值化之前,如果梯度幅值不是梯度方向上的最大值,那么对应的边缘点都会被移除(前面讲过,梯度的方向总是与边缘垂直的)。因此,这个方向上梯度的局部最大值对应着轮廓最大强度的位置。这是一个细化轮廓的运算,它创建的轮廓宽度只有一个像素,这也解释了为什么Canny 轮廓分布图的边缘比较薄。

// 应用Canny 算法
cv::Mat contours;
cv::Canny(image, // 灰度图像contours, // 输出轮廓125, // 低阈值350); // 高阈值

在这里插入图片描述

2.用霍夫变换检测直线;

霍夫变换(Hough transform)是一种常用于检测此类具体特征的经典算法。该算法起初用于检测图像中的直线,后来经过扩展,也能检测其他简单的图像结构。
在这里插入图片描述
参数ρ 是直线与图像原点(左上角)的距离,θ 是直线与垂直线间的角度。在这种表示法中,图像中的直线有一个0~π(弧度)的角θ,而半径ρ 的最大值是图像对角线的长度。例如下面的一组线:
在这里插入图片描述

// 应用Canny 算法
cv::Mat contours;
cv::Canny(image,contours,125,350);
// 用霍夫变换检测直线
std::vector<cv::Vec2f> lines;
cv::HoughLines(contours,lines, 1,PI/180, // 步长60); // 最小投票数

半径步长为1,表示函数将搜索所有可能的半径;角度步长为π/180,表示函数将搜索所有可能的角度对于垂直方向的直线,计算它与图像水平边界(即第一行和最后一行)的交叉点,然后在这两个交叉点之间画线。水平方向的直线也类似,只不过用第一列和最后一列。画线的函数是cv::line。需要注意的是,即使点的坐标超出了图像范围,这个函数也能正确运行,因此没必要检查交叉点是否在图像内部。通过遍历直线向量画出所有直线:

霍夫变换只是寻找图像中边缘像素的对齐区域。因为有些像素只是碰巧排成了直线,所以霍夫变换可能产生错误的检测结果。也可能因为多条参数相近的直线穿过了同一个像素对齐区域,而导致检测出重复的结果。为解决上述问题并检测到线段(即包含端点的直线),人们提出了霍夫变换的改进版。这就是概率霍夫变换,在OpenCV 中通过cv::HoughLinesP 函数实现。
首先,概率霍夫变换在二值分布图上随机选择像素点,而不是系统性地逐行扫描图像。一旦累加器的某个入口达到了预设的最小值,就沿着对应的直线扫描图像,并移除在这条直线上的所有像素点(包括还没投票的像素点)。这个扫描过程还检测可以接受的线段长度。为此,算法定义了两个额外的参数:一个是允许的线段最小长度,另一个是组成连续线段时允许的最大像素间距

cv::HoughLinesP(binary,lines,deltaRho, deltaTheta, minVote,minLength, maxGap);

在这里插入图片描述

霍夫变换也能用来检测其他几何物体。事实上,任何可以用一个参数方程来表示的物体,都很适合用霍夫变换来检测。还有一种泛化霍夫变换,可以检测任何形状的物体。
OpenCV 采用的策略是在用霍夫变换检测圆的实现中使用两轮筛选。第一轮筛选使用一个二维累加器,找出可能是圆的位置。因为圆周上像素点的梯度方向与半径的方向是一致的,所以对每个像素点来说,累加器只对沿着梯度方向的入口增加计数(根据预先定义的最小和最大半径值)。一旦检测到可能的圆心(即收到了预定数量的投票),就在第二轮筛选中建立半径值范围的一维直方图。这个直方图的尖峰值就是被检测圆的半径。

cv::GaussianBlur(image,image,cv::Size(5,5),1.5);
std::vector<cv::Vec3f> circles;
cv::HoughCircles(image, circles, cv::HOUGH_GRADIENT,2, // 累加器分辨率(图像尺寸/2)50, // 两个圆之间的最小距离200, // Canny 算子的高阈值100, // 最少投票数25,100); // 最小和最大半径

在这里插入图片描述

3.点集的直线拟合

在某些应用程序中,光是检测出图像中的直线还不够,还需要精确地估计直线的位置和方向。
点集的直线拟合是一个经典数学问题。OpenCV 的实现方法是使每个点到直线的距离之和最小化。在众多用于计算距离的函数中,欧几里得距离的计算速度最快,所用参数为cv::DIST_L2。这一选项对应了标准的最小二乘法直线拟合。如果点集中包含了孤立点(即不属于直线的点),可以选用其他距离函数,以减少远距离的点带来的影响。最小化计算的基础是M 估算法技术,它采用迭代方式解决加权最小二乘法问题,其中权重与点到直线的距离成反比。

cv::Vec4f line;
cv::fitLine(points,line,cv::DIST_L2, // 距离类型0, // L2 距离不用这个参数0.01,0.01); // 精度

在这里插入图片描述

4.提取连续区域

图像通常包含各种物体,图像分析的目的之一就是识别和提取这些物体。在物体检测和识别程序中,第一步通常就是生成二值图像,找到感兴趣物体所处的位置。不管用什么方式获得二值图像(例如用第4 章的直方图反向投影,或者用第12 章的运动分析),下一个步骤都是从由1 和0 组成的像素集合中提取出物体。

// 用于存储轮廓的向量
std::vector<std::vector<cv::Point>> contours;
cv::findContours(image,contours, // 存储轮廓的向量cv::RETR_EXTERNAL, // 检索外部轮廓cv::CHAIN_APPROX_NONE); // 每个轮廓的全部像素
// 在白色图像上画黑色轮廓
cv::Mat result(image.size(),CV_8U,cv::Scalar(255));
cv::drawContours(result,contours,-1, // 画全部轮廓0, // 用黑色画2); // 宽度为2

5.计算区域的形状描述子

连续区域通常代表着场景中的某个物体。为了识别该物体,或将它与其他图像元素做比较,需要对此区域进行测量,以提取出部分特征

第一个是边界框,用于右下角的区域:
// 测试边界框
cv::Rect r0= cv::boundingRect(contours[0]);
// 画矩形
cv::rectangle(result,r0, 0, 2)
最小覆盖圆的情况也类似,将它用于右上角的区域:
// 测试覆盖圆
float radius;
cv::Point2f center;
cv::minEnclosingCircle(contours[1],center,radius);
// 画圆形
cv::circle(result,center, static_cast<int>(radius),
cv::Scalar(0),2);
计算区域轮廓的多边形逼近的代码如下(位于左侧区域):
// 测试多边形逼近
std::vector<cv::Point> poly;
cv::approxPolyDP(contours[2],poly,5,true);
// 画多边形
cv::polylines(result, poly, true, 0, 2);
注意,多边形绘制函数cv::polylines 与其他画图函数很相似。第三个布尔型参数表示该
轮廓是否闭合(如果闭合,最后一个点将与第一个点相连)。
凸包是另一种形式的多边形逼近(位于左侧第二个区域):
// 测试凸包
std::vector<cv::Point> hull;
cv::convexHull(contours[3],hull);
// 画多边形
cv::polylines(result, hull, true, 0, 2);
最后,计算轮廓矩是另一种功能强大的描述子(在所有区域内部画出重心):
// 测试轮廓矩
// 迭代遍历所有轮廓
itc= contours.begin();
while (itc!=contours.end()) {
// 计算所有轮廓矩
cv::Moments mom= cv::moments(cv::Mat(*itc++));
// 画重心
cv::circle(result,
// 将重心位置转换成整数
cv::Point(mom.m10/mom.m00,mom.m01/mom.m00),
2, cv::Scalar(0),2); // 画黑点
}

在这里插入图片描述

相关文章:

Opencv计算机视觉编程攻略-第七节 提取直线、轮廓和区域

第七节 提取直线、轮廓和区域 1.用Canny 算子检测图像轮廓2.用霍夫变换检测直线&#xff1b;3.点集的直线拟合4.提取连续区域5.计算区域的形状描述子 图像的边缘区域勾画出了图像含有重要的视觉信息。正因如此&#xff0c;边缘可应用于目标识别等领域。但是简单的二值边缘分布图…...

清明假期在即

2025年4月2日&#xff0c;6~22℃&#xff0c;一般 遇见的事&#xff1a;这么都是清明出去玩&#xff1f;你们不扫墓的么。 感受到的情绪&#xff1a;当精力不放在一个人身上&#xff0c;你就会看到很多人&#xff0c;其实可以去接触的。 反思&#xff1a;抖音上那么多不幸和幸…...

数字孪生技术解析:开启虚拟与现实融合新时代

一、数字孪生技术的概念与原理 数字孪生技术是一种通过构建物理对象的数字映射&#xff0c;实现虚拟与现实同步的技术。该技术集成了物联网、云计算、人工智能、大数据等多种前沿技术&#xff0c;能够对物理世界进行全方位的仿真和管理。在数字孪生技术中&#xff0c;物理建模…...

Docker Registry 清理镜像最佳实践

文章目录 registry-clean1. 简介2. 功能3. 安装 docker4. 配置 docker5. 配置域名解析6. 部署 registry7. Registry API 管理8. 批量清理镜像9. 其他10. 参考 registry-clean 1. 简介 registry-clean 是一个强大而高效的解决方案&#xff0c;旨在简化您的 Docker 镜像仓库管理…...

进程间的通信

一.理解 1.进程间通信的目的 数据传输&#xff0c;资源共享&#xff0c;通知事件&#xff0c;进程控制 2.进程间通信的本质 先让不同的进程看到"同一份"资源&#xff08;该资源只能由OS系统提供&#xff0c;不能由任何一个进程提供&#xff09; 3.具体通信方式 …...

当实时消费遇到 SPL:让数据处理更高效、简单

作者&#xff1a;豁朗 通过 SPL 消费&#xff0c;将业务逻辑“左移” SLS 对实时消费进行了功能升级&#xff0c;推出了 基于 SPL 的规则消费功能。在实时消费过程中&#xff0c;用户只需通过简单的 SPL 配置即可完成服务端的数据清洗和预处理操作。通过SPL消费可以将客户端复…...

Python----机器学习(线性回归:反向传播和梯度下降)

一、前向传播与反向传播的区别 前向传播是在参数固定后&#xff0c;向公式中传入参数&#xff0c;进行预测的一个过程。当参 数值选择的不恰当时&#xff0c;会导致最后的预测值不符合我们的预期&#xff0c;于是我们就 需要重新修改参数值。 在前向传播实验中时&#xff0c;我…...

如何平衡元器件成本与性能

要平衡元器件成本与性能&#xff0c;企业应当明确设计需求和目标、优化元器件选型策略、建立成本性能评估体系、推进标准化设计、加强供应链管理。其中&#xff0c;优化元器件选型策略尤其关键&#xff0c;它直接关系到产品的成本、性能与生命周期。在选型时&#xff0c;工程师…...

java项目分享-分布式电商项目附软件链接

今天来分享一下github上最热门的开源电商项目安装部署&#xff0c;star 12.2k&#xff0c;自行安装部署历时两天&#xff0c;看了这篇文章快的话半天搞定&#xff01;该踩的坑都踩完了&#xff0c;软件也打包好了就差喂嘴里。 项目简介 mall-swarm是一套微服务商城系统&#xf…...

低代码框架

在数字化转型浪潮中&#xff0c;软件开发的效率与成本成为企业关注的焦点。低代码框架应运而生&#xff0c;以其独特的开发模式&#xff0c;打破了传统软件开发的壁垒&#xff0c;为企业和开发者带来了全新的解决方案。那么&#xff0c;究竟什么是低代码框架呢&#xff1f;​ …...

Git Reset 命令详解与实用示例

文章目录 Git Reset 命令详解与实用示例git reset 主要选项git reset 示例1. 撤销最近一次提交&#xff08;但保留更改&#xff09;2. 撤销最近一次提交&#xff0c;并清除暂存区3. 彻底撤销提交&#xff0c;并丢弃所有更改4. 回退到特定的提交5. 取消暂存的文件 git reset 与 …...

多层内网渗透测试虚拟仿真实验环境(Tomcat、ladon64、frp、Weblogic、权限维持、SSH Server Wrapper后门)

在线环境:https://www.yijinglab.com/ 拓扑图 信息收集 IP地址扫描 确定目标IP为10.1.1.121 全端口扫描 访问靶机8080端口,发现目标是一个Tomcat服务,版本...

<贪心算法>

前言&#xff1a;在主包还没有接触算法的时候&#xff0c;就常听人提起“贪心”&#xff0c;当时是layman&#xff0c;根本不知道说的是什么&#xff0c;以为很难呢&#xff0c;但去了解一下&#xff0c;发现也不过如此嘛&#xff08;bushi)&#xff0c;还以为是什么高级东西呢…...

使用PyTorch实现GoogleNet(Inception)并训练Fashion-MNIST

GoogleNet&#xff08;又称Inception v1&#xff09;是2014年ILSVRC冠军模型&#xff0c;其核心创新是Inception模块&#xff0c;通过并行多尺度卷积提升特征提取能力。本文将展示如何用PyTorch实现GoogleNet&#xff0c;并在Fashion-MNIST数据集上进行训练。 1. 环境准备 im…...

KingbaseES物理备份还原之备份还原

此篇续接上一篇<<KingbaseES物理备份还原之物理备份>>,上一篇写物理备份相关操作,此篇写备份还原的具体操作步骤. KingbaseES版本:V009R004C011B003 一.执行最新物理备份还原 --停止数据库服务,并创建物理备份还原测试目录 [V9R4C11B3192-168-198-198 V8]$ sys_ct…...

Unity Standard Shader 解析(二)之ForwardAdd(标准版)

一、ForwardAdd // Additive forward pass (one light per pass)Pass{Name "FORWARD_DELTA"Tags { "LightMode" "ForwardAdd" }Blend [_SrcBlend] OneFog { Color (0,0,0,0) } // in additive pass fog should be blackZWrite OffZTest LEqual…...

.NET 使用 WMQ 连接Queue 发送 message 实例

1. 首先得下载客户端&#xff0c;没有客户端无法发送message. 安装好之后长这样 我装的是7.5 安装目录如下 tools/dotnet 目录中有演示的demo 2. .Net 连接MQ必须引用bin目录中的 amqmdnet.dll 因为他是创建Queuemanager 的核心库&#xff0c; 项目中引用using IBM.WMQ; 才…...

设计模式之单例模式

视频链接&#xff1a; 设计模式|狂神说 单例模式是什么&#xff1f; 单例模式是确保一个类在整个应用程序中只有一个实例&#xff0c;并提供一个全局方法访问这个实例。 单例模式分为饿汉式和懒汉式。 饿汉式单例 饿汉式顾名思义就是&#xff0c;程序一启动就创建这个单例bea…...

从入门到入土,SQLServer 2022慢查询问题总结

列为,由于公司原因,作者接触了一个SQLServer 2022作为数据存储到项目,可能是上一任的哥们儿离开的时候带有情绪,所以现在项目的主要问题就是,所有功能都实现了,但是就是慢,列表页3s打底,客户很生气,经过几周摸爬滚打,作以下总结,作为自己的成长记录。 一、索引问题…...

大语言模型在端到端智驾中的应用

大语言模型在端到端智驾中的应用 双系统端到端 小鹏&#xff1a;AI天玑系统—神经网络XNet规控大模型XPlanner大语言模型XBrain 商汤绝影&#xff1a;DriveAGI 理想&#xff1a;端到端VLM VLA端到端 Waymo&#xff1a;EMMA OPENEMMA Wayve&#xff1a;LINGO-2...

【深度学习量化交易19】行情数据获取方式比测(1)——基于miniQMT的量化交易回测系统开发实记

我是Mr.看海&#xff0c;我在尝试用信号处理的知识积累和思考方式做量化交易&#xff0c;应用深度学习和AI实现股票自动交易&#xff0c;目的是实现财务自由~ 目前我正在开发基于miniQMT的量化交易系统——看海量化交易系统。 经常使用MiniQMT的朋友都知道&#xff0c;xtquant的…...

《网络管理》实践环节03:snmp服务器上对网络设备和服务器进行初步监控

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 应用拓扑图 3.0准备工作 所有Linux服务器上&#xff08;服务器和Agent端&#xff09;安装下列工具 yum -y install net-snmp net-snmp-utils 保证所有的HCL网络设备和服务器相互间能…...

linux操作系统

1.linux进程管理 操作系统都有进程的概念 查看和关闭程序 2.关闭进程 3,查看计算机硬件信息 4.定时任务...

Python基础语法 - 判断语句

Python基础语法 - 判断语句 1. if语句 if 条件:# 条件为True时执行的代码示例 age 18 if age > 18:print("您已成年")2. if-else语句 if 条件:# 条件为True时执行的代码 else:# 条件为False时执行的代码示例 age 16 if age > 18:print("您已成年&q…...

c++柔性数组、友元、类模版

目录 1、柔性数组&#xff1a; 2、友元函数&#xff1a; 3、静态成员 注意事项 面试题&#xff1a;c/c static的作用? C语言&#xff1a; C: 为什么可以创建出 objx 4、对象与对象之间的关系 5、类模版 1、柔性数组&#xff1a; #define _CRT_SECURE_NO_WARNINGS #…...

电子技术基础

目录 一、整体概述 二、知识点梳理及考点分析 &#xff08;一&#xff09;半导体器件 &#xff08;二&#xff09;基本放大电路 &#xff08;三&#xff09;功率放大电路 &#xff08;四&#xff09;集成运算放大器 &#xff08;五&#xff09;直流稳压电源 &#xff0…...

解码大模型时代算力基座的隐形引擎

在千亿参数大模型竞速的今天&#xff0c;算力军备竞赛已进入白热化阶段。当我们聚焦GPU集群的运算峰值时&#xff0c;一个关键命题正在浮出水面&#xff1a;支撑大模型全生命周期的存力基座&#xff0c;正在成为制约AI进化的关键变量。绿算技术将深入解剖大模型训练与推理场景中…...

【NetCore】ControllerBase:ASP.NET Core 中的基石类

ControllerBase:ASP.NET Core 中的基石类 一、什么是 ControllerBase?二、ControllerBase 的主要功能三、ControllerBase 的常用属性四、ControllerBase 的常用方法2. 模型绑定与验证3. 依赖注入五、ControllerBase 与 Controller 的区别六、实际开发中的最佳实践七、总结在 …...

人工智能之数学基础:矩阵分解之LU分解

本文重点 LU分解是线性代数中一种重要的矩阵分解方法,它将一个方阵分解为一个下三角矩阵(L)和一个上三角矩阵(U)的乘积。这种分解方法在数值线性代数中有着广泛的应用,特别是在求解线性方程组、计算矩阵的行列式、求逆矩阵等方面。 LU分解的基本概念 设A是一个nn的方阵…...

C#核心学习(六)面向对象--封装(5)静态成员及静态构造函数和静态类 以及和常量的区别

目录 一、什么是静态的&#xff1f;什么是常量&#xff1f; 1. ​静态&#xff08;Static&#xff09;​ 2. ​常量&#xff08;const&#xff09;​ 二、类中的静态成员有什么用&#xff1f; 1. ​共享数据 2. ​工具方法与全局配置 3. ​单例模式 三、静态类和静态成…...

去中心化稳定币机制解析与产品策略建议

去中心化稳定币机制解析与产品策略建议&#xff08;以Maker/DAI为例&#xff09; 一、核心机制对比&#xff1a;法币抵押型 vs. 加密货币抵押型 法币抵押型&#xff08;如USDT&#xff09; 技术逻辑&#xff1a;1:1美元储备托管于中心化机构&#xff08;如银行&#xff09;&…...

构造超小程序

文章目录 构造超小程序1 编译器-大小优化2 编译器-移除 C 异常3 链接器-移除所有依赖库4 移除所有函数依赖_RTC_InitBase() _RTC_Shutdown()__security_cookie __security_check_cookie()__chkstk() 5 链接器-移除清单文件6 链接器-移除调试信息7 链接器-关闭随机基址8 移除异常…...

JSONP跨域访问漏洞

一、漏洞一:利用回调GetCookie <?php$conn new mysqli(127.0.0.1,root,root,learn) or die("数据库连接不成功"); $conn->set_charset(utf8); $sql "select articleid,author,viewcount,creattime from learn3 where articleid < 5"; $result…...

数据结构优化DP总结

单调栈&#xff1a;Codeforces Round 622 (Div. 2) C2. Skyscrapers (hard version) 简单来讲就是最后需要呈现出一个单峰数组&#xff0c;使得总高度最高。 最开始想到暴力枚举每一个元素都充当最高的“单峰”&#xff0c;但是这里的 n 过大&#xff0c;这样枚举肯定会TLE。 …...

Linux网络相关概念和重要知识(4)(序列化和反序列化、TCP协议、会话和守护进程)

目录 1.序列化和反序列化 &#xff08;1&#xff09;为什么需要序列化 &#xff08;2&#xff09;序列化方案 ①json ②json序列化代码模板 ③json反序列化代码模板 ④将自定义方案和json结合 2.TCP协议&#xff08;传输控制协议&#xff09; &#xff08;1&#xff09…...

[MySQL初阶]MySQL数据库基础

MySQL数据库基础 1. 数据库基础1.1 什么是数据库1.2 主流数据库2. 数据库的基本使用2.1 连接服务器2.2 使用案例2.3 数据逻辑存储3. MySQL架构与分类3.1 MySQL架构3.2 SQL分类4. 存储引擎4.1 存储引擎基本概念4.2 存储引擎基本操作1. 数据库基础 1.1 什么是数据库 存储数据用…...

【mysql 的安装及使用】

MySQL 9.0 一、下载MySQL[MySQL 9.0 下载] [(https://dev.mysql.com/downloads/mysql/)选择自定义,选择合适安装路径二、检查安装情况配置环境变量打开命令行查看版本创建数据库在MySQL中,可以使用create database语句来创建数据库。以下是创建一个名为my_db的数据库的示例:…...

d202542

一、142.环形链表I 142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 用set统计一下 如果再次出现那么就环的第一个return返回就行 public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();ListNode cur head;while(cur ! …...

vscode代码片段的设置与使用

在 Visual Studio Code (VS Code) 中&#xff0c;可以通过自定义**代码片段&#xff08;Snippets&#xff09;**快速插入常用代码模板。以下是详细设置步骤&#xff1a; 步骤 1&#xff1a;打开代码片段设置 按下快捷键 Ctrl Shift P&#xff08;Windows/Linux&#xff09;或…...

3D 地图渲染-区域纹理图添加

引入-初始化地图&#xff08;关键代码&#xff09; // 初始化页面引入高德 webapi -- index.html 文件 <script src https://webapi.amap.com/maps?v2.0&key您申请的key值></script>// 添加地图容器 <div idcontainer ></div>// 地图初始化应该…...

spring-security原理与应用系列:HttpSecurity.filters

目录 AnyRequestMatcher WebSecurityConfig HttpSecurity AbstractInterceptUrlConfigurer AbstractAuthenticationProcessingFilter 类图 在前面的文章《spring-security原理与应用系列&#xff1a;securityFilterChainBuilders》中&#xff0c;我们遗留了一个问题&…...

每日总结4.2

蓝桥杯刷题&#xff1a; 1. 方格分割&#xff08;dfs,选中心点&#xff0c;开始上下左右遍历&#xff0c;达到边界时数量加一&#xff09; #include <bits/stdc.h> using namespace std; bool vis[10][10]; int mp[10][10]; int ans0; int dx[4]{1,0,0,-1}; int dy[4]{…...

架构师面试(二十五):分布式存储 Leader 设计

问题 在非常多的分布式存储系统中&#xff0c;如&#xff1a;Zookeeper、Etcd、Kafka等&#xff0c;往往会存在一个 【Leader】 角色&#xff0c;并由该角色负责数据的写入&#xff0c;这样设计最主要的原因是什么呢&#xff1f; A. 唯一负责数据写入的 Leader 角色可以避免并…...

mycat --分片规则--

文章目录 MyCat分片规则详解1. rule1 (基于id的func1算法)2. sharding-by-date (按日期分片)3. rule2 (基于user_id的func1算法)4. sharding-by-intfile (基于枚举值分片)5. auto-sharding-long (长整型范围分片)6. mod-long (取模分片)7. sharding-by-murmur (MurmurHash分片)…...

系统分析师备考启动

以考促学&#xff1a;软件高级系统分析师。 一、考试目的&#xff1a; 1、练习三遍读书法、快速阅读、番茄工作法、第一性原理、思维导图等学习方法和学习工具的使用。 2、掌握知识、编织知识网、顺便拿证。 二、组织形式&#xff1a; 小组统一安排学习内容&#xff0c;每…...

轻量级搜索接口技术解析:快速实现关键词检索的Java/Python实践

Hi&#xff0c;你好&#xff01; 轻量级搜索接口技术解析&#xff1a;快速实现关键词检索的Java/Python实践 接口特性与适用场景 本接口适用于需要快速集成搜索能力的开发场景&#xff0c;支持通过关键词获取结构化搜索结果。典型应用场景包括&#xff1a; 垂直领域信息检索…...

防爆风扇选型指南:根据风量风压匹配应用场景​

在化工、石油、煤矿等存在易燃易爆气体或粉尘的危险环境中&#xff0c;通风设备的安全性能至关重要&#xff0c;防爆风扇成为保障生产环境安全与空气流通的关键装备。正确选型是确保其发挥最佳效能的前提&#xff0c;而根据风量风压匹配应用场景则是选型的核心要点。​ 风量&am…...

Laravel 中使用 JWT 作用户登录,身份认证

什么是JWT&#xff1a; JWT 全名 JSON Web Token&#xff0c;是一种开放标准 (RFC 7519)。 用于在网络应用环境间安全地传输信息作为 JSON 对象。 它是一种轻量级的认证和授权机制&#xff0c;特别适合分布式系统的身份验证。 核心特点 紧凑格式&#xff1a;体积小&#x…...

Git安装

1、 下载Git https://git-scm.com/ 2、 双击【Git-2.44.0-64-bit.exe】安装&#xff1a; 2-1、 选择自定义安装目录&#xff1a;F:\software\Git 2-2、 一直点击next&#xff0c;直到安装成功。 2-3、 在git项目文件夹&#xff0c;右键出现Git GUI Here和Git Bash Here就说明成…...

bit与byte的区别与联系?

李升伟 整理 byte 和 bit 是计算机中常用的数据单位&#xff0c;它们的主要区别和联系如下&#xff1a; 1. 定义 bit&#xff08;比特&#xff09;&#xff1a;计算机中最小的数据单位&#xff0c;表示一个二进制位&#xff0c;值为0或1。 byte&#xff08;字节&#xff09…...