[Halcon&测量] 一维测量

简介: [Halcon&测量] 一维测量

一、Halcon一维测量原理:

       像点到点的距离,边缘对的距离等沿着一维方向的测量都属于1D测量范畴。Halocn的一维测量首先构建矩形或者扇形的ROI测量对象,然后在ROI内画出等距离的、长度与ROI宽度一致的、垂直于ROI的轮廓线(profile line)的等距线。如下图所示。

测量ROI的轮廓线尽量与被测边缘垂直,宽度适当宽些,等距线的密集度考虑速度与精度综合选择,这样可以减少噪声。

然后,沿着垂直轮廓线的方向,计算出每一条等距线的平均灰度值,可以得出轮廓线的灰度直方图,同时可以选择使用高斯滤波器平滑灰度直方图。如下图所示。Halcon算子measure_pairs的参数Sigma指定了高斯滤波器的标准差。

最后,求出平滑灰度直方图的一阶导数,一阶导数的极值点作为边缘的亚像素精度候选点,只有一阶导数极值点的绝对值大于预先设定的阈值(测量算子的参数Threshold)边缘候选点才被选作为边缘中心点。Halcon测量算子最后得到每一条边缘与轮廓线的交点。

 

二、一维测量算法流程:

核心思想:可参考halcon中一维测量中measure_pin中的例子

1)定位 (Blob分析或模板匹配)

2)测量

3)显示

Halcon一维测量相关算子:

gen_measure_rectangle2( : : Row, Column, Phi, Length1, Length2, Width, Height, Interpolation : MeasureHandle)

名字:生成仿射矩形区域测量句柄

描述:用于提取垂直于仿射矩形的直边

参数:

Row:仿射矩形中心行坐标

Column:仿射矩形中心列坐标

Phi:仿射矩形的纵轴水平角,单位弧度 ,注意:测量矩形的测量方向的选择

Length1:仿射矩形宽度的一半

Length2:仿射矩形高度的一半

Width:图像的宽度

Height:图像的高度

Interpolation :插值类型

MeasureHandle:测量对象句柄

gen_measure_arc( : : CenterRow, CenterCol, Radius, AngleStart, AngleExtent, AnnulusRadius, Width, Height, Interpolation : MeasureHandle)

名字:生成环形区域测量句柄

描述:用于提取垂直环形圆弧的直边缘。

参数:

CenterRow:圆弧中心行坐标

CenterCol:圆弧中心列坐标

Radius:圆弧半径

AngleStart:圆弧起始角度

AngleExtent:圆弧角度范围

AnnulusRadius:环形带的半径(宽度的一半)

Width:图像的宽度

Height:图像的高度

Interpolation :插值类型

MeasureHandle:测量对象句柄

measure_pairs(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)

名字:测量边缘对
描述:提取垂直于仿射矩形或环形圆弧的直边缘对。
参数:

Image:输入图像

MeasureHandle:测量对象句柄

Sigma:高斯平滑参数

Threshold:最小边缘幅度

Transition:边缘对极性,第一个与第二个相反

Select :选择边缘对

RowEdgeFirst:边缘点对的第一个边缘的中心行坐标

ColumnEdgeFirst:边缘点对的第一个边缘的中心列坐标

AmplitudeFirst:第一个边缘的幅度

RowEdgeSecond:第二个边缘中心行坐标

ColumnEdgeSecond:第二个边缘中心列坐标

AmplitudeSecond:第二个边缘幅度

IntraDistance:两个边缘对之间的距离

InterDistance:相邻边缘对之间的距离

 

measure_pos(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdge, ColumnEdge, Amplitude, Distance)

名字:测量边缘对
描述:提取垂直于仿射矩形或圆弧的直边缘。
参数:

Image:输入图像

MeasureHandle:测量对象句柄

Sigma:高斯平滑系数

Threshold:最小边缘幅度

Transition:极性

*Select:边缘选择

RowEdge:找到的边缘中心的行坐标

ColumnEdge:找到的边缘中心列坐标

Amplitude:边缘幅度

Distance:相邻边缘之间的距离

measure_pairs与measure_pos的区别:一般,measure_pairs可以用于许多组边缘对的情况,measure_pos用于一组边缘对的情况。

幅度是指边缘处明暗灰度各自的均值差,如下图所示。

 

translate_measure( : : MeasureHandle, Row, Column )(选用)

名字:转换一个度量对象
描述:一般用于一个程序中有很多测量矩形的情况,当使用第二个测量矩形时,不需要重新   gen_measure_rectangle2生成,将第二个测量矩形的中心坐标放到该算子的第二、三个参数当中即可,其第一个参数得到的句柄就相当于使用gen_measure_rectangle2算子正常生成的测量矩形句柄。然后使用measure_pos对该句柄进行正常计算。
参数:

MeasureHandle:测量句柄

Row:新参考点的行坐标

Column :新参考点的列坐标

 

三、实例分析:测量药瓶中液体的充满率

dev_close_window ()
dev_update_off ()
read_image (Image, 'ampoules/ampoules_01')
get_image_size (Image, Width, Height)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_set_line_width (2)
dev_set_draw ('margin')
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
* 
* Create a model for the ampoule head to align the measure handle
gen_rectangle1 (Rectangle, 230, 280, 317, 330)
reduce_domain (Image, Rectangle, ImageModel)
create_shape_model (ImageModel, 'auto', 0, 0, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
* 
* Initialize the measure handle
gen_measure_rectangle2 (0, 0, rad(90), 75, 20, Width, Height, 'bilinear', MeasureHandle)
Tolerance := 15
* 
* Determine the fill level
NumImages := 8
for Index := 1 to NumImages by 1
    read_image (Image, 'ampoules/ampoules_' + Index$'.2d')
    ColumnEdges := []
    FillLevelHeight := []
    * 
    find_shape_model (Image, ModelID, 0, 0, 0.7, 0, 0.1, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
    MeanRow := mean(Row)
    RefLevel := MeanRow - 160
    * Display tolerance area
    dev_display (Image)
    dev_set_line_width (1)
    dev_set_color ('white')
    gen_rectangle2 (AcceptLevel, RefLevel, mean(Column), 0, 30 + (max(Column) - min(Column)) / 2, Tolerance)
    dev_display (AcceptLevel)
    dev_set_line_width (2)
    * 
    *  Determine fill level of each ampoule
    Errors := 0
    for Idx := 0 to |Score| - 1 by 1
        translate_measure (MeasureHandle, MeanRow - 135, Column[Idx])
        * Search for the topmost edge
        measure_pos (Image, MeasureHandle, 2, 7, 'all', 'first', RowEdge, ColumnEdge, Amplitude, Distance)
        FillLevelHeight := [FillLevelHeight,RowEdge]
        ColumnEdges := [ColumnEdges,ColumnEdge]
        gen_cross_contour_xld (Cross, RowEdge, ColumnEdge, 15, 0)
        gen_rectangle2 (FillLevel, RowEdge, ColumnEdge, 0, 28, 20)
        if (abs(FillLevelHeight[Idx] - RefLevel) >= Tolerance)
            gen_rectangle2 (ChamberSingle, MeanRow - 133, Column[Idx], 0, 35, 90)
            gen_cross_contour_xld (Cross, FillLevelHeight[Idx], ColumnEdges[Idx], 15, 0)
            gen_rectangle2 (FillLevel, FillLevelHeight[Idx], ColumnEdges[Idx], 0, 28, 20)
            Errors := Errors + 1
            dev_set_color ('red')
            dev_display (ChamberSingle)
            disp_message (WindowHandle, 'NG', 'image', FillLevelHeight[Idx] - 50, ColumnEdges[Idx] - 10, 'red', 'false')
        else
            disp_message (WindowHandle, 'OK', 'image', FillLevelHeight[Idx] - 50, ColumnEdges[Idx] - 10, 'green', 'false')
            dev_set_color ('green')
        endif
        dev_display (FillLevel)
        dev_display (Cross)
    endfor
    if (Errors > 0)
        disp_message (WindowHandle, Errors + ' BAD', 'window', 10, 12, 'red', 'true')
    else
        disp_message (WindowHandle, 'All OK', 'window', 10, 12, 'forest green', 'true')
    endif
    if (Index < NumImages)
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
endfor
close_measure (MeasureHandle)
clear_shape_model (ModelID)

中心思想:以瓶底为模板进行模板匹配,可以找到每个药瓶中心点列坐标,创建一个覆盖瓶身的测量矩形框,以每个药瓶中心点列坐标为基准平移测量矩形,可以得到药瓶子液体边缘的中心坐标。生成一个白色的参考矩形框,只有液体边缘行坐标在这个矩形框中,才算合格。

 


戳戳小手帮忙点个免费的赞和关注吧,嘿嘿。


目录
相关文章
|
9月前
|
算法
基于最小二乘正弦拟合算法的信号校正matlab仿真,校正幅度,频率以及时钟误差,输出SNDR,SFDR,ENOB指标
基于最小二乘正弦拟合算法的信号校正matlab仿真,校正幅度,频率以及时钟误差,输出SNDR,SFDR,ENOB指标
|
9月前
|
编解码 索引
LabVIEW使用正交编码器进行角位置测量
LabVIEW使用正交编码器进行角位置测量
116 1
|
9月前
|
数据安全/隐私保护
matlab 曲线光滑,去毛刺,去离群值,数据滤波,高通滤波,低通滤波,带通滤波,带阻滤波
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
|
算法
通过白噪声的频谱处理产生任意光谱斜率(f^a)噪声(Matlab代码实现)
通过白噪声的频谱处理产生任意光谱斜率(f^a)噪声(Matlab代码实现)
110 0
|
9月前
|
文字识别 Python
Halcon 学习笔记五:几何定位+仿射变换+测量
Halcon 学习笔记五:几何定位+仿射变换+测量
847 0
|
9月前
[Halcon&测量] 两线直线的角度测量
[Halcon&测量] 两线直线的角度测量
181 0
|
9月前
Halcon&测量] 模糊测量
Halcon&测量] 模糊测量
164 0
|
机器学习/深度学习 传感器 算法
【红外与可见光图像融合】离散平稳小波变换域中基于离散余弦变换和局部空间频率的红外与视觉图像融合方法(Matlab代码实现)
【红外与可见光图像融合】离散平稳小波变换域中基于离散余弦变换和局部空间频率的红外与视觉图像融合方法(Matlab代码实现)
|
算法
用于二维和三维声学设计灵敏度分析的奇异边界法(Matlab代码实现)
用于二维和三维声学设计灵敏度分析的奇异边界法(Matlab代码实现)
119 0
|
机器学习/深度学习 传感器 算法
基于MATLAB的单目或双目结构光正弦条纹校准
基于MATLAB的单目或双目结构光正弦条纹校准

热门文章

最新文章