-
2021-07-28 09:51:37
step在计算机编程中的意思是“步长”,一般出现在计算机算法循化语句中,语法如“For counter = start To end [Step step]”,其中参数“counter”用做循环计数器的数值变量,Step则表示步长。
计算机里在算法循化语句中Step
For...Next 语句——以指定次数来重复执行一组语句。
语法For counter = start To end [Step step]
[statements]
[Exit For]
[statements]
Next [counter]
描述:
counter 必要参数。用做循环计数器的数值变量。这个变量不能是布尔或数组元素。 start 必要参数。counter 的初值。
End 必要参数,counter 的终值。
Step 可选参数。counter 的步长。如果没有指定,则 step 的缺省值为 1。
Statements 可选参数。放在 For 和 Next 之间的一条或多条语句,它们将被执行指定的次数。
说明:
step 参数可以是正数或负数。step 参数值决定循环的执行情况:
如果step 参数为正数或 0,那么: counter <= end;若为负数,那么 counter >= end
更多相关内容 -
代码 类似节奏大师 Step Seq 音乐制作创意游戏实例模版和源码
2022-05-14 10:45:36代码 类似节奏大师 Step Seq 音乐制作创意游戏实例模版和源码代码 类似节奏大师 Step Seq 音乐制作创意游戏实例模版和源码代码 类似节奏大师 Step Seq 音乐制作创意游戏实例模版和源码代码 类似节奏大师 Step Seq ... -
Microsoft Visual C# 2010 Step by Step 例子源代码
2011-03-24 15:07:18Microsoft Visual C# 2010 Step by Step 例子源代码 -
OpenCV源代码赏析: Mat对象step属性含义及使用深入分析
2021-12-22 21:20:39本文详细介绍了OpenCV Mat对象step属性含义,并基于OpenCV关于MatStep类型的源代码对step数据的访问机制进行了深入分析,从而解答了博友关于数组为什么强制类型转换会变为一个返回数组第一个元素的问题。文章中列举...一、引子
有个CSDN粉丝博友“CP猫”前2天和我联系,说他也在研究CLAHE算法,遇到了OpenCV Mat对象的step属性访问的问题,问为啥一个象step这样的数组可以强制转为为一个整数输出,且输出值为数组的第一个元素,为此他昨天还专门写了篇博文《为什么OpenCV图像Mat矩阵的step属性能转换为整数输出?》。正好这近两个月来我一直断断续续的在研究CLAHE算法,在初始阶段恰好也有他这样的疑问,后来通过深入分析代码终于理解了,结合CP猫博主的疑问,老猿就此深入分析一下。
二、关于step属性的含义
在CP猫博友的文章《为什么OpenCV图像Mat矩阵的step属性能转换为整数输出?》介绍了一下step属性,原文是这么介绍的:“step是个数组,用于存储每一维元素的大小(单位字节),如step[0]就是一维元素的个数,具体到图像来说,step[0]就是图像每行像素占用的字节数,step[1]就是每列像素占用的字节数”。
以上说法不全对,其中有几个说法有问题:
- step不是一个数组,而是一个结构化的类型,提供了通过类似数组下标方式访问的方法,在访问上可以姑且认为是个数组。这个方法挺有用,随后详细介绍,大家可以好好品味一下;
- step中通过下标能访问的数据如果认为是一个数组,这个数组的每个元素并不是存储每一维元素的大小,step[1]更不是每列像素占用的字节数。
怎么解释step的含义呢?在此老猿引用csdn d_a_r_k博友转载的博文
《Mat中step的含义》的介绍,之所以不引用原文是因为 d_a_r_k博友转载博文给出的原文链接已经不可访问。step这里指出的是图像在各个梯级上的字节数大小,而这里的梯级指的是构成图像的各层次。
以三维的Mat数据布局为例:
三维图像由一个一个平面(第一级)构成,每一个平面由一行一行(第二级)像素构成,每行由一个一个像素点(第三级)构成。因此三维图像中step[0]是面占用空间的大小,step[1]是行占用空间的大小,step[2]是像素点占用空间的大小。同理:二维图像由一行一行(第一级)构成,而每一行又由一个一个点(第二级)构成。step[0]是行占用空间的大小,step[1]是像素点占用空间的大小。
因此Mat中的step[0]就是每个图像构成要素的第一级在内存中占据的字节数量。例如,二维图像中step[0]就是每一行(第一级)在矩阵内存中,占据的字节的数量。也就是说step[i]就是第i+1级在矩阵内存中占据的字节的数量。
所以在CP猫博友的文章《为什么OpenCV图像Mat矩阵的step属性能转换为整数输出?》的代码案例中,输出信息为:
图像的分辨率为:1023×681 step =28FC40,stepCast =3069,step[0]=3069,step[1]=3
三、为什么step对象可以转换成整型呢?
弄清楚了step的含义,我们来分析CP猫博友的问题。要弄清楚这个问题,必须阅读OpenCV相关的源码。
3.1、MatStep相关源代码
Mat对象的step属性实际上是一个MatStep对象,MatStep的定义在源码的build\include\opencv2\core\Mat.hpp文件下,具体定义如下:
struct CV_EXPORTS MatStep { MatStep(); explicit MatStep(size_t s); const size_t& operator[](int i) const; size_t& operator[](int i); operator size_t() const; MatStep& operator = (size_t s); size_t* p; size_t buf[2]; protected: MatStep& operator = (const MatStep&); };
其相关实现代码在build\include\opencv2\core\Mat.inl.hpp内,具体代码如下:
/ MatStep inline MatStep::MatStep() { p = buf; p[0] = p[1] = 0; } inline MatStep::MatStep(size_t s) { p = buf; p[0] = s; p[1] = 0; } inline const size_t& MatStep::operator[](int i) const { return p[i]; } inline size_t& MatStep::operator[](int i) { return p[i]; } inline MatStep::operator size_t() const { CV_DbgAssert( p == buf ); return buf[0]; } inline MatStep& MatStep::operator = (size_t s) { CV_DbgAssert( p == buf ); buf[0] = s; return *this; }
扯一下,说实话,这代码看懂容易,但看了这C++代码让老猿觉得自己真low了,第一次知道结构可以象类一样的定义属性,也可以这样定义访问方法。
3.2、源代码分析
针对CP猫博友的问题,我们来看几个关键的源代码:
- MatStep的两个operator[]方法,这个是决定了MatStep对象可以下标访问的实现方法,就是重载下标访问符号"[]";
- MatStep的数据实际上就是放在类型为size_t大小为2的buf缓冲区中,因此它实际上是只能支持二维图像的处理;
- 类型转换没那么直观,实际上是通过重载operator size_t()重载size_t来访问的,size_t实际上vc定义的标准数据类型,其类型实际上就是无符号整型。具体定义如下:
#ifdef _WIN64 typedef unsigned __int64 size_t; #else typedef unsigned int size_t; endif
因此CP猫博友在将step使用
static_cast<int>(img.step)
转换成int型时,实际上就调用了重载的size_t()操作符,因此返回了缓冲区的第一个元素。备注:这个地方老猿没有细研究为什么int强制类型转换会触发size_t()操作,按理是触发int()操作,虽然size_t与int是有关系,但关系没有这么直接,但个人觉得不重要,就不进一步研究了。
三、小结
本文详细介绍了OpenCV Mat对象step属性含义,并基于OpenCV关于MatStep类型的源代码对step数据的访问机制进行了深入分析,从而解答了博友关于数组为什么强制类型转换会变为一个返回数组第一个元素的问题。
文章中列举的这样简单紧凑的源码,实现了数据的简捷高效访问,看了之后是否深受启发?
更多图像处理的内容请参考专栏《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》、《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》及《图像处理基础知识》的介绍。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
如对文章内容存在疑问,可在博客评论区留言,或关注:老猿Python 微信公号发消息咨询,也可以扫描博客首页左边的二维码关注公众号。
关于老猿的付费专栏
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。
老猿Python,跟老猿学Python!
☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░
-
绿色代码统计工具Blue StepCounter
2011-03-09 10:07:16绿色 代码统计 工具 Blue StepCounter -
Simulink代码生成:Step函数接口配置
2021-03-30 21:08:00本文研究Simulink生成代码时的step函数的名称和参数。 文章目录1 问题引入2 配置过程3 代码生成4 总结 1 问题引入 在之前的一篇博客《Simulink代码生成:Simulink Function子系统及其代码》中,博主为了满足生成带有...本文研究Simulink生成代码时的step函数的名称和参数。
1 问题引入
在之前的一篇博客《Simulink代码生成:Simulink Function子系统及其代码》中,博主为了满足生成带有非空参数的函数这个需求,使用了Simulink Function子系统,基本上解决了问题。
但是这样的方案将Simulink Function子系统作为顶层模型,完全不符合一般的建模方式。通过更多的研究后,发现保持以前的建模方案,也可以通过配置生成特定接口的Step函数。本文就将这个方法记录下来。
2 配置过程
本节简单演示一下Step函数接口配置的方法。
1)建立一个简单的Simulink模型,包含一个输入接口、一个输出接口、一个Gain模块;
2)配置Embedded Coder的离散求解器和目标文件,参考《Simulink代码生成: Embedded Coder配置》一文,不再赘述;3)打开配置:Model Configuration Parameters – Code Generation – Interface – Config Model Functions;
4)在弹出的窗口中自定义 C Initialize Function Name 为 User_Initialize_Function ,定义 C Step Function Name 为 User_Step_Function ,然后勾选下面的 Configure arguments for Step function prototype,表示为函数原型配置参数;
5)点击下面的 Get default 按钮,就会检测到模型中的输入输出port,并提示配置;默认配置是把In1配置成 Value(也可以选指针、常量等),把Out1配置成 Pointer,把返回值配置成 Void ;名字分别可以手动修改成Input和Output,然后点击OK就完成了;
3 代码生成
在第2章的配置后,Ctrl + B生成代码,打开C文件如下;
可以看到,Step函数和初始化函数都变成了配置的名字,并且Step函数中按照配置的要求,将Inport生成为传参的形式,将Outport生成为指针参数。然后打开头文件也可以看到对应的函数声明,也是自定义的。
在第二章中,也可以将输出端口配置为函数的返回值,或者输入端配置成其他形式,后面会相应地生成代码。4 总结
Step函数接口配置是一个比较细小的配置项,但是可以满足生成传参函数的需求。对于数组、结构体等接口,也可以通过配置dimensions和Bus类型来达到,与Simulink Function子系统的配置方法类似。
-
PyCharm Debugger中Step Over、Step Into、Step Into My Code、Force Step Into、Step Out、Run to Cursor...
2019-12-11 15:34:54Debugger与Console PyCharm的调试有两种显示模式,Debugger和Console。 Debugger处以列表形式,列出每个元素的内容;...调试一行代码,不进入子函数;如果没有子函数,功能与Step Into一样 Ste...-
Debugger与Console
PyCharm
的调试有两种显示模式,Debugger
和Console
。Debugger
处以列表形式,列出每个元素的内容;Console
与直接Run
输出类似。 -
Step Over、Step Into…区别
调试方式 快捷键 意义 Step Over F8 调试一行代码,不进入子函数;如果没有子函数,功能与Step Into一样 Step Into F7 单步执行,进入子函数 Step Into My Code Alt + Shift + F7 调试过程中想跟着代码一步步走下去,可以一只按 F7(Step Into)
,有时就会调到源代码里去执行,此时通过Step Into My Code
可以让debug
回到自己的代码并继续向下执行Force Step Into Alt + Shift + F7 强制进入,在调试的时候能进入任何地方 Step Out Shift + F8 运行断点后面所有代码;
当单步执行到子函数内时,用step out就可以执行完子函数余下部分,并返回到上一层函数Run to Cursor Alt + F9 一直执行,直到光标处停止;
用在循环内部时,点击一次就执行一个循环 -
从当前断点直接跳到下一个断点
上述描述都是基于单步调试,如果两个断点之间比较远,一步步执行过去比较费时,此时可以采用
Run--> Resume Program
直接跳到下一个端点。 -
References
-
-
调试的时候step into,step out,step over有什么区别?各有什么作用?分别在什么情况下使用?
2020-04-09 10:44:59回答1 main() { run(); wait(); start(); ...stepover 就是 只看当前这一层调用函数源名。...run(),wait(),start(),一步一步看这一层都...stepinto 进入下一层,就是每碰到一个函数,都会进去看这个函数,直到最深层... -
VScode下调试Python代码演示:Debugging以及单步前进Step Into
2020-11-24 11:10:42代码:test.py s0 = '林祖泉0' s1 = '林祖泉1' s2 = '林祖泉2' ls0 = [s0] ls1 = [s0,s1] ls2 = [s0,s1,s2] print(ls0) print(ls1) print(ls2) tup = (ls0,"aaa") print(tup) ls0.append("林麻子") print(ls0) ... -
ASP.NET MVC Step by Step 原代码
2009-09-17 23:05:25ASP.NET MVC Step by Step 原代码 ASP.NET MVC Step by Step 原代码 ASP.NET MVC Step by Step 原代码 -
Pytorch optimizer.step() 和loss.backward()和scheduler.step()的关系与区别 (Pytorch 代码讲解)
2019-02-20 15:24:53因为有人问我optimizer的step为什么不能放在min-batch那个循环之外,还有optimizer.step和loss.backward的区别;那么我想把答案记录下来。 首先需要明确optimzier优化器的作用, 形象地来说,优化器就是需要根据网络... -
python中turtle库中的Turtle()是什么,有什么用?
2021-01-14 10:01:25弧度,step=内切多边形边数)画圆,半径正负对应坐标轴 setx()设置x轴移动到指定位置 sety()设置y轴移动到指定位置 setheading(角度)设置当前朝向为多少角度 home()设置当前画笔位置为原点,朝向东 dot(半径)绘制一个... -
IDEA debug调试工具中 step over、step into、step out的区别
2020-07-27 14:14:20刚接触IDEA 调试工具debug的时候,当你尝试对代码进行调试时就会遇到step over、step into、step out ,接下来就介绍一下它们如何去使用。 step over (F8):步过,一行一行地往下走,如果这一行上有方法不会进入... -
锁步核是什么 -- lock-step core
2020-03-14 14:59:01锁步core 锁步核是实现高诊断覆盖度(检测错误发生的能力)的一种传统方法。...两个core同时运行相同的代码,并周期性比较两个core计算结果,若相同,则继续运行,否则,重新运行产生不同结果的代码再检查或重启。 ... -
step7安装提示重启怎么解决
2021-07-28 09:44:35step7安装提示重启怎么解决在西门子软件安装时,比如:WinCC、Step7、SIMATIC NET SQL Server for WINCC等软件,有时候并不是很顺利,经常提示要重启,而且重启之后还是提示重启,一直循环提示,这个问题可以通过下面... -
.net中进度条示例演示,ProgressBar1.PerformStep(),VB.net源代码程序
2009-04-10 14:02:04.net中进度条示例演示,ProgressBar1.PerformStep(),VB.net源代码程序 -
Unity Shader: 优化GPU代码--用step()代替if else等条件语句。
2017-08-21 20:00:37Step()版本: Shader "Unlit/NewToonShading_StepVersion" { Properties { _Shininess("Shininess",float)=1 _Edge("Edge Scale",range(0,1))=0.2 _FinalColor("Final Color",Color)=(0.5,0.5,0.5,1) _... -
python里range的意思是什么
2020-12-29 01:51:35python里range的意思是什么发布时间:2020-07-14 11:48:05来源:亿速云阅读:89本篇文章为大家展示了python里range的意思是什么,代码简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能... -
伪代码——语法书写~规则
2020-04-28 10:45:52什么是伪代码 伪代码(Pseudocode)是一种非正式的,类似于英语结构的,用于描述模块结构图的语言。 使用伪代码的目的是使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java等)实现。因此,伪代码必须结构... -
TensorFlow中global_step的简单分析
2017-11-11 21:46:39global_step在滑动平均、优化器、指数衰减学习率等方面都有用到,这个变量的实际意义非常好理解:代表全局步数,比如在多少步该进行什么操作,现在神经网络训练到多少轮等等,类似于一个钟表。 根据代码可以发现... -
怎么用python3画烟花?代码是什么?
2020-12-04 16:10:33我们可以用python做很多好玩的事情哦~包括制作动态的视频,之前小编就教大写编写过制作内容,现在给大家想到了更好玩的事情,就是编写个烟花代码出来,有兴趣的小伙伴可以看下呢~实施步骤:一、导入海龟import ... -
Python代码中range()函数具有哪些功能呢?
2021-01-29 04:25:29摘要:下文讲述Python代码中range()函数的功能说明,如下所示:range函数功能说明range()函数功能:用于创建一个整数列表range函数语法:range(start, stop[, step])-------参数说明------start:计数从 start 开始。... -
2022跨年代码(有烟花)
2021-02-09 19:54:45马上就要到春节了,于是写了一个跨年倒计时代码,祝大家在新的一年里:所念的人平安喜乐,所想的事顺心如意。 代码: <!doctype html> <html> <head> <meta charset="utf-8"> <title>... -
西门子Step7软件安装步骤
2020-12-28 20:45:05西门子 Step7软件可以分为以下几种类型:★Step7 Lite版——目前高版本为V3.0 Sp4,此版本的Step7属于免费版本,但是不能组态网络,仅具有Step7的基本功能。★Step7 Basic版——基本版,目前高版本为V5.5,可以组态... -
Layui 步骤条Step
2020-10-13 12:23:12step.js layui.define(['jquery'], function (exports) { var $ = layui.$ , step = { //设置全局项 set: function (options) { var that = this; that.config = $.extend({}, that.config, options); -
Matlab 中step conv 函数使用
2021-04-18 06:49:54Matlab 中step 函数使用s+ 4对于一个闭环系统 传递函数是 G(s) = ------------------ :s^2 + 2s + 8现在要求其时域响应:代码:num = [1, 4];den = [1, 2, 8];step(num, den)运行结果: 这里再给出一个技巧使用 tf()... -
OpenCV: Mat属性step,size,step1,elemSize,elemSize1一次搞清
2018-06-15 11:09:27elemSize 表示每个元素的大小(单位是字节),每个元素可能有多个通道,按照代码中对应的定义,每个元素有三个通道,每个通道类型为CV_16U,所以3个通道的总数是6,和step[2]的数值相等。 elemSize1 每个通道的... -
Cucumber之六Step Definition步骤定义
2019-06-04 15:35:02英文视频教程地址是百度网盘,后续会放到微信公众号:【软测小生】里面,请关注公号更新相关文章和视频资源。 ***********************...什么是步骤定义?(What is Step Definition?) 添加一个步骤定义文件 (Ad... -
sns.violinplot(x='genre_Drama', y='revenue', data=train[:100]);