霍夫圆变换全面解析(OpenCV)
文章目录
- 一、霍夫圆变换基础
- 1.1 霍夫圆变换概述
- 1.2 圆的数学表达与参数化
- 二、霍夫圆变换算法实现
- 2.1 标准霍夫圆变换算法流程
- 2.2 参数空间的表示与优化
- 三、关键参数解析
- 3.1 OpenCV中的HoughCircles参数
- 3.2 参数调优策略
- 四、Python与OpenCV实现参考
- 4.1 基本实现代码
- 4.2 改进版实现与参数自动调优
- 五、应用场景与高级技巧
- 5.1 霍夫圆变换的应用场景
- 5.2 高级优化技巧
- 5.3 常见问题与解决方案
- 六、霍夫圆与其他圆检测方法比较
- 6.1 不同圆检测方法的比较
- 6.2 选择合适的圆检测方法
- 七、未来发展与研究方向
- 7.1 霍夫变换的改进方向
- 7.2 与深度学习的结合
- 专业名词附录表
一、霍夫圆变换基础
1.1 霍夫圆变换概述
霍夫圆变换(Hough Circle Transform)是计算机视觉领域中用于检测图像中圆形物体的一种经典算法。它是霍夫变换(Hough Transform)的一种特殊形式,专门用于识别圆形结构。霍夫变换最初由Paul Hough于1962年提出,主要用于直线检测,后来被Richard Duda和Peter Hart在1972年扩展到检测任意形状,包括圆形。
霍夫变换的核心思想是将图像空间中的点转换到参数空间中进行处理。对于圆形检测,它利用了圆的数学表达式,将边缘点映射到参数空间,通过寻找参数空间中的局部最大值来确定圆的存在及其参数。这种方法对噪声和部分遮挡具有较强的鲁棒性,是图像处理中识别几何形状的有力工具。
1.2 圆的数学表达与参数化
在二维平面上,圆的标准方程为:
( x − a ) 2 + ( y − b ) 2 = r 2 (x - a)^2 + (y - b)^2 = r^2 (x−a)2+(y−b)2=r2
其中:
- ( a , b ) (a, b) (a,b) 是圆心坐标
- r r r 是圆的半径
这个方程表明,圆上的任意点 ( x , y ) (x, y) (x,y) 到圆心 ( a , b ) (a, b) (a,b) 的距离等于半径 r r r。在霍夫圆变换中,我们的目标是根据图像中的边缘点确定未知参数 a a a、 b b b 和 r r r,从而找到可能存在的圆。
与直线霍夫变换不同,圆的参数化需要三个参数(圆心坐标和半径),这使得霍夫空间变成了三维的,计算复杂度随之增加。
二、霍夫圆变换算法实现
2.1 标准霍夫圆变换算法流程
霍夫圆变换的标准实现通常包括以下步骤:
- 图像预处理(灰度转换、降噪)
- 边缘检测(通常使用Canny边缘检测器)
- 累加器空间构建
- 参数空间中寻找局部最大值
- 后处理和筛选结果
在步骤3中,算法为每个边缘点计算可能的圆心位置,并在累加器空间中进行投票。对于每个边缘点和可能的半径值,我们计算可能的圆心坐标,并在对应的累加器单元中增加计数器值。
步骤4寻找累加器空间中的局部最大值,这些峰值对应于图像中最可能存在的圆。峰值越高,说明有更多的边缘点支持该圆的存在。
2.2 参数空间的表示与优化
标准的霍夫圆变换需要三维参数空间 ( a , b , r ) (a, b, r) (a,b,r),计算复杂度较高。为了优化性能,OpenCV等实现通常采用了梯度信息来减少参数空间的维度。
在基于梯度的霍夫圆变换中,除了使用边缘点的位置信息外,还利用了边缘点的梯度方向。梯度方向指向圆心,因此可以根据边缘点的位置和其梯度方向,直接计算可能的圆心位置,而不需要遍历所有可能的半径值,从而将三维搜索空间降为二维。
这种优化方法被称为霍夫梯度法(Hough Gradient Method)或霍夫梯度变换,显著提高了算法的效率,是OpenCV中
cv2.HoughCircles
函数的基础实现。
三、关键参数解析
3.1 OpenCV中的HoughCircles参数
在OpenCV中,cv2.HoughCircles
函数是霍夫圆变换的实现,它包含以下关键参数:
image
: 输入图像,必须是8位单通道灰度图像method
: 检测方法,OpenCV主要支持cv2.HOUGH_GRADIENT
和cv2.HOUGH_GRADIENT_ALT
dp
: 累加器分辨率与图像分辨率的反比minDist
: 检测到的圆之间的最小距离param1
: 用于Canny边缘检测的高阈值param2
: 累加器阈值,用于圆心检测minRadius
: 最小圆半径maxRadius
: 最大圆半径
dp
参数是累加器分辨率与图像分辨率的反比关系。如果dp=1
,则累加器分辨率与输入图像相同;如果dp=2
,则累加器尺寸为输入图像的一半,这可以在一定程度上加速计算,但可能降低精度。
param1
和param2
是算法内部使用的阈值参数。对于HOUGH_GRADIENT
方法,param1
是传递给Canny边缘检测器的高阈值(低阈值被自动设为高阈值的一半),而param2
是累加器阈值,值越小,检测到的圆越多(包括假阳性)。
3.2 参数调优策略
霍夫圆变换的参数调优是一个平衡检测效果与计算效率的过程:
dp
通常设置为1或2,值越大计算越快但精度降低minDist
应根据图像中预期圆的密度来设置,太小会导致重复检测,太大则可能错过圆param1
(Canny阈值)应根据图像对比度和噪声水平调整param2
(累加器阈值)是最重要的参数之一,它直接影响检测灵敏度minRadius
和maxRadius
帮助限制搜索范围,可以根据先验知识设置
参数调优通常是一个迭代过程,需要根据具体图像的特点进行反复测试和调整。一种常见的策略是从较松的参数开始(较低的
param2
和较大的半径范围),然后逐步收紧参数以获得最佳效果。
对于复杂图像,有时需要结合其他预处理技术(如高斯模糊、自适应阈值分割等)来提高霍夫圆变换的效果。
四、Python与OpenCV实现参考
4.1 基本实现代码
下面是使用Python和OpenCV实现霍夫圆检测的基本代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像
img = cv2.imread('circles.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 应用高斯模糊减少噪声,提高检测效果
gray_blurred = cv2.GaussianBlur(gray, (9, 9), 2)# 应用霍夫圆变换
circles = cv2.HoughCircles(gray_blurred, # 输入图像(必须是灰度图)cv2.HOUGH_GRADIENT, # 检测方法dp=1, # 累加器分辨率(相对于图像分辨率的倒数)minDist=20, # 检测到的圆之间的最小距离param1=50, # Canny边缘检测的高阈值param2=30, # 累加器阈值minRadius=1, # 最小圆半径maxRadius=100 # 最大圆半径
)# 绘制检测到的圆
if circles is not None:# 将检测结果转换为整数circles = np.uint16(np.around(circles))# 绘制每个检测到的圆for i in circles[0, :]:# 绘制圆周cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 2)# 绘制圆心cv2.circle(img, (i[0], i[1]), 2, (0, 0, 255), 3)# 显示结果
plt.figure(figsize=(10, 8))
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('Detected Circles')
plt.axis('off')
plt.show()print(f"检测到{len(circles[0]) if circles is not None else 0}个圆")
4.2 改进版实现与参数自动调优
下面是一个更加完善的实现,包含参数自动调优功能:
import cv2
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Sliderdef detect_circles(image_path, dp=1, minDist=30, param1=50, param2=30, minRadius=10, maxRadius=100, blur_size=9):"""使用霍夫圆变换检测图像中的圆参数:image_path: 图像路径dp: 累加器分辨率与图像分辨率的反比minDist: 检测到的圆之间的最小距离param1: Canny边缘检测的高阈值param2: 累加器阈值minRadius: 最小圆半径maxRadius: 最大圆半径blur_size: 高斯模糊核大小返回:原始图像和标记了检测结果的图像"""# 读取图像img = cv2.imread(image_path)if img is None:raise ValueError(f"无法读取图像: {image_path}")img_copy = img.copy()gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 应用高斯模糊blur_size = blur_size if blur_size % 2 == 1 else blur_size + 1 # 确保是奇数gray_blurred = cv2.GaussianBlur(gray, (blur_size, blur_size), 2)# 应用霍夫圆变换circles = cv2.HoughCircles(gray_blurred,cv2.HOUGH_GRADIENT,dp=dp,minDist=minDist,param1=param1,param2=param2,minRadius=minRadius,maxRadius=maxRadius)# 绘制检测到的圆if circles is not None:circles = np.uint16(np.around(circles))for i in circles[0, :]:# 绘制圆周cv2.circle(img_copy, (i[0], i[1]), i[2], (0, 255, 0), 2)# 绘制圆心cv2.circle(img_copy, (i[0], i[1]), 2, (0, 0, 255), 3)return img, img_copy, circlesdef interactive_circle_detection(image_path):"""创建交互式界面来调整霍夫圆变换的参数"""# 初始参数initial_params = {'dp': 1,'minDist': 30,'param1': 50,'param2': 30,'minRadius': 10,'maxRadius': 100,'blur_size': 9}# 初始检测original, detected, circles = detect_circles(image_path, **initial_params)# 创建图形界面fig, ax = plt.subplots(1, 2, figsize=(15, 8))fig.subplots_adjust(bottom=0.35)# 显示原图和检测结果ax[0].imshow(cv2.cvtColor(original, cv2.COLOR_BGR2RGB))ax[0].set_title('原始图像')ax[0].axis('off')detected_plot = ax[1].imshow(cv2.cvtColor(detected, cv2.COLOR_BGR2RGB))ax[1].set_title(f'检测到的圆: {len(circles[0]) if circles is not None else 0}')ax[1].axis('off')# 创建滑块axdp = plt.axes([0.25, 0.25, 0.65, 0.03])axminDist = plt.axes([0.25, 0.22, 0.65, 0.03])axparam1 = plt.axes([0.25, 0.19, 0.65, 0.03])axparam2 = plt.axes([0.25, 0.16, 0.65, 0.03])axminRadius = plt.axes([0.25, 0.13, 0.65, 0.03])axmaxRadius = plt.axes([0.25, 0.10, 0.65, 0.03])axblur = plt.axes([0.25, 0.07, 0.65, 0.03])# 定义滑块sdp = Slider(axdp, 'dp', 0.5, 5.0, valinit=initial_params['dp'], valstep=0.5)sminDist = Slider(axminDist, 'minDist', 1, 100, valinit=initial_params['minDist'], valstep=1)sparam1 = Slider(axparam1, 'param1', 10, 200, valinit=initial_params['param1'], valstep=1)sparam2 = Slider(axparam2, 'param2', 1, 100, valinit=initial_params['param2'], valstep=1)sminRadius = Slider(axminRadius, 'minRadius', 1, 50, valinit=initial_params['minRadius'], valstep=1)smaxRadius = Slider(axmaxRadius, 'maxRadius', 10, 300, valinit=initial_params['maxRadius'], valstep=5)sblur = Slider(axblur, 'blur_size', 3, 21, valinit=initial_params['blur_size'], valstep=2)# 更新函数def update(val):# 获取当前参数params = {'dp': sdp.val,'minDist': sminDist.val,'param1': sparam1.val,'param2': sparam2.val,'minRadius': sminRadius.val,'maxRadius': smaxRadius.val,'blur_size': int(sblur.val)}# 重新检测圆_, detected, circles = detect_circles(image_path, **params)# 更新图像detected_plot.set_data(cv2.cvtColor(detected, cv2.COLOR_BGR2RGB))ax[1].set_title(f'检测到的圆: {len(circles[0]) if circles is not None else 0}')fig.canvas.draw_idle()# 注册更新函数sdp.on_changed(update)sminDist.on_changed(update)sparam1.on_changed(update)sparam2.on_changed(update)sminRadius.on_changed(update)smaxRadius.on_changed(update)sblur.on_changed(update)plt.show()# 使用示例
# interactive_circle_detection('circles.jpg')
五、应用场景与高级技巧
5.1 霍夫圆变换的应用场景
霍夫圆变换在多个领域有广泛应用:
- 工业检测:检测产品中的圆形缺陷或特征
- 医学影像:检测细胞、瞳孔、血管横截面等
- 自动驾驶:交通标志识别
- 机器人视觉:物体识别和定位
- 航空航天:卫星图像分析中的特征检测
在工业检测中,霍夫圆变换常用于检测产品的圆形特征,如齿轮、轴承、管道截面等。算法的鲁棒性使其能够在不理想的光照条件和部分遮挡情况下仍能有效工作。
在医学影像分析中,霍夫圆变换可用于检测细胞轮廓、眼底血管等圆形或近似圆形结构,辅助医生进行疾病诊断。
5.2 高级优化技巧
针对霍夫圆变换的高级优化技巧包括:
- 多尺度检测:在不同分辨率下进行检测,合并结果
- 边缘预处理优化:使用更先进的边缘检测方法
- 累加器空间分析:使用更复杂的峰值检测算法
- 并行计算:利用GPU加速霍夫变换计算
- 结合机器学习:使用机器学习方法过滤误报
多尺度检测特别适用于尺寸差异较大的圆形检测。通过在图像金字塔的不同层级应用霍夫圆变换,可以有效地检测出不同大小的圆,然后将结果合并。
对于复杂场景,可以结合传统的霍夫圆变换和深度学习方法。例如,使用深度学习对边缘检测结果进行优化,或使用神经网络过滤霍夫变换的误报结果。
5.3 常见问题与解决方案
霍夫圆变换在实际应用中可能遇到的问题及解决方案:
- 圆不完整:降低累加器阈值,使用形态学操作辅助
- 误报过多:增加累加器阈值,调整minDist
- 计算效率低:限制半径范围,使用梯度法
- 同心圆检测难题:结合图像分割或多次检测策略
- 椭圆误检为圆:考虑使用霍夫椭圆变换
对于圆不完整的情况,可以先对图像进行形态学闭操作,填充边缘的小间隙,然后再应用霍夫圆变换。另一种方法是降低累加器阈值
param2
,但这可能会增加误报。
对于同心圆检测问题,一种解决方案是先检测最显著的圆,然后将其从边缘图中移除,再进行下一轮检测。这种迭代方法可以逐个识别同心圆。
六、霍夫圆与其他圆检测方法比较
6.1 不同圆检测方法的比较
霍夫圆变换与其他圆检测方法的比较:
- 霍夫圆变换:鲁棒性强,支持不完整圆,计算复杂度高
- 轮廓分析法:计算效率高,对噪声敏感
- 基于区域的方法:适用于填充圆,对遮挡敏感
- 深度学习方法:需要训练数据,泛化能力强
- 模板匹配:简单直接,但尺度和旋转变化会影响效果
霍夫圆变换的主要优势在于其处理不完整圆和噪声环境的能力。即使只有部分圆弧可见,也能正确检测圆的参数。相比之下,轮廓分析方法需要较完整的边缘信息,在边缘断开的情况下表现较差。
深度学习方法如基于卷积神经网络的圆检测,在有足够训练数据的情况下,可以学习到更复杂的特征表示,处理更复杂的场景,但缺乏霍夫变换的数学严谨性和可解释性。
6.2 选择合适的圆检测方法
选择合适的圆检测方法需要考虑以下因素:
- 图像质量和噪声水平
- 圆的完整性
- 计算资源限制
- 实时性要求
- 是否需要精确的参数估计
对于高质量图像中的完整圆,轮廓分析或区域生长法通常更高效。对于噪声大、圆不完整或存在遮挡的复杂场景,霍夫圆变换是更可靠的选择。
在计算资源有限的嵌入式系统中,可以考虑使用优化后的霍夫变换或更轻量级的方法。而在离线分析的场景中,可以结合多种方法以获得最佳效果。
七、未来发展与研究方向
7.1 霍夫变换的改进方向
霍夫圆变换的未来发展和改进方向包括:
- 智能参数自适应:根据图像特性自动调整参数
- 基于深度学习的霍夫空间分析
- 实时霍夫变换算法优化
- 三维霍夫变换用于检测球体
- 结合概率模型提高精度
参数自适应是一个重要研究方向,目前的霍夫圆变换需要手动调整多个参数,这在实际应用中不够灵活。研究人员正在探索如何根据图像特性自动选择最优参数。
三维霍夫变换的研究使得霍夫变换技术能够扩展到三维空间,用于检测球体、圆柱体等三维几何形状,这在医学影像和计算机视觉领域有重要应用。
7.2 与深度学习的结合
霍夫变换与深度学习的结合是当前研究热点:
- 深度霍夫变换:将霍夫变换嵌入深度学习架构
- 神经网络辅助的参数预测
- 端到端的可微分霍夫变换层
- 注意力机制指导的霍夫变换
- 自监督学习改进霍夫空间表示
深度霍夫变换(Deep Hough Transform)将传统霍夫变换的思想与深度学习结合,通过神经网络学习更好的特征表示,提高检测精度。
可微分霍夫变换层允许霍夫变换嵌入到端到端的深度学习模型中,使得整个模型可以通过反向传播进行优化,这为传统计算机视觉算法与深度学习的结合提供了新思路。
专业名词附录表
A
- 累加器空间(Accumulator Space):霍夫变换中用于计数的参数空间,每个单元表示一组特定的参数值。
- 自适应阈值(Adaptive Thresholding):根据图像的局部特性动态调整阈值的方法。
B
- 二值化(Binarization):将灰度图像转换为只有黑白两种颜色的过程。
C
- Canny边缘检测(Canny Edge Detection):一种多阶段边缘检测算法,常用于霍夫变换的预处理步骤。
- 圆检测(Circle Detection):识别图像中圆形结构的过程。
- 累加器计数(Accumulator Count):累加器空间中的值,表示支持某组参数的边缘点数量。
D
- dp参数(dp Parameter):霍夫圆变换中累加器分辨率与图像分辨率的反比参数。
E
- 边缘检测(Edge Detection):识别图像中亮度急剧变化区域的处理技术。
- 椭圆检测(Ellipse Detection):霍夫变换的扩展,用于检测椭圆形状。
F
- 假阳性(False Positive):算法错误地检测出不存在的圆。
G
- 梯度(Gradient):图像中强度变化的方向和幅度。
- 梯度方向(Gradient Direction):图像中局部强度变化最大的方向。
- 高斯模糊(Gaussian Blur):使用高斯函数对图像进行模糊处理的技术。
H
- 霍夫变换(Hough Transform):一种特征提取技术,用于检测图像中的几何形状。
- 霍夫空间(Hough Space):参数空间,用于霍夫变换中表示可能的几何形状。
- 霍夫圆变换(Hough Circle Transform):专门用于检测圆形的霍夫变换变体。
I
- 图像分割(Image Segmentation):将图像分割成多个区域的过程。
L
- 局部最大值(Local Maxima):累加器空间中的峰值点,对应于检测到的圆。
M
- minDist参数(minDist Parameter):霍夫圆变换中检测到的圆之间的最小距离参数。
- 多尺度检测(Multi-scale Detection):在不同尺度或分辨率下进行检测的技术。
N
- 噪声(Noise):图像中不需要的信息,干扰图像分析。
O
- OpenCV:开源计算机视觉库,提供霍夫圆变换的实现。
P
- param1参数(param1 Parameter):霍夫圆变换中用于Canny边缘检测的高阈值。
- param2参数(param2 Parameter):霍夫圆变换中的累加器阈值。
- 参数空间(Parameter Space):描述几何形状的参数的多维空间。
R
- 半径(Radius):圆的特征参数,从圆心到圆周的距离。
- 鲁棒性(Robustness):算法对噪声和变化的抵抗能力。
T
- 阈值(Threshold):用于区分前景和背景的强度值。
- 三维霍夫空间(3D Hough Space):用于圆检测的三维参数空间,包括圆心坐标和半径。
V
- 投票过程(Voting Process):霍夫变换中,每个边缘点为可能的参数组合"投票"的过程。
相关文章:
霍夫圆变换全面解析(OpenCV)
文章目录 一、霍夫圆变换基础1.1 霍夫圆变换概述1.2 圆的数学表达与参数化 二、霍夫圆变换算法实现2.1 标准霍夫圆变换算法流程2.2 参数空间的表示与优化 三、关键参数解析3.1 OpenCV中的HoughCircles参数3.2 参数调优策略 四、Python与OpenCV实现参考4.1 基本实现代码4.2 改进…...
互联网大厂Java求职面试:优惠券服务架构设计与AI增强实践-4
互联网大厂Java求职面试:优惠券服务架构设计与AI增强实践-4 场景设定 面试官:某互联网大厂技术总监,拥有超过10年大型互联网企业一线技术管理经验,擅长分布式架构、微服务治理、云原生等领域。 候选人:郑薪苦&#…...
项目中会出现的css样式
1.重复渐变边框 思路: 主要是用重复的背景渐变实现的 如图: <div class"card"><div class"container">全面收集中医癌毒临床医案,建立医案共享机制,构建癌毒病机知识图谱,便于医疗人…...
LeetCode[101]对称二叉树
思路: 对称二叉树是左右子树对称,而不是左右子树相等,所以假设一个树只有3个节点,那么判断这个数是否是对称二叉树,肯定是先判断左右两个树,然后再看根节点,这样递归顺序我们就确认了࿰…...
黑马k8s(四)
1.资源管理介绍 本章节主要介绍yaml语法和kubernetes的资源管理方式 2.YAML语言介绍 3.资源管理方式 命令式对象管理 dev下删除了pod,之后发现还有pod,把原来的pod删除了,重新启动了一个 命令式对象配置 声明式对象配置 命令式对象配置&…...
华为ensp实现跨vlan通信
要在网络拓扑中实现主机192.168.1.1、192.168.1.2和192.168.2.1之间的互相通信,需要正确配置交换机(S5700)和路由器(AR3260),以确保不同网段之间的通信(即VLAN间路由)。 网络拓扑分析…...
TCPIP详解 卷1协议 十 用户数据报协议和IP分片
10.1——用户数据报协议和 IP 分片 UDP是一种保留消息边界的简单的面向数据报的传输层协议。它不提供差错纠正、队列管理、重复消除、流量控制和拥塞控制。它提供差错检测,包含我们在传输层中碰到的第一个真实的端到端(end-to-end)校验和。这…...
Java笔记4
第一章 static关键字 2.1 概述 以前我们定义过如下类: public class Student {// 成员变量public String name;public char sex; // 男 女public int age;// 无参数构造方法public Student() {}// 有参数构造方法public Student(String a) {} }我们已经知道面向…...
Matlab 垂向七自由度轨道车辆开关型半主动控制
1、内容简介 Matlab 229-垂向七自由度轨道车辆开关型半主动控制 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
Matlab 短时交通流预测AR模型
1、内容简介 Matlab 230-短时交通流预测AR模型 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略城市道路短时交通流预测.pdf...
MYSQL之表的约束
表中真正约束字段的是数据类型, 但是只有数据类型约束就很单一, 也需要有一些额外的约束, 从而更好的保证数据的合法性, 从业务逻辑角度保证数据的正确性. 比如有一个字段是email, 要求是唯一的. 为什么要有表的约束? 表的约束: 表中一定要有各种约束, 通过约束, 让我们未来…...
使用ACE-Step在本地生成AI音乐
使用ACE-Step v1-3.5B开源模型从文本提示、标签和歌词创建完整的AI生成歌曲 — 无需云服务,无需API,仅需您的GPU。 这是由ACE Studio和StepFun开发的开源音乐生成模型。 在对数据隐私和云服务依赖性日益增长的担忧时代,ACE-Step将强大的文本转音乐生成完全离线,使其成为A…...
web 自动化之 Unittest 四大组件
文章目录 一、如何开展自动化测试1、项目需求分析,了解业务需求 web 功能纳入自动化测试2、选择何种方式实现自动化测试 二、Unittest 框架三、TestCase 测试用例四、TestFixture 测试夹具 执行测试用例前的前置操作及后置操作五、TestSuite 测试套件 & TestLoa…...
2025年渗透测试面试题总结-渗透测试红队面试七(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 渗透测试红队面试七 一百八十一、Shiro漏洞类型,721原理,721利用要注意什么&am…...
Mysql的索引,慢查询和数据库表的设计以及乐观锁和悲观锁
设计高性能数据表的原则 数据库设计经验和技巧 单张数据表的字段不宜过多(20个),如果确实存在大量field,考虑拆成多张表或json text存储 数据表字段都是not null的,即使没有数据,最好也使用无意义的值填充,…...
day012-软件包管理专题
文章目录 1. 生成随机密码2. 软件包管理2.1 类红帽系统2.1.1 安装软件包2.1.2 查找软件包2.1.3 查看软件包内容2.1.4 查看命令或文件属于哪个软件包2.1.5 重新安装软件包2.1.6 删除软件包2.1.7 升级2.1.8 rpm安装软件包2.1.9 rpm升级软件包2.1.10 rpm检查软件包文件是否改变 3.…...
学习黑客5 分钟深入浅出理解Windows Firewall
5 分钟深入浅出理解Windows Firewall 🔥 大家好!今天我们将探索Windows防火墙——这是Windows操作系统中的核心安全组件,负责控制进出计算机的网络流量。无论你是计算机初学者,还是在TryHackMe等平台上学习网络安全的爱好者&…...
node .js 启动基于express框架的后端服务报错解决
问题: node .js 用npm start 启动基于express框架的后端服务报错如下: /c/Program Files/nodejs/npm: line 65: 26880 Segmentation fault "$NODE_EXE" "$NPM_CLI_JS" "$" 原因分析: 遇到 /c/Program F…...
feign.RequestInterceptor 简介-笔记
1. feign.RequestInterceptor 简介 Feign 是一个声明式 Web 服务客户端,用于简化 HTTP 请求的编写与管理。feign.RequestInterceptor 是 Feign 提供的一个接口,用于在请求发出之前对其进行拦截和修改。这在微服务架构中非常有用,比如在请求中…...
软考错题(四)
在程序执行过程中,高速缓存cache与主存间的地址映射由硬件自动完成 以下关于两个浮点数相加运算的叙述中,正确的是首先进行对阶,阶码小的向阶码大的对齐 认证只能阻止主动攻击不能阻止被动攻击 BGP是外部网关协议 查看端口信息࿱…...
SSRF相关
SSRF(Server Side Request Forgery,服务器端请求伪造),攻击者以服务器的身份发送一条构造好的请求给服务器所在地内网进行探测或攻击。 产生原理: 服务器端提供了能从其他服务器应用获取数据的功能,如从指定url获取网页内容、加载指定地址的图…...
供应链学习
供应链安全 供应链:整个业务系统中的节点(一般是上游节点) 乙方一般提供资源:人 软件 硬件 服务 如何寻找供应链 1.招投标信息:寻标包 例如:烟草 智能办公 2.网站本身指纹 例如: powered by xxx…...
力扣HOT100之二叉树:226. 翻转二叉树
这道题很简单,用递归来做,对于一个根节点来说,有两种情况我们不需要翻转:一是根节点为空,二是根节点为叶子节点。这很容易理解,当传入的节点不满足上面的两种情况时,我们就需要做一个翻转&#…...
如何让rabbitmq保存服务断开重连?保证高可用?
在 Spring Boot 集成 RabbitMQ 时,可以通过以下几种方式让 RabbitMQ 保存服务断开重连,以保证高可用: 配置自动重连 application.properties 配置 :在 Spring Boot 的配置文件 application.properties 中,可以设置 Ra…...
TCPIP详解 卷1协议 九 广播和本地组播(IGMP 和 MLD)
9.1——广播和本地组播(IGMP 和 MLD) IPv4可以使用4种IP地址:单播(unicast)、任播(anycast)、组播(multicast)和广播(broadcast)。 IPv6可以使用…...
全球变暖-bfs
1.不沉的就是4个方向没有海,一个大岛屿有一个不沉就行了,其余染色就好了 2.第一个bfs来统计总岛屿个数 3.第二个来统计不沉岛屿个数 4.一减就ac啦 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typede…...
DDD领域驱动开发
1. 现象: 软件设计质量最高的时候是第一次设计的那个版本(通常是因为第一次设计时,业务技术沟通最充分,从业务技术整体视角出发设计系统)。当第一个版本设计上线以后就开始各种需求变更,这常常又会打乱原有的设计。 2…...
【HarmonyOS 5】鸿蒙App Linking详解
【HarmonyOS 5】鸿蒙App Linking详解 一、前言 HarmonyOS 的 App Linking 功能为开发者提供了一个强大的工具,通过创建跨平台的深度聚合链接,实现用户在不同场景下的无缝跳转,极大地提升了用户转化率和应用的可用性。 其安全性、智能路由和…...
Android Studio 中 build、assemble、assembleDebug 和 assembleRelease 构建 aar 的区别
上一篇:Tasks中没有build选项的解决办法 概述: 在构建 aar 包时通常会在下面的选项中进行构建,但是对于如何构建,选择哪种方式构建我还是处于懵逼状态,所以我整理了一下几种构建方式的区别以及如何选择。 1. build…...
【爬虫】12306查票
城市代码: 没有加密,关键部分: 完整代码: import json import requests with open(rE:\学习文件夹(关于爬虫)\项目实战\12306\城市代码.json,r,encodingutf-8) as f:city_codef.read() city json.loads(c…...
火山RTC 7 获得远端裸数据
一、获得远端裸数据 1、获得h264数据 1)、远端编码后视频数据监测器 /*** locale zh* type callback* region 视频管理* brief 远端编码后视频数据监测器<br>* 注意:回调函数是在 SDK 内部线程(非 UI 线程)同步抛出来的&a…...
请求参数:Header 参数,Body 参数,Path 参数,Query 参数分别是什么意思,什么样的,分别通过哪个注解获取其中的信息
在API开发中(如Spring Boot),请求参数可以通过不同方式传递,对应不同的注解获取。以下是 Header参数、Body参数、Path参数、Query参数 的区别及对应的注解: Header 参数 • 含义:通过HTTP请求头&#x…...
【Web/HarmonyOS】采用ArkTS+Web组件开发网页嵌套的全屏应用
文章目录 1、简介2、效果3、在ArkTs上全屏Web3.1、创建ArkTS应用3.2、修改模块化配置(module.json5)3.3、修改系统栏控制(ArkTS代码) 4、双网页嵌套Web实现5、ArkTSWeb技术架构的演进 1、简介 在鸿蒙应用开发领域,技术…...
Leetcode (力扣)做题记录 hot100(34,215,912,121)
力扣第34题:在排序数组中查找第一个数和最后一个数 34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode) class Solution {public int[] searchRange(int[] nums, int target) {int left 0;int right nums.length - 1;int[…...
Babylon.js学习之路《三、创建你的第一个 3D 场景:立方体、球体与平面》
文章目录 1. 引言:从零构建一个 3D 场景1.1 目标与成果预览1.2 前置条件 2. 初始化 Babylon.js 场景2.1 创建 HTML 骨架2.2 初始化引擎与场景 3. 创建基础几何体3.1 立方体(Box)3.2 球体(Sphere)3.3 平面(P…...
Go 语言即时通讯系统开发日志-day1:从简单消息收发 Demo 起步
Go语言即时通讯系统开发日志day1,主要模拟实现的一个简单的发送消息和接受消息的小demo,因为也才刚学习go语言的语法,对go的json、net/http库了解不多,所以了解了一下go语言的encoding/json库和net/http库,以及websock…...
AAAI-2025 | 中科院无人机导航新突破!FELA:基于细粒度对齐的无人机视觉对话导航
作者:Yifei Su, Dong An, Kehan Chen, Weichen Yu, Baiyang Ning, Yonggen Ling, Yan Huang, Liang Wang 单位:中国科学院大学人工智能学院,中科院自动化研究所模式识别与智能系统实验室,穆罕默德本扎耶德人工智能大学࿰…...
中科院无人机导航物流配送的智能变革!LogisticsVLN:基于无人机视觉语言导航的低空终端配送系统
作者:Xinyuan Zhang, Yonglin Tian, Fei Lin, Yue Liu, Jing Ma, Kornlia Sra Szatmry, Fei-Yue Wang 单位:中国科学院大学人工智能学院,中科院自动化研究所多模态人工智能系统国家重点实验室,澳门科技大学创新工程学院工程科学系…...
IP协议、以太网包头及UNIX域套接字
IP协议、以太网包头及UNIX域套接字 IP包头结构 IP协议是互联网的核心协议之一,其包头包含了丰富的信息来控制数据包的传输。让我们详细解析IPv4包头结构: 4位版本号(version):标识IP协议版本,IPv4值为4 4位首部长度(header len…...
普林斯顿数学三剑客读本分析。
这几天看了普斯林顿数学三剑客,主要看了微积分、概率论前半部分,数学分析看了目录,大体略读了一下。怎么说呢,整体上来看,是很不错的,适合平常性阅读,配套结合国内教材习题来深入还是很不错的。…...
Matlab 模糊pid的液压舵机伺服系统
1、内容简介 Matlab 235-模糊pid的液压舵机伺服系统 可以交流、咨询、答疑 2、内容说明 略 舵机是轮船,客机等机器控制系统的重要组成部分,是客机,战斗机等飞行器操作系统的关键部件,也是一种超高的精度的位置伺服系统ÿ…...
Linux基础命令之目录管理——了解各种操作文件目录的命令,万字教学,超详细!!!(1)
文章目录 前言1、Linux文件系统1.1 核心特点1.2 重要目录结构1.3 文件类型1.4 文件和目录的命名规则1.5 文件与目录的定位方式 2、查看目录或文件的详细信息(ls)2.1 基本语法2.2 常用操作2.3 高级用法 3、切换目录(cd)3.1 常用操作…...
中国黄土高原中部XF剖面磁化率和粒度数据
时间分辨率:1000年 < x空间分辨率为:空共享方式:申请获取数据大小;35.75 KB数据时间范围:743-0 ka元数据更新时间:2023-08-15 数据集摘要 该数据集包括中国黄土高原中部XF剖面磁化率和粒度数据。将所有…...
tabs切换#
1、html <el-tabs v-model"tabValue" tab-change"handleTabClick"><el-tab-pane label"集群" name"1"></el-tab-pane><el-tab-pane label"节点" name"2"></el-tab-pane></el-ta…...
免费Office图片音频高效提取利器
软件介绍 今天要给大家介绍一款非常好用的Office文档图片及音频提取工具,它不仅好用,而且完全免费,没有任何广告。 软件概况 这款名为Office File Picture Extractor(PPT图片提取)的软件,大小仅有4MB。打…...
迁移 Visual Studio Code 设置和扩展到 VSCodium
本文同步发布在个人博客 迁移 Visual Studio Code 设置和扩展到 VSCodium - 萑澈的寒舍https://hs.cnies.org/archives/vscodium-migrateVisual Studio Code(以下简称 VS Code)无疑是当下最常用的代码编辑器。尽管微软的 VS Code 源代码采用 MIT 协议开…...
1.7 方向导数
(底层逻辑演进脉络)从"单车道"到"全路网"的导数进化史: 一、偏导数奠基(1.6核心) 诞生背景:多元函数分析需求 当变量间存在耦合关系时(如房价面积单价装修成本)…...
深入理解目标检测中的关键指标及其计算方法
深入理解目标检测中的关键指标及其计算方法 在目标检测领域,评估模型性能时,我们通常会关注几个关键指标,这些指标帮助我们量化模型的准确性和有效性。本文将详细介绍这些常见指标及其计算方法,帮助你更好地理解和评估目标检测模…...
Ollama+OpenWebUI+docker完整版部署,附带软件下载链接,配置+中文汉化+docker源,适合内网部署,可以局域网使用
前言: 因为想到有些环境可能没法使用外网的大模型,所以可能需要内网部署,看了一下ollama适合小型的部署,所以就尝试了一下,觉得docker稍微简单一点,就做这个教程的,本文中重要的内容都会给下载…...
【Redis实战篇】分布式锁-Redisson
1. 分布式锁-redisson功能介绍 基于setnx实现的分布式锁存在下面的问题: 重入问题: 重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如HashTable这样的代码中,他的方法都…...