Halcon测量专栏-圆度

news2024/11/18 23:37:49

1.前言

1.1什么是圆度

圆度是指工件的横截面接近理论圆的程度,最大半径与最小半径之差为0时,圆度为0,测量工具为圆度仪,用途是测环形工件的圆度。圆度是限制实际圆对理想圆变动量的一项指标,其公差带是以公差值t为半径差的两同心圆之间的区域。圆度公差属于形状公差,圆度误差值不大于相应的公差值,则认为合格

1.2圆度评价方式

最小外接圆法:只适用于外圆。以包容被测圆轮廓且半径为最小的外接圆圆心为圆心,所作包容被测圆轮廓的两同心圆半径差即为圆度误差。
最大内接圆法:只适用于内圆。以内接于被测圆轮廓且半径为最大的内接圆圆心为圆心,所作包容被测圆轮廓两同心圆的半径差即为圆度误差。

1.3halcon实现方式

针对圆度的评价方式进行圆度测量。1:先对初始圆进行圆形测量,精准的判断出当前圆的圆心坐标,和半径。2:根据圆心坐标和半径,以2度的角度为间隔进行圆形测量矩形逐个测量,用于判断圆度的误差

2.halcon程序

2.1halcon程序

read_image (Image, 'D:/1NewWork/work/2.26/屏幕截图 2024-02-29 171735.png')
*创建圆ROI
gen_circle (ROI_0, 268.42, 263.387, 198.583)
**************************************进行圆形测量******************
create_metrology_model (MetrologyHandle)
add_metrology_object_generic (MetrologyHandle, 'circle', [268.42, 263.387, 198.583], 50, 5, 2, 30, [], [], test1)
*将句柄添加在图像中
set_metrology_object_param (MetrologyHandle, 'all', ['measure_transition','measure_select'], ['uniform','first'])
    set_metrology_object_param (MetrologyHandle, 'all', ['min_score'], [0.5])
apply_metrology_model (Image, MetrologyHandle)
get_metrology_object_result (MetrologyHandle, 'all', 'all', 'used_edges', 'row', UsedRow)
get_metrology_object_result (MetrologyHandle, 'all', 'all', 'used_edges', 'column', UsedColumn)
*生成测量矩形
get_metrology_object_measures (Contours, MetrologyHandle, 'all', 'all', Row1, Column1)
*创建测量矩形中点
gen_cross_contour_xld (UsedEdges, UsedRow, UsedColumn, 10, 0)
*创建圆形
get_metrology_object_result_contour (ResultContours, MetrologyHandle, 'all', 'all', 1.5)
dev_display (Image)
dev_display (UsedEdges)
dev_display (Contours)
dev_display (ResultContours)
*对结果类型进行获取,获取角度,中心X值和Y值
*RadiusC1角度值,Row9行坐标,column9纵坐标
get_metrology_object_result (MetrologyHandle, test1, 'all', 'result_type', 'radius', RadiusC1)
get_metrology_object_result (MetrologyHandle, test1, 'all', 'result_type', 'row', Row9)
get_metrology_object_result (MetrologyHandle, test1, 'all', 'result_type', 'column', column9)
get_metrology_object_result (MetrologyHandle, test1, 'all', 'result_type', 'score', score)

*创建圆形轮廓
Dis:=[]
row:=[]
column:=[]
*存储最大圆度偏差
Circle_Max:=0
*创建显示参数
gen_empty_obj (EmptyObject)
gen_empty_obj (EmptyObject2)
get_image_size (Image, Width, Height)
*绘制圆状测量矩形
for Index := 0 to 180 by 1
    tuple_sin(rad(Index*2),Sin)
    tuple_cos(rad(Index*2),Cos)
    *创建测量矩形
    gen_measure_rectangle2 (Row9+RadiusC1*Sin, column9+RadiusC1*Cos, -Index*3.1415926/180*2, 50, 5, Width, Height, 'nearest_neighbor', MeasureHandle)
    *绘制测量矩形轮廓用于显示
    gen_rectangle2_contour_xld (Rectangle,Row9+RadiusC1*Sin, column9+RadiusC1*Cos, -Index*3.1415926/180*2, 50, 5)
    *开启测量
    measure_pos (Image, MeasureHandle, 2, 20, 'all', 'first', RowEdge, ColumnEdge, Amplitude, Distance)
    *绘制测量结果
    gen_cross_contour_xld (Cross, RowEdge, ColumnEdge, 20, 1)
    concat_obj (Cross, EmptyObject, EmptyObject)
    concat_obj (EmptyObject2, Rectangle, EmptyObject2)
    distance_pp (RowEdge, ColumnEdge, Row9, column9, Distance1)
    *输出差值数组
    Dis:=[Dis,Distance1-RadiusC1]
    row:=[row,RowEdge]
    column:=[column,ColumnEdge]
endfor

tuple_max (Dis, Max)
tuple_min (Dis, Min)
tuple_abs (Min, Abs)
if (Max>=Abs)
    Circle_Max:=Max
else
    Circle_Max:=Abs
endif
dev_display (Image)
dev_display (EmptyObject2)
dev_display (EmptyObject)   

2.2halcon程序讲解

2.2.1读取图像和绘制ROI

read_image (Image, 'D:/1NewWork/work/2.26/屏幕截图 2024-02-29 171735.png')
*创建圆ROI
gen_circle (ROI_0, 268.42, 263.387, 198.583)
**************************************进行圆形测量******************
create_metrology_model (MetrologyHandle)
add_metrology_object_generic (MetrologyHandle, 'circle', [268.42, 263.387, 198.583], 50, 5, 2, 30, [], [], test1)
*将句柄添加在图像中

在这里插入图片描述
绘制ROI时,应该尽可能的绘制完好,贴合圆形。但是如何绘制不好时也没有问题,在下一步圆形测量中会对ROI的坐标进行矫正。

2.2.2圆形测量矫正

**************************************进行圆形测量******************
create_metrology_model (MetrologyHandle)
add_metrology_object_generic (MetrologyHandle, 'circle', [268.42, 263.387, 198.583], 50, 5, 2, 30, [], [], test1)
*将句柄添加在图像中
*
set_metrology_object_param (MetrologyHandle, 'all', ['measure_transition','measure_select'], ['uniform','first'])
set_metrology_object_param (MetrologyHandle, 'all', ['min_score'], [0.5])
apply_metrology_model (Image, MetrologyHandle)
get_metrology_object_result (MetrologyHandle, 'all', 'all', 'used_edges', 'row', UsedRow)
get_metrology_object_result (MetrologyHandle, 'all', 'all', 'used_edges', 'column', UsedColumn)
*生成测量矩形
get_metrology_object_measures (Contours, MetrologyHandle, 'all', 'all', Row1, Column1)
*创建测量矩形中点
gen_cross_contour_xld (UsedEdges, UsedRow, UsedColumn, 10, 0)
*创建圆形
get_metrology_object_result_contour (ResultContours, MetrologyHandle, 'all', 'all', 1.5)
dev_display (Image)
dev_display (UsedEdges)
dev_display (Contours)
dev_display (ResultContours)
*对结果类型进行获取,获取角度,中心X值和Y值
*RadiusC1角度值,Row9行坐标,column9纵坐标
get_metrology_object_result (MetrologyHandle, test1, 'all', 'result_type', 'radius', RadiusC1)
get_metrology_object_result (MetrologyHandle, test1, 'all', 'result_type', 'row', Row9)
get_metrology_object_result (MetrologyHandle, test1, 'all', 'result_type', 'column', column9)
*获取圆分数
get_metrology_object_result (MetrologyHandle, test1, 'all', 'result_type', 'score', score)

对获取到的ROI进行圆形测量,用于对圆ROI的矫正,和获取到基准测量圆。

2.2.3圆度差值检测


*创建圆形轮廓
Dis:=[]
row:=[]
column:=[]
*存储最大圆度偏差
Circle_Max:=0
*创建显示参数
gen_empty_obj (EmptyObject)
gen_empty_obj (EmptyObject2)
get_image_size (Image, Width, Height)
*绘制圆状测量矩形
for Index := 0 to 180 by 1
    tuple_sin(rad(Index*2),Sin)
    tuple_cos(rad(Index*2),Cos)
    *创建测量矩形
    gen_measure_rectangle2 (Row9+RadiusC1*Sin, column9+RadiusC1*Cos, -Index*3.1415926/180*2, 50, 5, Width, Height, 'nearest_neighbor', MeasureHandle)
    *绘制测量矩形轮廓用于显示
    gen_rectangle2_contour_xld (Rectangle,Row9+RadiusC1*Sin, column9+RadiusC1*Cos, -Index*3.1415926/180*2, 50, 5)
    *开启测量
    measure_pos (Image, MeasureHandle, 2, 20, 'all', 'first', RowEdge, ColumnEdge, Amplitude, Distance)
    *绘制测量结果
    gen_cross_contour_xld (Cross, RowEdge, ColumnEdge, 20, 1)
    concat_obj (Cross, EmptyObject, EmptyObject)
    concat_obj (EmptyObject2, Rectangle, EmptyObject2)
    distance_pp (RowEdge, ColumnEdge, Row9, column9, Distance1)
    *输出差值数组
    Dis:=[Dis,Distance1-RadiusC1]
    row:=[row,RowEdge]
    column:=[column,ColumnEdge]
endfor

tuple_max (Dis, Max)
tuple_min (Dis, Min)
tuple_abs (Min, Abs)
if (Max>=Abs)
    Circle_Max:=Max
else
    Circle_Max:=Abs
endif

在这里插入图片描述
这个不同于圆形测量在于,圆形测量会判断当前点是否符合拟合参数,如果不符合时则会自动剔除,但是我们需要获取到全部的拟合点,才能有效的判断圆度是否正确。
最终结果输出最大圆度。

2.2.3注意事项

如上面所述,圆度评价方式包含内接圆评价和外接圆评价。
上面的程序块展现的是内接圆评价,如果要修改为外接圆评价时,将下列2个函数进行修改。将参数“first”更换成last“”即可

set_metrology_object_param (MetrologyHandle, 'all', ['measure_transition','measure_select'], ['uniform','first'])
    measure_pos (Image, MeasureHandle, 2, 20, 'all', 'first', RowEdge, ColumnEdge, Amplitude, Distance)

3.C#程序工具实现

//圆形测量工具
#region // 圆形测量
/// <summary>
/// 圆形测量
/// </summary>
/// <param name="image">输入图像</param>
/// <param name="Row">输入ROI的中心行坐标</param>
/// <param name="Column">输入ROI的中心列坐标</param>
/// <param name="R">输入ROI的半径</param>
/// <param name="MeasureHeight">输入测量矩形高度</param>
/// <param name="MeasureWide">输入测量矩形宽度</param>
/// <param name="Sigma">输入测量矩形的高斯滤波值</param>
/// <param name="Threshold">输入最小边缘对比度</param>
/// <param name="MinScore">输入最小拟合弧形的比例(当前拟合点/测量矩形数量)</param>
/// <param name="Measure_Set">选择拟合边1(“uniform”:最接近ROI轮廓的拟合边;“positive”:由亮到暗,“negative”:由暗到亮)</param>
/// <param name="Measure_Place">选择拟合边2(“first”:所有轮廓的第一条边,“last”:所有轮廓的最后一个边,“all”:最接近ROI轮廓的拟合边)</param>
/// <param name="ResultContour">结果轮廓</param>
/// <param name="RResult">结果轮廓的半径</param>
/// <param name="RowResult">结果轮廓的中心横坐标</param>
/// <param name="ColumnResult">结果轮廓的中心列坐标</param>
/// <returns>拟合失败返回false,拟合成功返回true</returns>
static public bool CircleMeasure_(HObject image, HTuple Row, HTuple Column, HTuple R,
        HTuple MeasureHeight, HTuple MeasureWide, HTuple Sigma, HTuple Threshold,
        HTuple Measure_Set,HTuple Measure_Place, out HObject ResultContour, 
        out HTuple RResult, out HTuple RowResult,out HTuple ColumnResult)
{
    HOperatorSet.GenEmptyObj(out ResultContour);
    RowResult = null;
    ColumnResult = null;
    RResult = null;
    HTuple Row1=new HTuple(),Column1=new HTuple();
    try
    {
        HOperatorSet.GetImageSize(image, out HTuple width, out HTuple height);
        int k = 0;
        for (int j = 0; j < 180; j++)
        {
            HOperatorSet.TupleSin(j * 2 * Math.PI / 180, out HTuple Sin);
            HOperatorSet.TupleCos(j * 2 * Math.PI / 180, out HTuple Cos);
            HOperatorSet.GenMeasureRectangle2(Row + R * Sin, Column + R * Cos, -j * 2 * Math.PI / 180,
                        MeasureHeight, MeasureWide, width, height, new HTuple("nearest_neighbor"), out HTuple measureHandle);
            HOperatorSet.MeasurePos(image, measureHandle, Sigma, Threshold, new HTuple("all"), Measure_Place, out HTuple rowEdge,
                        out HTuple columnEdge, out HTuple amplitude, out HTuple distance);
            HOperatorSet.TupleLength(rowEdge, out HTuple length1);
            if (length1 == 0)
            {
                continue;
            }
            Row1[k] = rowEdge;
            Column1[k] = columnEdge;
            k++;
        }
        HOperatorSet.GenContourPolygonXld(out HObject contours, Row1, Column1);
        HOperatorSet.FitCircleContourXld(contours, "atukey", -1, 0, 0, 3, 2,
            out  RowResult, out  ColumnResult, out RResult, out HTuple StartPhi,
            out HTuple EndPhi, out HTuple PointOrder);
        HOperatorSet.GenCircleContourXld(out ResultContour, RowResult, ColumnResult, RResult, 0, Math.PI * 2, new HTuple("positive"), 1);
        return true;
    }
    catch (Exception ex)
    {
        return false;
    }
}
#endregion
//圆度工具
#region // 计算圆度
/// <summary>
/// 计算圆度(圆度:代表圆的边缘在拟合圆半径上的波动值【单位形式:距离】)
/// </summary>
/// <param name="image">输入图像</param>
/// <param name="ROIR">输入圆ROI半径</param>
/// <param name="ROIRow">输入圆ROI横坐标</param>
/// <param name="ROICloumn">输入圆ROI列坐标</param>
/// <param name="FastSet">快速阈值</param>
/// <param name="CircleContour">输出圆轮廓</param>
/// <param name="ResultR">输出圆半径</param>
/// <param name="rowResult">输出圆中心横坐标</param>
/// <param name="columnResult">输出圆中心列坐标</param>
/// <param name="circularity">输出圆度(绝对值最大的参数)</param>
/// <param name="Distances">输出圆度数组(圆边缘波动值与拟合圆半径差值)</param>
/// <returns></returns>
public static bool Circularity(HObject image, HTuple ROIRow, HTuple ROICloumn, HTuple ROIR, 
            bool FastSet, out HObject CircleContour, out HTuple ResultR, out HTuple rowResult, 
            out HTuple columnResult,out double circularity,out double[] Distances)
{
    HOperatorSet.GenEmptyObj(out CircleContour);
    ResultR = -1;
    rowResult = -1; columnResult = -1; circularity = -1;
    Distances=new double[0];
    try
    {
        bool circle = false;
        if (FastSet)
        {
            HOperatorSet.GetImageSize(image, out HTuple width, out HTuple height);
            Distances = new double[180];
            for (int j = 0; j < 180; j++)
            {
                HOperatorSet.TupleSin(j * 2 * Math.PI / 180, out HTuple Sin);
                HOperatorSet.TupleCos(j * 2 * Math.PI / 180, out HTuple Cos);
                HOperatorSet.GenMeasureRectangle2(ROIRow + ROIR * Sin, ROICloumn + ROIR * Cos, -j*2 * Math.PI / 180,
                            20, 5, width, height, new HTuple("nearest_neighbor"), out HTuple measureHandle);
                HOperatorSet.MeasurePos(image, measureHandle, 2, 20, new HTuple("all"), new HTuple("first"), out HTuple rowEdge,
                            out HTuple columnEdge, out HTuple amplitude, out HTuple distance);
                HOperatorSet.DistancePp(rowEdge, columnEdge, rowResult, columnResult, out HTuple distance1);
                HOperatorSet.TupleLength(distance1, out HTuple length1);
                if (length1 == 0)
                {
                    Distances[j] = ResultR;
                }
                else
                {
                    Distances[j] = distance1 - ResultR;
                }
            }
        }
        if (!circle)
        {
            return false;
        }

        
        double circularity1 = Math.Abs(Distances.Min());
        double circularity2 = Math.Abs(Distances.Max());
        if (circularity1 > circularity2)
        {
            circularity = circularity1;
        }
        else
        {
            circularity = circularity2;
        }
        return true;

    }
    catch (Exception)
    {
        return false;
    }
}
#endregion

总结

圆度在机械设计及其制造方面的检测非常常见,尤其涉及到高精度的检测上面。使用视觉对圆度进行检测可以在极短的时间内,完成圆度测量,精确度高。

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

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

相关文章

FFmpeg——开源的开源的跨平台音视频处理框架简介

引言&#xff1a; FFmpeg是一个开源的跨平台音视频处理框架&#xff0c;可以处理多种音视频格式。它由Fabrice Bellard于2000年创建&#xff0c;最初是一个只包括解码器的项目。后来&#xff0c;很多开发者参与其中&#xff0c;为FFmpeg增加了多种新的功能&#xff0c;例如编码…

现在可以在Mac桌面上快速打开C知道进行AI提问

看&#xff0c;我的Mac桌面有个C知道组件&#xff0c;点击即可快速打开C知道页面进行提问使用&#xff0c;再也不需要先打开浏览器&#xff0c;再输入csdn.net访问网站&#xff0c;然后点击页面上的C知道入口。 这是如何实现的呢&#xff1f; 首先&#xff0c;我们来做一些准…

A股风格因子看板 (2024.3 第3期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格景 露等。 今日为该因子跟踪第3期&#xff0c;指数组合数据截止日2024-02-29&#xff0c;要点如下 近1年A股风格因子收益走…

C语言分析基础排序算法——交换排序

目录 交换排序 冒泡排序 快速排序 Hoare版本快速排序 挖坑法快速排序 前后指针法快速排序 快速排序优化 快速排序非递归版 交换排序 冒泡排序 见C语言基础知识指针部分博客C语言指针-CSDN博客 快速排序 Hoare版本快速排序 Hoare版本快速排序的过程类似于二叉树前序…

3.6研究代码(2)

指的是微电网运行参数。 在MATLAB中&#xff0c;randi([0,1],1,48) 会生成一个包含1*48个0或1的随机整数数组。这意味着数组中的每个元素都将是0或1。 MATLAB帮助中心&#xff1a;均匀分布的伪随机整数 - MATLAB randi - MathWorks 中国https://ww2.mathworks.cn/help/matlab/r…

(二十四)Flask之flask-session组件

目录&#xff1a; 每篇前言&#xff1a;Flask-session 每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 &#x1f525;&#x1f525;本文已收录于…

2024 年 AI 垂直应用迅速落地,人人都可以获得AI红利

演示站点&#xff1a; https://ai.uaai.cn 技能模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 随着人工智能技术的持续发展与突破&#xff0c;2024年AI辅助研发正成为科技界和工业界瞩目的焦点。从医药研发到汽车设计&#xff0c;从软件开发到材料科学&#xff0c;AI…

Nestjs与Vue实现多人聊天[简易版]

本项目是一个小demo,帮助各位理清一点开发思路&#xff0c;作为一个小参考&#xff0c;虽然技术栈是nodejs。但是其他语言也是相通的。 准备环境&#xff1a; Nodejs version >18.13.0Vue3Nestjssoket.io 一、初始化 打开一个路径启动cmd窗口&#xff0c;初始化前后端项…

YOLOv8独家改进:backbone改进 | 最新大卷积核CNN架构UniRepLKNet,ImageNet 88% | CVPR2024

💡💡💡本文独家改进:大核卷积一统多种模态!RepLK正统续作UniRepLKNet,代替YOLOv8 Backbone 改进结构图如下: 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm=1001.2014.3001.5482 💡💡💡全网独家首发创新(原创),适…

​​​​​​​ARCGIS API for Python进行城市区域提取

ArcGIS API for Python主要用于Web端的扩展和开发&#xff0c;提供简单易用、功能强大的Python库&#xff0c;以及大数据分析能力&#xff0c;可轻松实现实时数据、栅格数据、空间数据等多源数据的接入和GIS分析、可视化&#xff0c;同时提供对平台的空间数据管理和组织管理功能…

GaLore的全称是“Gradient Low-Rank Projection“,翻译过来就是“梯度低秩投影“

鉴于大家对GaLore比较感兴趣,我今天试着结合论文做一个更深入的解读: GaLore的全称是"Gradient Low-Rank Projection",翻译过来就是"梯度低秩投影"。它的核心思想是通过降低优化器状态的秩,来大幅减少内存占用。 在训练大模型时,我们需要存储三类数据:模型…

响应式招标投标网站模板

模板信息&#xff1a; 模板编号&#xff1a;29165 模板编码&#xff1a;UTF8 模板分类&#xff1a;博客、文章、资讯、其他 适合行业&#xff1a;招标类企业 模板介绍&#xff1a; 下载转载自&#xff1a;https://www.qnziyw.cn/cmsmb/eyoucms/wenzhangzx/4332.html 本模板自带…

arcgis栅格数据处理3——定义投影(同样适用于其他类型文件)

进行数据连接时可能出现未设置投影无法链接的情况&#xff0c;需要先定义投影 点击最右侧“目录”&#xff0c;弹出带有系统工具的面板&#xff0c;点击“data management tools”点击“投影”&#xff0c;“定义投影”

大模型快速实现python3+html内容在线渲染

需求&#xff1a; 有一份数据需要通过前端在线展示给用户&#xff0c;不需要复杂的样式交互&#xff0c;后端服务是基于Python3实现的API接口&#xff0c;对前端技术不是很了解&#xff0c;需要快速实现该需求。类似样式即可&#xff1a; 思路&#xff1a; 如果页面不复杂&am…

搭建拓扑图发送ARP及ICMP数据报文

文章目录 搭建拓扑图设备说明通过PC1 ping PC2小结&#xff1a;当arp表缓存过期&#xff0c;而mac学习表未过期当arp表缓存未过期&#xff0c;而mac学习表过期使用VLAN分割广播域 搭建拓扑图 设备说明 两台PC电脑 同理另外一台电脑也是同理配置 IP地址&#xff1a;192.168.1.…

【架构笔记3】做“用心”之人

凡事就怕“用心”二字&#xff0c;但是用心做事&#xff0c;其实如果没有前提和详情&#xff0c;这本就是一句正确的废话&#xff0c;在一些项目开发和落地过程中&#xff0c;我也有了一些新的体会&#xff0c;自认为不是多余。 我觉得心这个词至少包含四个含义&#xff1a;“…

H62410Y 惠海 降压恒压芯片 仪表供电芯片 24V36V100V降3.3V5V1A

降压恒压仪表供电芯片的工作原理如下&#xff1a; 输入电压传感器&#xff1a;感知电源电压的大小&#xff0c;以便后续控制电压输出。 储能元件&#xff1a;内部有储能元件&#xff08;如电容器或电感等&#xff09;&#xff0c;用于存储电荷或电能&#xff0c;以供后续转换…

ESP32S3部署Edge Impulse模型

在上一篇文章中我们介绍了如何使用edge impulse训练一个图片分类模型并导出arduino库文件。在这篇文章中我们将介绍如何在esp32s3中部署这个训练好的图片分类模型。 添加进Arduino库 有两种方法将下载的文件添加进Arduino库。 在Arduino IDE程序中&#xff0c;转到项目选项卡…

【深度学习笔记】优化算法——Adam算法

Adam算法 &#x1f3f7;sec_adam 本章我们已经学习了许多有效优化的技术。 在本节讨论之前&#xff0c;我们先详细回顾一下这些技术&#xff1a; 在 :numref:sec_sgd中&#xff0c;我们学习了&#xff1a;随机梯度下降在解决优化问题时比梯度下降更有效。在 :numref:sec_min…

【LeetCode: 151. 反转字符串中的单词 + 双指针】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…