一文弄懂halcon例程:rim.hdev
打怪的路上总是无聊的,但是也不能不打啊,我自己现在也在每天打怪升级呢。昨天就因为一个问题,我到视觉群问里面的大牛,结果,他不帮我解答,他不告诉我怎么解决就算了呗,却总是说我基础不行,要从头学,要去他那报班。我说我事情有个轻重缓急啊,现在项目上一个小问题耽误进度了,我抛下不管,跑去报班从头学,回头再来解决这个问题?他说项目走外包,要不然我以后还会遇到问题。。。说得好像去他那儿报班了以后就不会遇到问题了似的。。。当时真把我整崩溃了,好在我克制了情绪,保持了理智,从他的言语中发现线索,最后解决了这个bug。必须得回头到那个群去嘚瑟一下啊,结果他还理直气壮的教育了我一番,真不知道该他尴尬,还是我尴尬。。。。这段故事的具体聊天记录我竟然截屏了,在下一节节结尾我会贴出来,供各位看官一乐。

现在先进入本节的学习。

首先,halcon上打开这个例程,ctrl+E,搜索rim即可。这个例子的目的是找到下图中的几个圆,并标一下圆的直径(单位是像素),和识别那上面几个字符,原图如下(3-6-1)。

机器视觉之halcon入门(11)-一文弄懂halcon例程:rim.hdev
图 3-6-1

大家先自己单步执行到第30行,因为前面这些准备工作和简单的预处理,都是老生常谈的了。唯一可以说的是第25行,select_shape (DarkRegions, Circles, [‘circularity’,’area’], ‘and’, [0.85,50], [1.0,99999]),按照特征来筛选region嘛,这一次它同时用了两个特征:面积和圆度,意思就是圆度在0.85-1之间,面积在50-99999之间的region。And这个时候就起作用了,就是必须得同时满足这两个条件的region才会被筛选出来,如果是or,就是或的关系啦!那什么叫圆度(circularity)呢?就是圆的程度嘛!(不过数学上也是有公式的,详见本节TIPS 1)。

机器视觉之halcon入门(11)-一文弄懂halcon例程:rim.hdev
图 3-6-2

机器视觉之halcon入门(11)-一文弄懂halcon例程:rim.hdev
图 3-6-3

到了第30行,其实这几个圆已经大致的提取出来了,只是边缘部分实在是达不到工业的要求,如上图(3-6-3),所以还是需要一些处理的,如果是你,你怎么处理?此处要认真思考一分钟。。没有思路了吧,我们来看看halcon的思路,如下图(3-6-4):

机器视觉之halcon入门(11)-一文弄懂halcon例程:rim.hdev
图 3-6-4

dilation_circle()和erosion_circle()这两个算子,印象中我在某节的TIPS里面有讲过这一类的算子,这类算子这种结合起来用,往往对提取边缘有奇效!这儿就是用了这个思路:先膨胀一点点,再腐蚀一点点,然后做差(difference()),得到的就是每个圆的边缘部分的区域了。这个地方是个小技巧点,经常会用到的,最好记住!

接下来又有一个小细节了,就是合并,因为有4个圆嘛,所以difference出来的ROI区域其实是4个了,你得合并下,下一步才好reduce。代码如下(3-6-5):

机器视觉之halcon入门(11)-一文弄懂halcon例程:rim.hdev
图 3-6-5

接下来果然就是reduce_domain(),看下上面绿色的注释:reduce这个ROI(domain)到被提取的包含边缘的region。哈哈,蹩脚的翻译。。还是看图吧(3-6-6)。

机器视觉之halcon入门(11)-一文弄懂halcon例程:rim.hdev
图 3-6-6

这样就很好理解了,reduce之后,整张图片就剩下这几个圆孔边缘的一小部分。这样提取边缘就没有什么干扰了。Halcon程序员就是机智。

接下来这个算子,我得隆重介绍一下:

edges_sub_pix (RimReduced, Edges, ‘canny’, 4, 20, 40):就是求取图片的亚像素边缘(sub-pixel edges),什么叫亚像素呢?(详见本节TIPS 2)。不得不承认,这个算子是很厉害的,里面有好多算法,小弟我也不是很懂,所以这个算子我用的时候,参数选择多是凭经验和慢慢试。第一个参数是你要求边缘的图片;第二个参数是求出来的边缘,第三个参数是求边缘的算法,有好几种可以选择;第四个参数叫筛选因子吧,越小图像会越被平滑,一些小细节就会被忽略掉,简而言之,你要筛选大的明显的边缘的时候,就把它设小一点吧!第五个第六个参数,有道的解释是:迟滞阈值的下限和上限。。。这是什么鬼,我也不晓得。但是这两个参数的意思是这样的,当某个点相对于它周围的点振幅超过第六个参数(high)的时候,直接认为该点是边缘!当某个点的振幅小于第五个参数(low)的时候,直接认为该点不是边缘!剩下的振幅在中间的这些呢?就判断,跟上面已经确定的边缘相连接的,就也判断为边缘,不连接的就直接拒绝,不当边缘。接着讲下一个算子:

select_contours_xld (Edges, RelEdges, ‘length’, 30, 999999, 0, 0):复制这段代码的时候,情不自禁看了下上面的英文注释,发现解释的真好,比上面那个翻译好多了。只选长度大于30个像素的边缘,这个算子跟select_shape()可以说是异曲同工了,所以也很好理解。不过它出来的是xld,那什么是xld呢?eXtended Line Descriptions:表示的是亚像素级别的轮廓(详见TIPS 3)。为什么这儿要用这个算子而不用select_shape()呢?好奇的小朋友可以自己试一下。因为我们上面一步算子提取的是亚像素精度的边缘嘛,所以出来的就是xld了,那就只能用xld的算子来筛选啦。用了亚像素,halcon自己都很自信,直接给提取出来的轮廓叫了Reledges,我英文不好,反正我就把rel理解成real,哼!

机器视觉之halcon入门(11)-一文弄懂halcon例程:rim.hdev
图 3-6-7

不得不承认,的确提取的还是可以的,如上图(3-6-7),蛮准。接下来是要求它的直径了,如果是一个region,我最喜欢的就是smallest_circle()来求最小外接圆,直接求出这个圆的直径,但是那样明显会不准,结果偏大。所以本例也没有用我那么挫的方法。要求直径,还是得把这些亚像素的边缘,拟合成一个规则图形,才能求直径,所以下一步又是一个(甚至一类)新算子:

fit_ellipse_contour_xld (RelEdges, ‘ftukey’, -1, 2, 0, 200, 3, 2, Row, Column, Phi, Ra, Rb, StartPhi, EndPhi, PointOrder):fit在我初中时候我一直感觉就是”使合身”的意思。这儿也将就着这样理解吧:使这个亚像素的轮廓(contour_xld)合身到一个椭圆(ellipse)上,或者说拟合,当然也可能只是椭圆的一条弧。成了一个规则图形,这个椭圆的参数就可以给我们了。这个算子第一个参数是要拟合的xld边缘,第二个参数是拟合的算法,貌似有很多种拟合成椭圆的算法,但是初学者实在没必要会这些,直接默认的算法即可,后面的参数我也喜欢直接默认,到出不来效果再F1 去看看要调整哪个参数。这算不算一个小技巧?后面的Row ,Column就是这个椭圆的中心了,Ra,Rb是椭圆的长短轴,Phi是长轴的角度,不是每个椭圆的长轴都是水平的嘛!这个很好理解。StartPhi和EndPhi是弧线的起始终止角度了。最后的PointOrder,你自己去帮助文档看吧!都第五节了,不能总是靠我说(其实这个算子前面几个我没说的参数也是可以通过自己看帮助了解的,这一个算子的那几个参数刚好不难理解,可以试着自学一下)。

得到这些参数了,下面当然要显示出来嘚瑟下,顺着代码往下看,出现了红色的代码:

display_ellipses (Rim, Row, Column, Phi, Ra, Rb, WindowID):看字面意思就是显示椭圆了,你按F1进帮助发现也没有多少解释了,为什么呢?因为这是一个函数,类似于C#里面的一个方法,对的,halcon里面也可以自己写方法,然后调用的哦!右键这个函数,然后选择”在新的标签页中显示函数”,就可以看到这个函数的函数体了。如下图:

机器视觉之halcon入门(11)-一文弄懂halcon例程:rim.hdev
图 3-6-8

机器视觉之halcon入门(11)-一文弄懂halcon例程:rim.hdev
图 3-6-9

我们先来看看本例是怎么显示的(本节在TIPS 4里面再告诉大伙儿怎么自己写一个函数),如上图(3-6-9),放眼望去也就两个新算子,

gen_ellipse_contour_xld(Ellipse,Row,Column,Phi,Ra,Rb,gen_tuple_const(|Row|,0), gen_tuple_const(|Row|,6.28318), gen_tuple_const(|Row|,’positive’), 1.5):创建一个符合椭圆曲线的XLD轮廓。就是根据上一步求出来的椭圆那么多参数,再把这个椭圆画出来呗。大家不要被后面这么多参数吓到了,其实几乎所有的参数都是上一个算子fit_ellipse_contour_xld ()算出来的。第一个就是你要画的XLD轮廓的名字了;第二个第三个就是椭圆的中心坐标;第四个就是这个椭圆长轴的角度;第五个第六个就是长短轴的长度了;第七个第八个就是这个椭圆的开始角度和结束角度了;第九个参数就是PointOrder了;第十个参数是相邻轮廓点之间的最大距离。纵观这10个参数,第一个是命名,第十个是设置下相邻轮廓点的距离,小于该距离的应该就合并成有一个弧线了。中间的八个参数都是上一个fit…算子给出来的,当然PointOrder参数两个设为一样的就可以了。那么这里为什么会出现这么多”gen_tuple_const(|Row|,0)”呢?其实目的只有一个,保持参数个数一样的。这个算子的意思是生成一个成员全为常数的数组,数组成员的个数是第一个参数,成员的常数值为第二个参数,在这里就是生成有一个跟Row数组个数一样多的值全为0的数组。因为你的第二个到第五个参数都是数组,每个数组有多个成员,后面角度的个数也得配套才对,这个角度就是画圆的起始和终止角度了嘛。画整个椭圆就是0到2π(6.28318)了。这个懂了这个后面的也就都好懂了。

接下来这个算子:

gen_arrow_contour_xld (Arrow2, Row + Ra * sin(Phi), Column – Ra * cos(Phi), Row – Ra * sin(Phi), Column + Ra * cos(Phi), 5, 5):就是画一个箭头了。这个严格意义上应该也不叫算子,属于halcon自己封装的所有例子里面通用的一个函数了。你右键依然可以在新的标签页中显示出它是怎么画的具体halcon代码。但是我是不求甚解的。直接调用就可以了。那么画一个箭头需要几个参数呢?看看halcon的设定:第一个参数就是这个箭头的名字了;第二个第三个参数是箭头开始点的坐标;第四个第五个参数是箭头的结束坐标;第六个第七个参数是箭头的长度跟宽度。我们再看看本例里面的参数设定,不如我换个讲解方式,你们跟我一起来看,我说个大致的,它一共画了四次箭头,说明每个圆画了四个,但是起始点竟然都不是圆心,你单步执行下就知道。其实把起始点都换成圆心也是可以的(本人亲测哦,你也不妨一试)。

好啦,这个函数里面剩下的就没什么好说的了,你们自己单步执行下就都懂啦。我们跳出来,回到主函数继续:

机器视觉之halcon入门(11)-一文弄懂halcon例程:rim.hdev
图 3-6-10

还是老规矩,先看halcon自己的绿色注释,如上图(3-6-10):接下来的目的是找到图片中的字符,提取小的灰度值较低的region。我记得以前我说过,字符的提取识别,有很多种方法。halcon也喜欢显摆不同的方法,比如本例:

gauss_filter (Rim, RimGauss, 11):用离散高斯函数平滑图片,第三个参数就是平滑过滤器的大小了,一般都是奇数,其实跟平滑系数一个意思我觉得,越大越平滑呗。

dyn_threshold (Rim, RimGauss, SmallAndDarkerRegion, 5, ‘dark’):使用局部阈值分割图像。这两个算子合起来,也算是一个小连招了,比较容易筛选出来一些较为尖锐的部分,也就是灰度值变化稍微大一点的地方。第一个参数就是正常图像了;第二个是平滑过后的图像;第三个是输出的region;第四个是阈值,灰度值变化超过阈值的被筛选出来;第五个是选择暗的地方还是亮的地方,还是亮或者暗的地方都要。具体的数学公式我就不列出来了,你们F1进去看吧。

经过这两步之后,再稍微求下连通域,select下shape,就可以筛选出来字符了。厉不厉害?好吧,我无聊了。。

接下来的步骤,它也卖了个关子,先没全部选中,然后一个小技巧,求了下闭运算又来个交集,找到了整个字符区域,这些都没有什么新意了。你们可以自学。我想讲的是下面这几行代码:

机器视觉之halcon入门(11)-一文弄懂halcon例程:rim.hdev
图 3-6-11

就是上图(3-6-11)中红框框内的几行代码了。这几行代码涉及到了线性代数的只是了,就算你不记得什么叫线性代数了也没太大关系,大不了不知道具体原理吧,先学会用呗。大致来说:一个图像要平移,旋转,缩放都可以通过图像的坐标左乘矩阵来实现。所以要实现一个图像的平移,旋转,缩放我们要先求出这个矩阵。求这个矩阵之前你得先生成一个,也可以叫初始化一个吧,或者实例化一个,就是红框内的第一步了,第二步就是为这个矩阵增加一个旋转矩阵,第三步就是用这个矩阵来转region,第四步就是用这个矩阵来转图像。下面我们挨个讲下每个算子的参数:

hom_mat2d_identity (HomMat2DIdentity):生成一个齐次二维矩阵,hom就是齐次,mat就是矩阵,2d就是2维。

hom_mat2d_rotate (HomMat2DIdentity, rad(180) – PhiChar, RowChar, ColumnChar, HomMat2DRotate):这就是在这个矩阵里面添加旋转矩阵,第一个参数就是初始化的矩阵,第二个就是要旋转的角度,第三个就是要围绕哪个点来旋转,第四个参数就是转完后的矩阵了。围绕哪个点来转,转多少度呢?本例中这些参数都来自上一步smallest_rectangle2()别跟我说你不记得这句算子的含义了!

affine_trans_region (Characters, CharRotated, HomMat2DRotate, ‘constant’):这个就是用上面的矩阵来旋转region了,第一个参数是要旋转的region,第二个是旋转后的region,第三个是旋转矩阵,第四个是是否用插值,有两个选择,’constant’和’nearest_neighbor’ ,第一个应该是用常数,第二个应该是用最邻近的灰度值,(这是我的猜测,不知道对不对的)。据说用第二个会增加代码运行时间但是使边缘更平滑。我都不在意那些细节的。。。

affine_trans_image (Rim, RimRotated, HomMat2DRotate, ‘weighted’, ‘false’):这个就是用矩阵来旋转图片了,前三个参数还是那意思,第四个是插值方法,具体的前面章节有介绍过,也就一个”weighted”没有说过,F1里面刚好有介绍,这个任务果断留给你。。第五个参数是是否需要适应图片大小,选false吧,这样真实点,没什么好适应的。单步执行下,你会发现图片旋转到了字符是水平的角度了。接下来一堆褐色的代码就是显示了。我也就不再赘述。如果你有兴趣,可以接着用OCR识别,把这几个字符识别出来。我之前有教过的哦!在此就不重复了,但是本节知识点还是挺多了,还是得帮你们总结一下,毕竟谁都懒。。。

1)edges_sub_pix (RimReduced, Edges, ‘canny’, 4, 20, 40):

2)select_contours_xld (Edges, RelEdges, ‘length’, 30, 999999, 0, 0):

3)fit_ellipse_contour_xld (RelEdges, ‘ftukey’, -1, 2, 0, 200, 3, 2, Row, Column, Phi, Ra, Rb, StartPhi, EndPhi, PointOrder):

4)gen_ellipse_contour_xld(Ellipse,Row,Column,Phi,Ra,Rb, gen_tuple_const(|Row|,0), gen_tuple_const(|Row|,6.28318), gen_tuple_const(|Row|,’positive’), 1.5):

5)gen_arrow_contour_xld (Arrow2, Row + Ra * sin(Phi), Column – Ra * cos(Phi), Row – Ra * sin(Phi), Column + Ra * cos(Phi), 5, 5):

6)gauss_filter (Rim, RimGauss, 11):

7)dyn_threshold (Rim, RimGauss, SmallAndDarkerRegion, 5, ‘dark’):

8)hom_mat2d_identity (HomMat2DIdentity):

9)hom_mat2d_rotate (HomMat2DIdentity, rad(180) – PhiChar, RowChar, ColumnChar, HomMat2DRotate):

10)affine_trans_region (Characters, CharRotated, HomMat2DRotate, ‘constant’):

11)affine_trans_image (Rim, RimRotated, HomMat2DRotate, ‘weighted’, ‘false’):

不管怎么说,这一节的任务还是很重的,知识点有点多,建议大家过段时间回头在看一遍,或许有新的领悟。本节不但学了这么多新算子,还学了一些小套路比如开闭运算的合作弄出边缘区域,平滑和局部阈值的连招等。另外还有自己写一个小函数的方法。都是知识点啊!都得学会啊同学们!

本节TIPS:
1) 圆度的计算公式,halcon里面也有的,在帮助里面,直接搜索circularity就有了,如下图(3-6-12):

机器视觉之halcon入门(11)-一文弄懂halcon例程:rim.hdev
图 3-6-12

什么意思呢?F是这个region的面积,max是这个region里面从中心到边缘最远的距离(如果Region是个圆,max就是半径了),那么C’就等于F/(maxmaxπ),我的理解,分母就是圆的面积公式了,如果你是圆,你的圆度就是1,如果不是应该大多数情况下都小于1吧。为了把圆度的值域约束在[0,1]之间,halcon加了下面一行,C=min(1,C’)。这个C才是region的圆度。至于有没有一个图形它通过第一种算法会大于1呢?我没有考究过。。。毕竟不是真学霸呀哈哈!

2) 亚像素应该是比像素精度更高一级的吧,我们都知道,图像里面的一条线,其实是n个像素拼在一起的嘛,但是像素其实是有大小的,所以它的精度只能精确到他的像素级别,但是我们做算法的时候,其实可以把每个像素再切割一下,然后来求,这样原来一个像素只能表示一个值,现在一个像素被切割成了2个或3个,就可以表示2个或者3个数值了,是不是精度相对就上去了?更为科学的严谨的解释请百度。。。。

3) XLD算是halcon里面的另一种类型了。Halcon类型简单来说分为两种,一种是HTuple,一种是HOjbect。一般的数值,数组,字符,句柄等都是HTuple了,一般的图片,region,XLD就都是HObject了。XLD就是上面都说的,亚像素精度的轮廓啊线条啊之类的,他可以让你的图像处理的精度更高一个级别。操作方法跟region其实很大一部分都是一样的了。但是它不是region,很多时候你要学会这两个之间的转换的算子,今天第一次接触就先不说了。等以后我详细列举一下,并说一下之间的规律。

4) 还记得我开头的时候说过,halcon里面的很多功能我会一点儿一点儿告诉你们的吗?如果开头就说肯定难记住,不如这样一点一点说,我觉得会比较好一点,就像全班的同学,一天认识几个,过几天又认识几个,慢慢就都认识了,一下子全罗列出来反而没精力去认识了还容易混淆。这儿我们就来说说halcon的自己创建函数:

机器视觉之halcon入门(11)-一文弄懂halcon例程:rim.hdev
图3-6-13

点开上图(3-6-13)的”创建新函数”选项,在弹出窗口中,给自己的新函数命一个名,然后点击参数栏,如下图(3-6-14):前两个是图标参数,一个输入一个输出,后两个是控制参数,一个输入一个输出。这个我开头就讲过的了,你的函数里面需要哪些参数,在这儿命名好就可以了,如果你某种类型的参数有两个或多个,点击加号按钮,下面对自动生成多一个。添加完后点击应用,程序窗口就会自己进入你的这个函数的里面,你在里面编写你要实现的功能就可以了。这个栏里还有一般文档,可以给文档加一些注释啊之类的,你们就自己看看吧。

机器视觉之halcon入门(11)-一文弄懂halcon例程:rim.hdev
图 3-6-14

写完之后,如果还想修改函数,可以”函数”->”编辑函数”,然后最下面看到你函数名,点进去就可以编辑了。有没有想动手跃跃欲试的感觉,哈哈不要克制,just do it!

一文弄懂halcon例程:rim.hdev相关推荐

  1. 一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述

    <繁凡的深度学习笔记>第 15 章 元学习详解 (上)万字中文综述(DL笔记整理系列) 3043331995@qq.com https://fanfansann.blog.csdn.net ...

  2. 一文弄懂神经网络中的反向传播法

    最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进 ...

  3. 一文弄懂各种loss function

    有模型就要定义损失函数(又叫目标函数),没有损失函数,模型就失去了优化的方向.大家往往接触的损失函数比较少,比如回归就是MSE,MAE,分类就是log loss,交叉熵.在各个模型中,目标函数往往都是 ...

  4. 一文弄懂神经网络中的反向传播法——BackPropagation【转】

    本文转载自:https://www.cnblogs.com/charlotte77/p/5629865.html 一文弄懂神经网络中的反向传播法--BackPropagation 最近在看深度学习的东 ...

  5. 一文弄懂String的所有小秘密

    文章目录 简介 String是不可变的 传值还是传引用 substring() 导致的内存泄露 总结 一文弄懂String的所有小秘密 简介 String是java中非常常用的一个对象类型.可以说ja ...

  6. 一文弄懂EnumMap和EnumSet

    文章目录 简介 EnumMap 什么时候使用EnumMap EnumSet 总结 一文弄懂EnumMap和EnumSet 简介 一般来说我们会选择使用HashMap来存储key-value格式的数据, ...

  7. CAD2010 为了保护_一文弄懂,锂电池的充电电路,以及它的保护电路方案设计

    原标题:一文弄懂,锂电池的充电电路,以及它的保护电路方案设计 锂电池特性 首先,芯片哥问一句简单的问题,为什么很多电池都是锂电池? 锂电池,工程师对它都不会感到陌生.在电子产品项目开发的过程中,尤其是 ...

  8. deque stack java_一文弄懂java中的Queue家族

    简介 java中Collection集合有三大家族List,Set和Queue.当然Map也算是一种集合类,但Map并不继承Collection接口. List,Set在我们的工作中会经常使用,通常用 ...

  9. 一文弄懂Flink网络流控及反压

    一文弄懂Flink网络流控及反压 1. 为什么需要网络流控? 2. 网络流控的实现:静态限速 3. 网络流控的实现:动态反馈/自动反压 3.1 案例一:Storm 反压实现 3.2 案例二:Spark ...

最新文章

  1. 以金山界面库(openkui)为例思考和分析界面库的设计和实现——问题
  2. Java状态模式实现工作流_关于使用“状态模式”做工作流概要。
  3. 图像的低频是轮廓,高频是噪声和细节 小波变换
  4. 无盘中用户数据的保存
  5. yum 找不到程序,yum更换国内阿里源
  6. linux(Ubuntu)常用命令整理 -- 基础篇 -- 持续更新
  7. C语言线程实例(生产者和消费者),Java多线程:生产者与消费者(1)
  8. 解决升级到Android Studio 3 Beta版本编译异常
  9. eclipse svn 没有 connector
  10. python运行快捷键是什么_Python快捷键
  11. dojo的API功能介绍
  12. 科室管理系统中,运用百度编辑器(ueditor1_4_3-utf8-jsp)出现的一系列问题!
  13. 无处安放         (此刻心情)
  14. python小数点后任意位_Python计算开方、立方、圆周率,精确到小数点后任意位的方法...
  15. unsw计算机科学的挂科率,可怕!澳洲大学 2018 期末近 300 人挂科!各大学挂科率曝光...
  16. 接口自动化测试高频面试题
  17. 程序员常用的画图软件/可视化和小技巧
  18. 毕达哥拉斯的面包规矩
  19. mysql安装了libaio还是报错_centos6 rpm安装mysql(5.5版本)包括 error : Failed dependencies:libaio的解决办法....
  20. 左支座零件的机械加工工艺规程及工艺装备设计(设计说明书+CAD图纸+任务书+工序卡+过程卡+文献+翻译)

热门文章

  1. 三跨),总分420+
  2. B树、B+树、B-树特点整合
  3. 和尚与尼姑雨中相遇后不得不说的故事1
  4. 7-1 打印沙漏 (20分)
  5. job历史执行记录查询 oracle_Oracle数据库定时任务配置和日志执行情况查询
  6. EXFO 730C光时域反射计只有iOLM光眼升级OTDR(开通otdr权限)
  7. 微信小程序场景值列表map格式
  8. 什么是恒流源?如何工作的?
  9. Go语言之值传递与引用传递
  10. mysql备份报错1356,解决mysqldump备份报错: Couldn't execute 'SHOW FIELDS FROM Unknown error 1356...