欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

Halcon知识:如何求一个工件的粗细

发布时间:2025/3/21 63 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Halcon知识:如何求一个工件的粗细 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

一、说明

在实际应用中,有时需要求一个物件的粗细;本文用最简单的方法,给出示范,并对关键几个函数给以说明。如图,假定我们有如下图物品,求其宽度。

 二、程序代码

dev_set_color ('red') read_image(Image,'D:/images/reglist/scrw.jpg') rgb1_to_gray(Image, Gmage)WindowWidth := 640 WindowHeight := 540 dev_open_window_fit_size (0, 0, WindowWidth, WindowHeight, -1, -1, WindowHandle1)threshold(Gmage, Region, 10, 75)fill_up(Region,RegionFillUp) get_region_thickness (RegionFillUp, Thickness, Histogramm) area_center (RegionFillUp, Area, Row, Column) elliptic_axis (RegionFillUp, Ra, Rb, Phi) StartRow := Row + sin(Phi) * Ra StartColumn := Column - cos(Phi) * Ra EndRow := Row - sin(Phi) * Ra EndColumn := Column + cos(Phi) * Ra dev_set_color ('yellow') disp_line (WindowHandle1, StartRow, StartColumn, EndRow, EndColumn)dev_open_window (0, WindowWidth + 10, 660, WindowHeight, 'black', WindowHandle2) plot_tuple (WindowHandle2, [], Thickness, [], [], 'red', ['style','margin_top'], ['line',WindowHeight * 0.2]) disp_message (WindowHandle2, 'Thickness along the main axis', 'window', 12, 12, 'black', 'true')

输出效果图:

  

三、代码说明

3.1 读入图像并二值化

dev_set_color ('red')
read_image(Image,'D:/images/reglist/scrw.jpg')   读图像
rgb1_to_gray(Image, Gmage)        转成灰度

WindowWidth := 640
WindowHeight := 540
dev_open_window_fit_size (0, 0, WindowWidth, WindowHeight, -1, -1, WindowHandle1) 

                                                        预备一个窗口

threshold(Gmage, Region, 10, 75)    二值化区域

fill_up(Region,RegionFillUp)          填充区域内部空洞

3.2 椭圆区域处理

get_region_thickness (RegionFillUp, Thickness, Histogramm) area_center (RegionFillUp, Area, Row, Column) elliptic_axis (RegionFillUp, Ra, Rb, Phi)

以上代码将区域假定为椭圆拟合,求出沿主轴的一些属性:

  • get_region_thickness (RegionFillUp, Thickness, Histogramm)

运算符 get_region_thickness 计算截面中每个像素沿主轴(参见 elliptic_axis)的区域厚度。主轴上某一点处的厚度定义为轮廓与主轴上铅垂在相应点上相距最远的交点之间的距离。此外,运算符 get_region_thickness 返回区域厚度的直方图。直方图的长度对应于观察区域中出现的最大厚度。

Histogramm:的数据结构

  • area_center (RegionFillUp, Area, Row, Column)

运算符 area_center 计算输入区域的面积和中心。面积定义为一个区域的像素数。中心分别计算为所有像素的行坐标或列坐标的平均值。

如果传递了多个区域,则结果存储在元组中,元组中值的索引对应于输入区域的索引。在空白区域的情况下,如果没有设置其他行为,则所有参数的值都为 0.0(参见 set_system)。

  • elliptic_axis (RegionFillUp, Ra, Rb, Phi)
算子 elliptic_axis 计算与 Regions 中的输入区域具有相同方向和相同纵横比的椭圆的半径 Ra 和 Rb 以及方向 Phi。几个输入区域可以作为元组传递。 Ra 代表椭圆的主半径,而半径 Rb 代表椭圆的次半径。主轴相对于 x 轴的方向以 Phi 返回,以弧度表示。椭圆的主轴相当于输入区域的惯性矩的主轴。 如果矩,, 和 被归一化并传递到该区域(请参阅 moment_region_2nd),则半径 Ra 和 Rb 计算为:

如果传递了多个区域,则结果将存储在元组中。结果元组元素的索引对应于相应输入区域的索引。 

3.3 画出主轴线

这里是从中心点为基点,辅助轴偏角画出轴线 

StartRow := Row + sin(Phi) * Ra StartColumn := Column - cos(Phi) * Ra EndRow := Row - sin(Phi) * Ra EndColumn := Column + cos(Phi) * Ra dev_set_color ('yellow') disp_line (WindowHandle1, StartRow, StartColumn, EndRow, EndColumn)

3.4 画出直方图

dev_open_window (0, WindowWidth + 10, 660, WindowHeight, 'black', WindowHandle2) plot_tuple (WindowHandle2, [], Thickness, [], [], 'red', ['style','margin_top'], ['line',WindowHeight * 0.2]) disp_message (WindowHandle2, 'Thickness along the main axis', 'window', 12, 12, 'black', 'true')
  • plot_tuple( : : WindowHandle, XValues, YValues, XLabel, YLabel, Color, GenParamNames, GenParamValues : )

该算子将输入的 “x元组,等长度的y元组”,画出其函数的曲线:

XValues:要绘制的函数的 X 值。

如果 XValues 设置为 [],则将其内部设置为 0,1,2,...,|YValues|-1。
如果 XValues 是字符串元组,则将这些值视为类别。

YValues:要绘制的函数的 Y 值。

如果 YValues 设置为 [],则它内部设置为 0,1,2,...,|XValues|-1。
y 值的数量必须等于 x 值的数量
或整数倍。在后一种情况下,
绘制了多个函数,它们共享相同的 x 值。

XLabel: X axis label.

XLabel: Y axis label.

color:绘制函数的颜色。
如果给出 [],则使用当前设置的显示颜色。 如果给出'none',则不绘制函数,而仅绘制 指定的坐标轴。 如果给出一种以上的颜色,多种函数可以用不同的颜色显示。

GenParamNames:控制演示的通用参数。可能的值:'axes_color':坐标系颜色。 默认值:“白色” 如果给出'none',则不显示坐标系。'style':图形样式。 可能的值:'line'(默认)、'cross'、'filled''clip':将图形剪辑到坐标系区域。 可能的值:“否”(默认)、“是”'ticks':控制轴上刻度的显示。 如果给出“min_max_origin”(默认),则显示刻度 在轴的最小值和最大值处以及 x 轴和 y 轴的截点。 如果给出“无”,则不显示刻度。 如果给定任何数字!= 0,则将其解释为距离 刻度之间。'ticks_x':仅控制 x 轴上刻度的显示。'ticks_y':仅控制 x 轴上刻度的显示。'grid':控制坐标系内网格线的显示。 如果给出“min_max_origin”(默认),则显示网格线 在轴的最小值和最大值处。 如果给出“无”,则不显示网格线。 如果给定任何数字!= 0,则将其解释为距离 网格线之间。 'grid_x':仅控制 x 轴的网格线显示。'grid_y':仅控制 y 轴的网格线显示。'grid_color':网格的颜色(默认值:'dim gray')。'margin':坐标系区域的像素距离 到所有四个窗口边框。'margin_left':坐标系区域的像素距离 到左窗口边框。'margin_right':坐标系区域的像素距离 到右侧窗口边框。'margin_top':坐标系区域的像素距离 到上窗口边框。'margin_bottom'':坐标系区域的像素距离 到下窗口边框。'start_x':x 轴的最低 x 值。 默认值:min(XValues)'end_x':x 轴的最高 x 值。 默认值:最大值(XValues)'start_y':x 轴的最低 y 值。 默认值:min(YValues)'end_y':x 轴的最高 y 值。 默认值:最大值(YValues)'origin_x':x 轴和 y 轴的截点的 X 坐标。 默认值:与 start_x 相同'origin_y':x 和 y 轴的截点的 Y 坐标。 默认值:与 start_y 相同GenParamValues:GenericParamNames 的通用参数的值。 《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读

总结

以上是生活随笔为你收集整理的Halcon知识:如何求一个工件的粗细的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。