19:常见的Halcon数据格式

遍历文件夹与文件选择

1)遍历文件夹:

list_files( : : Directory, Options : Files)

Directory:目录(文件夹路径)

Options:选项

'files'

指定搜索的格式为文件

'directories'

指定搜索的格式为文件夹

'recursive'

指定可以遍历子文件夹下的文件

'follow_links'

'max_depth 5'

指定遍历的深度

'max_files 1000'

指定遍历的最大文件数目

Files:文件(文件的路径)

2)文件格式筛选

tuple_regexp_select( : : Data, Expression : Selection)

Data:被选择的文件路径数组

Expression:文件格式的筛选规则

//.

转义          .

(bmp|JPG)

筛选的文件格式

'ignore_case'

忽略大小写

Selection:选择出的文件路径数组

 

示例:

   1: * 遍历文件夹D:/资料库/Downloads

   2: list_files ('D:/资料库/Downloads', ['files','follow_links'], ImageFiles)

   3: 

   4: * 筛选bmp或jpg格式的文件

   5: tuple_regexp_select (ImageFiles, ['\\.(bmp|jpg)$','ignore_case'], ImageFiles)

   6: 

   7: * 依次读取图片

   8: for Index := 0 to |ImageFiles| - 1 by 1

   9:     read_image (Image, ImageFiles[Index])

  10:     

  11: endfor

(一)Halcon的语法结构特点

类似于Pascal 与 Visual Basic,大部分的语句是Halcon提供的算子,此外也包含了少部分的控制语句;

不允许单独声明变量;

提供自动的内存管理(初始化、析构及OverWrite),但句柄则需要显示释放;

C++(算子模式)

通过代码导出,以C++为例,默认导出为算子型的语法结构,而非面向对象的;在此模式下,全部函数声明为全局类型,数据类型只需要用Hobject、HTuple两类类型进行声明;

C++(面向对象)

可以以面向对象的方式重写代码,也即利用类及类的成员函数;

在这种模式下,控制变量的类型仍未HTuple,而图形数据可以由多种类型,如HImage等;

其他语言(略)

HImage 可以查看halcon中类相关的内容

(二)Halcon的数据类型

两类参数:

1、图形参数Iconic (image, region, XLD)

2、与控制参数Control (string, integer, real, handle),

在Halcon算子的参数中,依次为:输入图形参数、输出图形参数、输入控制参数、输出控制参数;并且其输入参数不会被算子改变。

1、图形参数Iconic:

(1)Images

在Halcon中,Image = Channel + Domain , 像素点存放在Channel矩阵中,根据ROI来描述Image。

Image相关操作:

输入:从文件、从设备

生成:外部图像数据、空内存区域;

显示:disp_image()图像首通道灰度图;disp_color() 彩色图;disp_channel()某特定通道;disp_obj() 自动判别类别;

缩放:set_part() 设置显示区域;set_part_style() 设置显示参数;

说明:

Ø Multiple channels //多通道图像,可以是灰度图像或RGB图像

Ø Arbitrary region of interest //ROI区域图像

Ø Multiple pixel types(byte, (u)int1/2/4,real, complex, direction, cyclic, vector_field)

byte, uint2 //灰度图像的标准编码

int1, int2 //Difference of two images or derivates with integer precision(??)int4 //两幅灰度图的频谱

direction //图片边缘的梯度方向

real //边缘提取及特定灰度值的轮廓

complex //图片频率分布

cyclic //Assigning one "gray" value to each color(??)

vector_field //连续图形的光学流分布

(2)Regions

以行列坐标形式储存,有广泛的应用,特点是高效,可利用同态算子。比如用阈值对图像分割的结果,其他系统中称为BOLB,AREA等。

(3)Extended Line Description (XLD)

图像均用像素点保存,而像素点是整型的,不连续的,Halcon做了拓展,定义了亚像素(subpixel)的描述几何轮廓的对象:xld,主要用在亚像素测量的背景下,可用于如提取边缘、构建轮廓等等,xld在模板匹配、图形校准等多方面有重要的用途。

说明:

Subpixel accurate line and edge detection(亚像素精度的线和边缘检测)

Generic point list based data structure(依据数据结构产生点的表)

Handling of contours, polygons, lines, parallels, etc.(对轮廓,多边形,线等进行操作)

2、控制参数Control:

String类型变量由单引号’括起来;此外还有一些特殊字符;

Boolean型变量包括 true ( = 1 )、 false ( = 0 ) ;不为零的整数将被认为true;但绝大多数的Halcon函数接受字符串型的表达:’true’‘false’,而非逻辑型表达;

此外,Halcon支持的类型还包括图形元组、控制变量元组及句柄:

元组的概念,使得可以用一个变量传递数个对象,可以由重载后的函数来进行处理;图形元组的下标从1开始,控制变量元组下标从0开始;句柄则可以用来描述窗体、文件等等,句柄不能是常量。

(三)Halcon的基本语句

1、标准赋值

Ø assign(Input, Result)     //编辑形式,永远都是输入在前,输出在后

   1: assign(sin(x) + cos(y), u)

Ø Result := Input              //代码形式

   1: u := sin(x) + cos(y)    //与之前的assign(sin(x) + cos(y), u)是等价的

2、元组插入赋值

Ø insert(Tuple, NewValue, Index, Tuple)     //编辑形式

   1: Tuple := [1,2,3,4,5,6,7,8,9]

   2: insert(Tuple,0,3,Tuple)

显示结果为:[1, 2, 3,0, 5, 6, 7, 8, 9]

Ø Tuple[Index] := NewValue                         //代码形式

   1: Tuple := [1,2,3,4,5,6,7,8,9]

   2: Tuple[3]:=0

显示结果为:[1, 2, 3,0, 5, 6, 7, 8, 9]

例程:

   1: read_image (Mreut, 'mreut')               //读入图像

   2: threshold (Mreut, Region, 190, 255)      //阈值化,输出阈值在190-255的Regions

   3: Areas := []                              //定义数组Areas

   4: for Radius := 1 to 50 by 1               //循环

   5: dilation_circle (Region, RegionDilation, Radius) //利用半径为Radius的圆对Region进行膨胀运算,输出

   6:                                                    //RegionDilation,输出形式仍然为Region。

   7: area_center (RegionDilation, Area, Row, Column) //输出区域的面积和中心像素坐标

   8: Areas[Radius-1] := Area                        //对数组Areas的第Radius-1个元素进行赋值

   9: endfor

3、基本数组操作极其对应的算子

数组操作

说明

对应的算子

t := [t1,t2]

t1,t2连接成新的数组

tuple_concat

i := |t|

得到数组长度

tuple_length

v := t[i]

选取第i个元素0<= i < |t|

tuple_select

t := t[i1:i2]

选取i1到i2的元素

tuple_select_range

t := subset(t,i)

选取数组t中的第i个元素

tuple_select

t := remove(t,i)

去除数组t中的第i个元素

tuple_remove

i := find(t1,t2)

找到t2数组在t1数组中出现位置索引(or -1 if no match)

tuple_find

t := uniq(t)

在t数组中把连续相同的值只保留一个

tuple_uniq

4、创建数组

(1)gen_tuple_const函数

   1: tuple_old := gen_tuple_const(100,666) //创建一个具有100个元素的,每个元素都为666的数组

   2: tuple_new := gen_tuple_const(|tuple_old|,4711) //创建一个和原来数据长度一样的,每个元素为4711的数组

上面的函数也可以通过如下表达式实现:tuple_new := (tuple_old * 0) + 4711

(2)当数组中的元素不同时,需要用循环语句对数组中的每一个元素赋值

例如:

   1: tuple := []  //创建空数组

   2: for i := 1 to 100 by 1  //建立步长为1的循环

   3: tuple := [tuple,i*i]  //将i方的值赋给数组的第i个元素

   4: endfor  //循环结束


算术运算

Ø a / a division

Ø a % a rest of the integer division

Ø a * a multiplication

Ø v + v addition and concatenation of strings

Ø a - a subtraction

Ø -a negation

位运算

Ø lsh(i,i)             left shift

Ø rsh(i,i)            right shift

Ø i band i          bit-wise and

Ø i bor i             bit-wise or

Ø i bxor i           bit-wise xor

Ø bnot i             bit-wise complement

字符串操作

Ø v$s                       conversion to string //字符串的格式化,有很丰富的参数

Ø v + v                    concatenation of strings and addition

Ø strchr(s,s)           search character in string

Ø strstr(s,s)            search substring

Ø strrchr(s,s)         search character in string (reverse)

Ø strrstr(s,s)          search substring (reverse)

Ø strlen(s)              length of string

Ø s{i}                       selection of one character

Ø s{i:i}                     selection of substring

Ø split(s,s)              splitting to substrings

比较操作符

Ø t < t               less than

Ø t > t               greater than

Ø t <= t            less or equal

Ø t >= t            greater or equal

Ø t = t               equal

Ø t # t               not equal

逻辑操作符

Ø lnot l                     negation

Ø l and l                   logical ’and’

Ø l or l                      logical ’or’

Ø l xor l                    logical ’xor’

数学函数

Ø sin(a)                        sine of a

Ø cos(a)                       cosine of a

Ø tan(a)                       tangent of a

Ø asin(a)                      arc sine of a in the interval [-p/2, p/ 2], a Î [-1, 1]

Ø acos(a)                     arc cosine a in the interval [-p/2, p/2], a Î [-1, 1]

Ø atan(a)                     arc tangent a in the interval [-p/2, p/2], a Î [-1, 1]

Ø atan2(a,b)               arc tangent a/b in the interval [-p, p]

Ø sinh(a)                      hyperbolic sine of a

Ø cosh(a)                     hyperbolic cosine of a

Ø tanh(a)                     hyperbolic tangent of a

Ø exp(a)                      exponential function

Ø log(a)                       natural logarithm, a> 0

Ø log10(a)                  decade logarithm, a> 0

Ø pow(a1,a2)             power

Ø ldexp(a1,a2)          a1 pow(2,a2)

其他操作(统计、随机数、符号函数等)

Ø min(t)                     minimum value of the tuple

Ø max(t)                    maximum value of the tuple

Ø min2(t1,t2)            element-wise minimum of two tuples

Ø max2(t1,t2)           element-wise maximum of two tuples

Ø find(t1,t2)              indices of all occurrences of t1 within t2

Ø rand(i)                    create random values from 0..1 (number specified by i)

Ø sgn(a)                     element-wise sign of a tuple

Ø sum(t)                    sum of all elements or string concatenation

Ø cumul(t)                 cumulative histogram of a tuple

Ø mean(a)                 mean value

Ø deviation(a)          standard deviation

Ø sqrt(a)                    square root of a

Ø deg(a)                    convert radians to degrees

Ø rad(a)                     convert degrees to radians

Ø real(a)                    convert integer to real

Ø int(a)                      convert a real to integer

Ø round(a)                convert real to integer

Ø number(v)             convert string to a number

Ø is_number(v)        test if value is a number

Ø abs(a)                    absolute value of a (integer or real)

Ø fabs(a)                   absolute value of a (always real)

Ø ceil(a)                    smallest integer value not smaller than a

Ø floor(a)                  largest integer value not greater than a

Ø fmod(a1,a2)         fractional part of a1/a2, with the same sign as a1

Ø sort(t)                   sorting in increasing order

Ø uniq(t)                  eliminate duplicates of neighboring values(typically used in combination with sort)

Ø sort_index(t)       return index instead of values

Ø median(t)            Median value of a tuple (numbers)

Ø select_rank(t,v)  Select the element (number) with the given rank

Ø inverse(t)            reverse the order of the values

Ø subset(t1,t2)      selection from t1 by indices in t2

Ø remove(t1,t2)    Remove of values with the given indices

Ø environment(s)  value of an environment variable

Ø ord(a)                  ASCII number of a character

Ø chr(a)                   convert an ASCII number to a character

Ø ords(s)                ASCII number of a tuple of strings

Ø chrt(i)                  convert a tuple of integers into a string

(四)HDevelop language(结构语句)

1) if ... endif / if ... else ... endif / if ... elseif ... else ... endif

2) for ... endfor

3) while ... endwhile

4) repeat ... until(循环体至少被执行一次,直到满足条件时退出。等同于C语言的do...while语句)

此外,也有关键字 break、continue、return、exit、stop 用来控制语句的执行;

stop:终止后面的循环,点击Step Over or Run button继续。

exit:终止Hdevelop程序段。

(五)异常处理

异常处理:

try ... catch ... endtry:异常算子处理句柄

throw:允许处理用户定义的意外情况。

用MFC写的,我在捕获异常提时候,都需要在前面使用HException::InstallHHandler(&CPPExpDefaultExceptionHandler);才能全try{..}catch(HException &except){..} 生效

在VC中其实是靠不住的。例如下面的代码:

  1. try
  2. {
  3. BYTE * pch ;
  4. pch = ( BYTE * ) 00001234 ; // 给予一个非法地址
  5. * pch = 6 ; // 对非法地址赋值,会造成Access Violation 异常
  6. }

//...是捕捉任意类型的异常.

  1. catch ( ... )
  2. {
  3. AfxMessageBox ( " catched " ) ;
  4. }

这段代码在debug下没有问题,异常会被捕获,会弹出”catched”的消息框。但在Release方式下如果选择了编译器代码优化选项,则 VC编译器会去搜索try块中的代码, 如果没有找到throw代码,他就会认为try catch结构是多余的, 给优化掉。这样造成在Release模式下,上述代码中的异常不能被捕获,从而迫使程序弹出错误提示框退出。

那么能否在release代码优化状态下捕获这个异常呢, 答案是有的。 就是__try, __except结构,上述代码如果改成如下代码异常即可捕获。

  1. __try
  2. {
  3. BYTE * pch ;
  4. pch = ( BYTE * ) 00001234 ; // 给予一个非法地址
  5. * pch = 6 ; // 对非法地址赋值,会造成Access Violation 异常
  6. }
  7. __except ( EXCEPTION_EXECUTE_HANDLER )
  8. {
  9. AfxMessageBox ( " catched " ) ;
  10. }

但是用__try, __except块还有问题, 就是这个不是C++标准, 而是Windows平台特有的扩展。而且如果在使用过程中涉及局部对象析构函数的调用,则会出现C2712 的编译错误。 那么还有没有别的办法呢?

当然有, 就是仍然使用C++标准的try{}catch(..){}, 但在编译命令行中加入 /EHa 的参数。这样VC编译器不会把try catch模块给优化掉了。

(6)单摄像机标定

In the reference manual,operator signatures are visualized in the following way: 
operator ( iconic input : iconic output : control input : control output )

在HALCON所有算子中,变量皆是如上格式,即:图像输入:图像输出:控制输入:控制输出。

其中四个参数任意一个可以为空。

控制输入可以是变量、常量、表达式;

控制输出以及图像输入和输出必须是变量。

 

1.caltab_points:从标定板中读取marks中心坐标,该坐标值是标定板坐标系统里的坐标值,该坐标系统以标定板为参照,向右为X正,下为Y正,垂直标定板向下为Z正。该算子控制输出为标定板中心3D坐标。

2.create_calib_data:创建Halcon标定数据模型。输出一个输出数据模型句柄。

3.set_calib_data_cam_param:设定相机标定数据模型中设置相机参数的原始值和类型。设置索引,类型,以及相机的原始内参数等。

4.set_calib_data_calib_object:在标定模型中设定标定对象。设定标定对象句柄索引,标定板坐标点储存地址。

5.find_caltab:分割出图像中的标准标定板区域。输出为标准的标定区域,控制

6.find_marks_and_pose:抽取标定点并计算相机的内参数。输出MARKS坐标数组,以及估算的相机外参数。

即标定板在相机坐标系中的位姿,由3个平移量和3个旋转量构成。

7.set_calib_data_observ_points( : : CalibDataID, CameraIdx, CalibObjIdx,CalibObjPoseIdx, Row, Column, Index, Pose : )

收集算子6的标定数据,将标定数据储存在标定数据模型中。输入控制分别为标定数据模型句柄,相机索引,标定板索引,位姿索引,行列坐标,位姿。

8.calibrate_cameras( : : CalibDataID : Error) 标定一台或多台相机,依据CalibDataID中的数据。控制输出平均误差。

9.get_calib_data( : : CalibDataID, ItemType, ItemIdx, DataName : DataValue) 获得标定数据。

依靠索引号和数据名称来返回输出的数据值。可查询与模型相关的数据,与相机相关的数据(包括相机的内外参数等),与标定对象相关的数据,与标定对象的姿态相关的数据。控制输出是要查询的标定数据。

如:

get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam) //查询相机的位姿

get_calib_data (CalibDataID, 'calib_obj_pose', [0, NumImage], 'pose', Pose) //查询标定板位姿

10.write_cam_par( : : CameraParam, CamParFile : ) 记录相机的内参数,输入控制为内参数,输出控制为

存取相机内参数的文件名。

11.set_origin_pose( : : PoseIn, DX, DY, DZ : PoseNewOrigin)

设置新的坐标原点,控制输入为原始的位姿和沿着世界坐标系的三个坐标轴的平移量,控制输出为新的位姿

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

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

相关文章

QML图像提供器 (Image Provider)

QML 中的图像提供器是一种自定义图像加载机制&#xff0c;允许你从非文件源&#xff08;如数据库、网络或程序生成的内容&#xff09;提供图像数据。 主要类型 QQuickImageProvider - 基础图像提供器 QPixmapImageProvider - 提供 QPixmap 图像 QImageImageProvider - 提供 …

计算机视觉与深度学习 | 双目立体匹配算法理论+Opencv实践+matlab实践

双目立体匹配 一、双目立体匹配算法理论与OpenCV、matlab实践一、双目立体匹配理论二、OpenCV实践三、优化建议四、算法对比与适用场景二、双目立体匹配算法理论及Matlab实践指南一、双目立体匹配理论二、Matlab实践步骤三、算法对比与优化建议四、完整流程示例五、常见问题与解…

AI国学智慧语录视频,条条视频10W+播放量

家人们&#xff01;图书类带货玩法真的非常多&#xff0c;之前也分享过蛮多&#xff0c;例如情感语录、育儿教育、爆款图书金句类、AI历史人物解说类等等。 本期继续来分享一个对于普通人来说&#xff0c;上手相当简单&#xff0c;容易起号&#xff0c;可作为长线深耕的AI带货…

echart图表使用

2、接口编写 该部分代码定义了UserController控制器类&#xff0c;用于处理与用户相关的请求。包含一个用于跳转页面的方法和一个返回用户详细数据&#xff08;以 JSON 格式呈现&#xff09;的接口。前者负责将用户导航至指定页面&#xff0c;后者通过构建ChartVO对象并填充数…

Android短信监控技术实现:合法合规的远程采集方案

一年经验的全栈程序员&#xff0c;目前头发健在&#xff0c;但不知道能撑多久。 该项目已成功部署并稳定运行于企业生产环境&#xff0c;如需个性化定制方案&#xff0c;欢迎联系作者进行深度合作。 文章目录 前言 一、页面设计 1.页面显示 2.代码实现 二、具体代码实现 1.添加…

前端跨域问题怎么在后端解决

目录 简单的解决方法&#xff1a; 添加配置类&#xff1a; 为什么会跨域 1. 什么是源 2. URL结构 3. 同源不同源举&#x1f330; 同源例子 不同源例子 4. 浏览器为什么需要同源策略 5. 常规前端请求跨域 简单的解决方法&#xff1a; 添加配置类&#xff1a; packag…

【中间件】brpc_基础_execution_queue

execution_queue 源码 1 简介 execution_queue.h 是 Apache BRPC 中实现 高性能异步任务执行队列 的核心组件&#xff0c;主要用于在用户态线程&#xff08;bthread&#xff09;中实现任务的 异步提交、有序执行和高效调度。 该模块通过解耦任务提交与执行过程&#xff0c;提…

java学习之数据结构:一、数组

主要是对数组所有的东西进行总结&#xff0c;整理 适合小白~ 目录 1.什么是数组 1.1数组定义 1.2数组创建 1&#xff09;静态创建 2&#xff09;动态创建 1.3数组遍历 1&#xff09;for和while遍历 2&#xff09;foreach遍历 2.数组越界问题及解决 2.1数组越界问题 2…

[Survey]SAM2 for Image and Video Segmentation: A Comprehensive Survey

BaseInfo TitleSAM2 for Image and Video Segmentation: A Comprehensive SurveyAdresshttps://arxiv.org/abs/2503.12781Journal/Time2503Author四川大学&#xff0c;北京大学 1. Introduction 图像分割专注于识别单个图像中的目标、边界或纹理&#xff0c;而视频分割则将这…

用Maven定位和解决依赖冲突

用Maven定位和解决依赖冲突 一、依赖冲突的常见表现二、定位冲突依赖的4种方法2.1 使用Maven命令分析依赖树2.2 使用IDE可视化工具2.3 使用Maven Enforcer插件2.4 运行时分析 三、解决依赖冲突的5种方案3.1 排除特定传递依赖3.2 统一指定版本&#xff08;推荐&#xff09;3.3 使…

穿越数据森林与网络迷宫:树与图上动态规划实战指南

在 C 算法的浩瀚宇宙中&#xff0c;树与图就像是神秘的迷宫和茂密的森林&#xff0c;充满了未知与挑战。而动态规划则是我们探索其中的神奇罗盘&#xff0c;帮助我们找到最优路径。今天&#xff0c;就让我们一起深入这片神秘领域&#xff0c;揭开树与图上动态规划的神秘面纱&am…

UDP / TCP 协议

目录 一、前言&#xff1a; 数据封装与分用&#xff1a; 二、网络协议分层模型&#xff1a; 三、UDP / TCP 协议 UDP 协议&#xff1a; 1、UDP 协议段格式&#xff1a; 2、UDP 的特点&#xff1a; TCP 协议&#xff1a; 1、TCP 协议段格式&#xff1a; 2、TCP 协议的十…

Python 实现的运筹优化系统数学建模详解(动态规划模型)

相关代码链接&#xff1a;https://download.csdn.net/download/heikediguoshinib/90713747?spm1001.2014.3001.5503 一、引言 在计算机科学与数学建模的广阔领域中&#xff0c;算法如同精密的齿轮&#xff0c;推动着问题的解决与系统的运行。当面对复杂的优化问题时&…

langfuse本地安装

目录 安装命令项目准备用openai测试 安装命令 本地&#xff08;docker compose&#xff09;&#xff1a;使用 Docker Compose 在你的机器上于 5 分钟内运行 Langfuse。 # 获取最新的 Langfuse 仓库副本 git clone https://github.com/langfuse/langfuse.git cd langfuse# 运行 …

每天学一个 Linux 命令(35):dos2unix

每天学一个 Linux 命令(35):dos2unix 命令简介 dos2unix 是一个用于将 Windows/DOS 格式的文本文件转换为 Unix/Linux 格式的实用工具。它主要处理行尾符的转换(将 CRLF 转换为 LF),同时也能处理编码问题和字符集转换。这个命令在跨平台文件共享、代码迁移和系统管理场…

第6章 Python 基本数据类型详解(int, float, bool, str)细节补充

文章目录 Python 基本数据类型深入解析(int, float, bool, str)一、整型(int)的底层机制二、浮点型(float)的陷阱与解决方案三、布尔型(bool)的底层本质四、字符串(str)的不可变性与优化五、类型间的隐式转换与陷阱六、性能优化与工具总结:关键细节与最佳实践Python…

19. LangChain安全与伦理:如何避免模型“幻觉“与数据泄露?

引言&#xff1a;当AI成为企业"数字员工"时的责任边界 2025年某金融机构因AI客服泄露用户信用卡信息被罚款2300万美元。本文将基于LangChain的安全架构与Deepseek-R1的合规实践&#xff0c;揭示如何构建既强大又安全的AI系统。 一、AI安全风险矩阵 1.1 2025年最新威…

Java快速上手之实验六

1. 编写ItemEventDemo.java&#xff0c;当选中或取消选中单选钮、复选钮和列表框时显示所选的结果。 2&#xff0e;编写GUIExample.java&#xff0c;当选中或取消选中单选钮、复选钮时在标签中显示相应结果。 import javax.swing.*; import java.awt.*; import java.awt.event.…

QT6 源(72):阅读与注释单选框这个类型的按钮 QRadioButton,及各种属性验证,

&#xff08;1&#xff09;按钮间的互斥&#xff1a; &#xff08;2&#xff09;源码来自于头文件 qradiobutton . h &#xff1a; #ifndef QRADIOBUTTON_H #define QRADIOBUTTON_H#include <QtWidgets/qtwidgetsglobal.h> #include <QtWidgets/qabstractbutton.h>…

【算法滑动窗口】 将x减到0的最小操作数

将x减到0的最小操作数 个人总结的八步归纳AI的归纳**8步归纳法&#xff08;极简直白版&#xff09;**1. 问题本质2. 问题特征3. 切入点4. 解决流程5. 每步目标与操作6. 注意事项7. 最终目标8. 整体总结 代码对照&#xff08;逐行解析&#xff09;举个栗子&#x1f330;**一句话…