图像处理(十一):轮廓检测

2023-11-05

图像处理笔记总目录


1 图像的轮廓

轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓是图像目标的外部特征,这种特征对于我们进行图像分析,目标识别和理解等更深层次的处理都有很重要的意义。

轮廓提取的基本原理:对于一幅背景为黑色、目标为白色的二值图像,如果在图中找到一个白色点,且它的8邻域(或4邻域)也均为白色,则说明该点是目标的内部点,将其置为黑色,视觉上就像内部被掏空一样;否则保持白色不变,该点是目标的轮廓点。一般在寻找轮廓之前,都要将图像进行阈值化或Canny边缘检测,转换为二值化图像。

在这里我们看下边缘检测和轮廓检测的区别:

边缘检测主要是通过一些手段检测数字图像中明暗变化剧烈(即梯度变化比较大)像素点,偏向于图像中像素点的变化。如canny边缘检测,结果通常保存在和源图片一样尺寸和类型的边缘图中。

轮廓检测指检测图像中的对象边界,更偏向于关注上层语义对象。如OpenCV中的findContours()函数, 它会得到每一个轮廓并以点向量方式存储,除此也得到一个图像的拓扑信息,即一个轮廓的后一个轮廓、前一个轮廓等的索引编号。

1.1 查找轮廓

在OPenCV中查找轮廓的API:contours, hierarchy = cv2.findContours(img, mode, method)

参数:

  • img: 输入图像,二值图
  • mode: 轮廓的检索模式,主要有四种方式:
    • cv2.RETR_EXTERNAL:只检测外轮廓,所有子轮廓被忽略
    • cv2.RETR_LIST:检测的轮廓不建立等级关系,所有轮廓属于同一等级
    • cv2.RETR_CCOMP:返回所有的轮廓,只建立两个等级的轮廓。一个对象的外轮廓为第 1 级组织结构。而对象内部中空洞的轮廓为 第 2 级组织结构,空洞中的任何对象的轮廓又是第 1 级组织结构。
    • cv2.RETR_TREE:返回所有的轮廓,建立一个完整的组织结构的轮廓。
  • method:轮廓的近似方法,主要有以下两种:
    • cv2.CHAIN_APPROX_NONE:存储所有的轮廓点,相邻的两个点的像素位置差不超过1。
    • cv2.CHAIN_APPROX_SIMPLE:压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息。
      在这里插入图片描述

返回:

  • contours:检测出的轮廓,所有轮廓的列表结构,每个轮廓是目标对象边界点的坐标的数组
  • hierarchy:轮廓的层次结构。
    在这里插入图片描述

在这幅图像中,我给这几个形状编号为 0-5。2 和 2a 分别代表最外边矩形的外轮廓和内轮廓。

在这里边轮廓 0,1,2 在外部或最外边。我们可以称他们为 0 级,简单来说就是他们属于同一级,接下来轮廓 2a,把它当成轮廓 2 的子轮廓。它就成为第 1 级。轮廓 3 是轮廓 2a 的子轮廓,成为第 3 级。轮廓 3a 是轮廓 3 的子轮廓,成为第 4 级,最后轮廓 4,5 是轮廓 3a 的子轮廓,成为5级,这样我们就构建的轮廓的层级关系。

我们再回到返回值中,不管层次结构是什么样的, 每一个轮廓都包含自己的信息。hierarchy使用包含四个元素的数组来表示:

[Next,Previous, First_Child,Parent]

其中:

  • Next 表示同一级组织结构中的下一个轮廓,

    以上图中的轮廓 0 为例,轮廓 1 就是他的 Next。同样,轮廓 1 的 Next 是 2,Next=2。 那轮廓 2 呢?在同一级没有 Next。这时 Next=-1。而轮廓 4 的 Next 为 5,所以它的 Next=5。

  • Previous 表示同一级结构中的前一个轮廓。

    轮廓 1 的 Previous 为轮廓 0,轮廓 2 的 Previous 为轮廓 1。轮廓 0 没有 Previous,所以 Previous=-1。

  • First_Child 表示它的第一个子轮廓。

    轮廓 2 的子轮廓为 2a。 所以它的 First_Child 为 2a。那轮廓 3a 呢?它有两个子轮廓。但是我们只要第一个子轮廓,所以是轮廓 4(按照从上往下,从左往右的顺序排序)。

  • Parent 表示它的父轮廓。

    与 First_Child 刚好相反。轮廓 4 和 5 的父轮廓是轮廓 3a。而轮廓 3a 的父轮廓是 3。

注意: 如果轮廓没有父轮廓或子轮廓时,则将其置为-1。

1.2 绘制轮廓

我们查找到图像中的轮廓后,怎么将他绘制在图像上呢?

cv2.drawContours(img, contours, index, color, width)

参数:

  • img:轮廓检测的原图像
  • contours:检测出的轮廓。
  • Index:轮廓的索引,绘制单个轮廓时指定其索引,绘制全部的轮廓时设为-1即可。
  • color和width:绘制时轮廓的颜色及线型的宽度。

示例:

在北京市的图片上进行轮廓检测,如下图所示:
在这里插入图片描述

import numpy as np
import cv2
import matplotlib.pyplot as plt

# 1 图像读取
img = cv2.imread('../image/beijing.jpg')
imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 2 边缘检测
canny = cv2.Canny(imgray, 127, 255, 0)

# 3 轮廓提取
contours, hierarchy = cv2.findContours(canny, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 4 将轮廓绘制在图像上
img = cv2.drawContours(img, contours, -1, (0, 0, 255), 2)

# 5 图像显示
plt.imshow(img[:, :, ::-1])
plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

2 轮廓的特征

在提取了图像的轮廓后,可以计算轮廓的不同特征,我们现在主要看下:轮廓的面积,周长,边界框等。

2.1 轮廓面积

轮廓面积是轮廓所包围的区域的面积,在OpenCV中使用的API是:area = cv2.contourArea(cnt)

2.2 轮廓周长

轮廓周长也被成为弧长,在OpenCV中使用的API是:perimeter = cv2.arcLength(cnt,isclosed)

2.3 轮廓近似

轮廓近似是将轮廓形状近似为到另外一种由更少点组成的轮廓形状,新轮廓的点的数目由我们设定的准确度来决定。

假设我们要在一幅图像中查找一个矩形,然而这个图凹凸不平,直接提取轮廓无法提取到一个完美的矩形。因此我们就可以使用轮廓近似函数来近似这个形状了。

API:approx = cv.approxPolyDP(cnt,epsilon,isclosed)

参数:

  • cnt:要进行轮廓近似的原始轮廓
  • epsilon:从原始轮廓到近似轮廓的最大距离,是一个准确度参数,该参数对调整后的结果很重要。
  • Isclosed:指定轮廓是否闭合

返回:

  • approx:返回的点集,绘制时将其连接起来绘制最终的近似轮廓。

示例:

import numpy as np
import cv2
import matplotlib.pyplot as plt

# 1 图像读取
img = cv2.imread('../image/rec.png') 
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 2 转换为二值图
ret,thresh = cv2.threshold(imgray,127,255,0)

# 3 轮廓提取
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_NONE)

# 4 轮廓近似
epsilon = 0.1*cv2.arcLength(contours[0],True)
approx = cv2.approxPolyDP(contours[0],epsilon,True)

# 5 将轮廓绘制在图像上
# 5.1 原始轮廓
img1 = img.copy()
img1 = cv2.drawContours(img1, contours, -1, (0,0,255), 2)
# 5.2 轮廓近似后的结果
img2 = img.copy()
img2 = cv2.polylines(img2, [approx], True, (0, 0, 255), 2)

# 6 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img1[:,:,::-1]),plt.title('轮廓检测结果')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img2[:,:,::-1]),plt.title('轮廓近似后结果')
plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

2.4 凸包

凸包是计算机几何图形学中的概念,简单来说,给定二维平面点集,凸包就是将最外层的点连接起来构成的凸多边形,他能够包含物体中所有的点。物体的凸包常应用在物体识别,手势识别及边界检测等领域。

在OpenCV中检测凸包的API是:hull = cv2.convexHull(points, clockwise, returnPoints)

参数:

  • points:传入的轮廓
  • clockwise:方向标志。如果设置为 True,输出的凸包是顺时针方向的。 否则为逆时针方向
  • returnPoints:默认值为 True。它会返回凸包上点的坐标。 如果设置 为 False,就会返回与凸包点对应的轮廓上的点的索引。

返回:

  • hull: 输出的凸包结果

示例:

import numpy as np
import cv2
import matplotlib.pyplot as plt

# 1 图像读取
img = cv2.imread('../image/star 2.jpeg') 
img1 =img.copy()
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 2 边缘检测
canny = cv2.Canny(imgray,127,255,0)

# 3 轮廓提取
contours, hierarchy = cv2.findContours(canny,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

# 4 将轮廓绘制在图像上
img = cv2.drawContours(img, contours, 1, (255,0,0), 2)

# 5 凸包检测
hulls=[]
for cnt in contours:
    # 寻找凸包使用cv2.convexHull(contour)
    hull = cv2.convexHull(cnt)
    hulls.append(hull)
draw_hulls = cv2.drawContours(img1,hulls, -1, (0, 255, 0), 2)

# 5 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('轮廓检测结果')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(draw_hulls[:,:,::-1]),plt.title('凸包结果')
plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

2.5 边界矩形

轮廓检测中的边界矩形有两种,一种是直边界矩形,一种是旋转边界矩形,分别介绍如下:

直边界矩形 :一个直矩形,没有进行旋转。它不会考虑对象是否旋转,所以该边界矩形的面积不是最小的。可以使用函数cv2.boundingRect()查找得到。

x,y,w,h = cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

返回值中,(x,y)是矩阵左上角的坐标,(w,h)是举行的宽和高。

旋转边角矩形:这个边界矩形是面积最小的,他考虑了对象的旋转。用函数cv2.minAreaRect(),返回的是一个Box2D结构,其中包含矩形中心点的坐标(x,y),以及矩形的宽和高(w,h),以及旋转角度。但是要绘制这个矩形需要矩形的4个角点。可以通过函数cv2.boxPoints()获得。

s = cv2.minAreaRect(cnt)
a = cv2.boxPoints(s)
a = np.int0(a)#必须转换a的类型为int型
cv2.polylines(im,[a],True,(0,0,255),3)

示例:

import numpy as np
import cv2
import matplotlib.pyplot as plt

# 1 图像读取
img = cv2.imread('../image/arrows.jpg') 
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 2 转换为二值图
ret,thresh = cv2.threshold(imgray,127,255,0)

# 3 轮廓提取
contours, hierarchy = cv2.findContours(thresh,1,2)

# 4 将轮廓绘制在图像上
img = cv2.drawContours(img, contours, 1, (0,0,255), 2)
cnt = contours[1]

# 5 边界矩形
# 5.1 直边界矩形
x,y,w,h = cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),3)
# 5.2 旋转边界矩形结果
s = cv2.minAreaRect(cnt)
a = cv2.boxPoints(s)
a = np.int0(a)#转换a的类型为int型
cv2.polylines(img,[a],True,(0,0,255),3)

# 6 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.imshow(img[:,:,::-1]),plt.title('矩形结果')
# plt.xticks([]), plt.yticks([])
plt.show()

2.6 最小外接圆

最小外接圆是对象的外切圆,它是所有包含目标对象的圆中面积最小的一个,我们使用函数cv2.minEnclosingCircle()获取最小外接圆。

将上述案例中的边界矩形的代码改为如下所示,即可检测对象的最小外接圆

(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y)) 
radius = int(radius) 
img = cv2.circle(img,center,radius,(0,255,0),2)

在这里插入图片描述

2.7 椭圆拟合

椭圆拟合法的基本思路是:对于给定平面上的一组样本点,寻找一个椭圆,使其尽可能接近这些样本点。也就是说,将图像中的一组数据以椭圆方程为模型进行拟合,使某一椭圆方程尽量满足这些数据,并求出该椭圆方程的各个参数。

就椭圆拟合而言,就是先假设椭圆参数,得到每个待拟合点到该椭圆的距离之和,也就是点到假设椭圆的误差,求出使这个和最小的参数。

在OPenCV中我们使用cv2.ellipse()来进行椭圆拟合,将边界矩形中的代码改为如下所示,就可得到椭圆拟合的结果:

ellipse = cv2.fitEllipse(cnt)
img = cv2.ellipse(img,ellipse,(0,255,0),2)

在这里插入图片描述

2.8 直线拟合

直线拟合就是将图像中的对象拟合成一条直线过程,在OPenCV中拟合直线的API是:output = cv2.fitLine(points, distType, param, reps, aeps)

参数:

  • points:待拟合直线的点的集合,可以是检测处理轮廓结果
  • distype:距离公式,在进行拟合是,要使输入点到拟合直线的距离之和最小,常用的用以下几种:
    • cv2.DIST_L1:曼哈顿距离
    • cv2.DIST_L2:欧式距离
    • cv2.DIST_C:切比雪夫距离
  • param:距离参数,可以设为0
  • Reps,aeps:用于表示拟合曲线所需要的径向和角度精度,通常设为0.01

返回:

  • output:[vx,vy,x,y]的1*4 的数组,前两个表示直线的方向,即vy/vx表示斜率,后两位表示直线上的一个点。

将边界矩形中的代码改为如下示,即可进行直线拟合:

rows,cols = img.shape[:2]
[vx,vy,x,y] = cv2.fitLine(cnt, cv2.DIST_L2,0,0.01,0.01)
lefty = int((-x*vy/vx) + y)
righty = int(((cols-x)*vy/vx)+y)
im = cv2.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)

在这里插入图片描述

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

图像处理(十一):轮廓检测 的相关文章

  • OpenCV Mat 和 Leptonica Pix 之间的转换

    我需要在 C 中在 OpenCV Mat 图像和 Leptonica Pix 图像格式之间进行转换 这用于 8 位灰度图像的二值化 我发现发现了 ikaliga的回答 https stackoverflow com a 25929320 2
  • 将 4 通道图像转换为 3 通道图像

    我正在使用 OpenCV 2 4 6 我正在尝试将 4 通道 RGB IplImage 转换为 4 通道 HSV 图像 下面是我的代码 给出错误 OpenCV 错误 未知函数断言失败 我认为 cvCvtColor 支持 3 通道图像 有没有
  • 如何使用 opencv.omnidir 模块对鱼眼图像进行去扭曲

    我正在尝试使用全向模块 http docs opencv org trunk db dd2 namespacecv 1 1omnidir html用于对鱼眼图像进行扭曲处理Python 我正在尝试适应这一点C 教程 http docs op
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • OpenCV VideoWriter 未写入 Output.avi

    我正在尝试编写一段简单的代码来获取视频 裁剪视频并写入输出文件 系统设置 OS Windows 10 Conda Environment Python Version 3 7 OpenCV Version 3 4 2 ffmpeg Vers
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域
  • 如何将多行文本插入到框架/图像中

    我使用 C 和 OpenCV 创建了一个框架 并想在其中插入几行文本 使用以下代码 putText frame My text here cvPoint 30 30 FONT HERSHEY COMPLEX SMALL 0 8 cvScal
  • 将 OpenCV Mat 转换为数组(可能是 NSArray)

    我的 C C 技能很生疏 OpenCV 的文档也相当晦涩难懂 有没有办法获得cv Mat data属性转换为数组 NSArray 我想将其序列化为 JSON 我知道我可以使用 FileStorage 实用程序转换为 YAML XML 但这不
  • opencv_contrib编译错误:类没有成员

    我必须实现 SURF 算法来进行图像拼接 我在使用列出的库时遇到了问题here https stackoverflow com questions 33560251 opencv 3 0 0 ubuntu 14 04 nonfree non
  • 在骨架图像中查找线 OpenCV python

    我有以下图片 我想找到一些线来进行一些计算 平均长度等 我尝试使用HoughLinesP 但它找不到线 我能怎么做 这是我的代码 sk skeleton mask rows cols sk shape imgOut np zeros row
  • opencv中如何去除二值图像噪声?

    将图像转换为二值图像 黑白 后如果有任何噪音怎么办 我消除了那些不需要的噪音 您可以看到下图的黑色区域内有一些白噪声 我该如何去除噪声 使用opencv http img857 imageshack us img857 999 blackn
  • 选择合适的IDE

    您会推荐使用以下哪种 IDE 语言来在 Windows 下开发涉及识别手势并与操作系统交互的项目 我将使用 OpenCV 库来执行图像处理任务 之后 我将使用 win32 API 或 NET 框架与操作系统交互 具体取决于您建议的工具 性能
  • 提取二值图像中的最中心区域

    我正在处理二进制图像 之前使用此代码来查找二进制图像中的最大区域 Use the hue value to convert to binary thresh 20 thresh thresh img cv2 threshold h thre
  • 旋转矩阵openCV

    我想知道如何找到框架中一组特征的旋转矩阵 我会更具体 我有 2 个具有 20 个特征的帧 假设第 1 帧和第 2 帧 我可以估计两个帧中特征的位置 例如 假设位置 x y 处的某个第 1 帧特征 并且我确切地知道它在哪里 所以假设为 x y
  • Haar级联正例图像大小调整

    我正在迈出第一步 为自定义对象识别创建 haar 级联 我花了时间获取大量数据并编写了一些预处理脚本以将视频转换为帧 我的下一步是裁剪感兴趣的对象 以创建一些积极的训练示例 我有几个问题 我确实在网上寻找答案 我有点困惑 我读到我应该致力于
  • 将 CvSeq 保存到数组

    我对 OpenCV 文档有点迷失 我想将 cvFindContours 返回的 CvSeq 保存到一个数组中 据我了解它将返回 CvContour 的 seq 但我找不到它包含的内容 我应该保存其中的哪些部分 稍后我可以迭代它并说调用 cv
  • Python 2.7/OpenCV 3.3: cv2.initUn DistorifyMap 中出现错误。不显示不扭曲的校正图像

    我想扭曲并校正我的立体图像 为此 我在 Python 2 7 中使用了 Opencv 3 3 我使用的代码是 import cv2 import numpy as np cameraMatrixL np load mtx left npy
  • 使用 Racket FFI 进行快速阵列访问

    我正在尝试在 Racket 中编写 OpenCV FFI 并达到了需要有效操作数组的地步 然而 我所有使用 Racket FFI 访问数组的尝试都会导致代码效率非常低 有没有办法使用 FFI 快速访问 C 数组 在 Racket 中 这种类
  • CV_MAT_ELEM 中的编译错误

    调用estimateRigidTransform 的结果是我得到一个名为 trans 的cv Mat 对象 为了检索其包含的矩阵 我尝试以这种方式访问 其元素 for i 0 i lt 2 i for j 0 j lt 3 j mtx j
  • Scalar(0,255,0) 在 opencv 中没有给出绿色线

    我正在尝试在图像上绘制渐变线 我希望我的线条是绿色的 并且我使用标量 0 255 0 不过 我只得到黑色 对于 Scalar 0 0 0 我也变黑了 对于 Scalar 255 255 255 我得到白色 但任何组合都没有其他颜色 部分代码

随机推荐

  • Spring Cloud Alibaba+saas企业架构技术选型+架构全景业务图 + 架构典型部署方案

    基于Spring Cloud Alibaba 分布式微服务高并发数据平台化 中台 思想 多租户saas设计的企业开发架构 支持源码二次开发 支持其他业务系统集成 集中式应用权限管理 支持拓展其他任意子项目 一 架构技术选型 核心框架 Spr
  • 想学linux需要的电脑配置相关

    开始学linux了 加油 我是跟着正点原子的视频学的 左神第一期讲 做linux开发需要的电脑配置 左神自己的配置以及他推荐的配置如下 CPU 性能越强越好 cpu的核越多越好 内存 推荐16G以上 硬盘 500G以上 越大越好 显卡 对显
  • 解决“不是有效的win32应用程序”问题

    解决 不是有效的win32应用程序 问题 帅宏军 用VC2013编译了一个程序 在Windows 8 Windows 7 64位 32位 下都能正常运行 但在Win XP Win2003下运行时 却报错不能运行 具体错误信息为 指定的可执行
  • Dotfuscator 使用图解教程

    Dotfuscator 是 NET混淆器和压缩器 它可以帮助您防止您的应用程序被反编译 同时 它还可以使得您的应用程序更加小巧以及高效 我用的是4 9版本的Dotfuscator Dotfuscator百度云下载链接是 http pan b
  • css基础知识十二:CSS3常见动画有哪些?实现方式?

    一 是什么 CSS动画 CSS Animations 是为层叠样式表建议的允许可扩展标记语言 XML 元素使用CSS的动画的模块 即指元素从一种样式逐渐过渡为另一种样式的过程 常见的动画效果有很多 如平移 旋转 缩放等等 复杂动画则是多个简
  • rocketmq-常见问题总结(消息的顺序、重复、消费模式)

    参考 http www cnblogs com wxd0108 p 6038543 html https www cnblogs com 520playboy p 6750023 html https blog csdn net chunl
  • Android4.4 framework网络管理

    昨晚梦见老家的那条小狗好几天没有回家 担心是不是被人偷去吃了 每天都有一些奇怪的梦 今天总结一下Android4 4 framework网络管理流程 同样 Android5 0这部分改动很大 在此先不介绍Android5 0的情况 整体框架
  • echarts宽度没有撑满父容器 使用的默认宽度

    加载的时候元素的父元素是未创建状态所以没有宽高使用的是默认的宽高 解决方法 让绘制事件在切换页面事件之后执行 然后使用resize进行刷新即可 注意这个点击方法需要同步执行 或者加个延迟都可以解决
  • 数据分析方法-五大理论、分析框架、应用、数据分析作用

    1 统计学理论 1 1 大数定量 定义 指大量重复某一实验时 最后的频率会无限接近于事件的概率 数据的样本量越大 我们预测和计算的概率就越准确 数据的样本量越小 我们预测和计算的概率就越可能失效 举例 某产品用户还只有几百人 就用一个模型来
  • vue在打包,声网sdk,部署上线后,出现未初始化的报错,Agora-SDK [ERROR]: Cannot access ‘e‘ before initialization

    Agora SDK ERROR client c143d subscribe user 74291802 error ReferenceError Cannot access e before initialization 问题原因参考RT
  • freeswitch拨号计划

    拨号计划 Dialplan 是FreeSWITCH中至关重要的一部分 它的主要作用就是对电话进行路由 从这一点上来说 相当于一个路由表 决定和影响通话的流程 说得简明一点 就是当一个用户拨号时 对用户所拨的号码进行分析 进而决定下一步该做什
  • 修改http服务器banner,改变您的HTTP服务器的缺省banner

    引自 https www cnblogs com felixnet p 6344613 html测试可以用 但仅仅是修改的应用程序 http localhost不起作用 https www cnblogs com kowloon p 907
  • 2012.11.19

    转眼间 一个月过去了 约好的缓冲期限为3个月 不能逃避现实了 要相信自己 不为别的 就为今生能完成一件回头想起来有意义的事情 今天进行挖掘机 现在的状况是铲斗绕着P2转动 而不是以前的P1转了 但是 很明显 P1P2没有跟着转事实上 铲斗不
  • php语法分析

    php的语法分析的主要作用是验证词法分析的基础上将token组成的序列 在php这门语言中是否是一个有效的句子 也可以理解为这些token序列是否匹配设计php这门语言时的语法模型 在匹配的情况下构建具体的程序 组建opcode 以供编译后
  • 下载安装微软office的详细步骤

    目录 一 前言 二 下载路径 一 wps office 办公软件下载地址 1 wps office办公软件下载地址 二 微软office 办公软件下载地址 2021 1 专业增强版 2 专业版 3 家庭专业版 4 家庭企业版 三 微软off
  • 华为OD机试 - 猴子爬山(Java)

    题目描述 一天一只顽猴想去从山脚爬到山顶 途中经过一个有个N个台阶的阶梯 但是这猴子有一个习惯 每一次只能跳1步或跳3步 试问猴子通过这个阶梯有多少种不同的跳跃方式 输入描述 输入只有一个整数N 0
  • YOLOv5 训练技巧(四)

    目录 学习率调整策略 训练预热 Warmup 余弦退火调整学习率 CosineAnnealingLR 自动调整锚框 Autoanchor 超参数进化 hyperparameter evolution 自动混合精度训练 断点续训 学习率调整策
  • git常用命令、ssh密钥生成及分支管理

    一 git ssh密钥生成 git ssh git clone git add all git commit m up git ssh 生成 在企业中如果企业中的运维要 那你就给这个pub 文件就对了 git config global u
  • Python处理报数问题

    题目描述 有n人围成一圈 顺序排号 从第1个人开始报数 从1到3报数 凡报到3的人退出圈子 问最后留下的是原来的第几号的那位 输入 初始人数n 输出 最后一人的初始编号 样例输入 3 样例输出 2 这道题目和约瑟夫环有些像 不过比约瑟夫环要
  • 图像处理(十一):轮廓检测

    图像处理笔记总目录 1 图像的轮廓 轮廓可以简单认为成将连续的点 连着边界 连在一起的曲线 具有相同的颜色或者灰度 轮廓是图像目标的外部特征 这种特征对于我们进行图像分析 目标识别和理解等更深层次的处理都有很重要的意义 轮廓提取的基本原理