首页 > 其他分享 >halcon绘制图形

halcon绘制图形

时间:2024-03-14 19:58:45浏览次数:22  
标签:set Image dev halcon 参数 image 图形 绘制 display

1、ROI是Halcon中的一个很重要的概念,为了减少计算量,只关注待检测物体或该物体周围的一片区域即可(类似于图片裁剪)

* ROI是Halcon中的一个很重要的概念,为了减少计算量,只关注待检测物体或该物体周围的一片区域即可,
* ROI就是图像处理所关注的区域

* read_image 读取图像数据
read_image(Image,'claudia')

* get_image_size 获取图像尺寸
get_image_size(Image,Width,Height)

* dev_open_window 打开窗体
* 参数一、二:表示窗口的左上角的XY坐标。
* 参数三、四:分别表示窗口的宽度和高度。
* 参数五:表示窗口的背景色为黑色。
* 参数六:是窗口的句柄或标识符。
dev_open_window(0,0,Width,Height,'black',WindowHandle)

* dev_display 用于显示图像
dev_display(Image)

* draw_rectangle1 在具体的窗口上绘制一个矩形
* 参数一:绘制的窗体
* 参数二、三:绘制的起点XY坐标
* 参数四、五:绘制的终点XY坐标
* 注意:参数是需要赋值
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)

* gen_rectangle1 创建矩形
* 参数一:矩形的名称
* 参数二、三:起点的XY坐标
* 参数四、五:终点的XY坐标
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)

* reduce_domain 裁剪选中的图像
* 参数一:需要裁剪的图片名字
* 参数二:裁剪的区域
* 参数三:新图片的名字
reduce_domain (Image, Rectangle, ImageReduced)

* draw_circle 绘制圆形
draw_circle(WindowHandle, Row, Column, Radius)
* gen_circle 创建圆形
gen_circle (Circle, Row, Column, Radius)
* reduce_domain 裁剪选中的图像
reduce_domain (ImageReduced, Circle, ImageReduced1)

* draw_rectangle2  绘制旋转矩形
draw_rectangle2 (WindowHandle, Row3, Column3, Phi, Length1, Length2)
* gen_rectangle2 创建旋转矩形
gen_rectangle2 (Rectangle1, Row3, Column3, Phi, Length1, Length2)
* reduce_domain 裁剪选中的图像
reduce_domain (ImageReduced1, Rectangle1, ImageReduced2)

在这里插入图片描述

2、blob图像预处理

blob是指二值图像中连通区域的表示。预处理blob通常包括一系列步骤,例如去噪、形态学操作、特征提取等。

* blob
read_image(Image,'claudia')
get_image_size(Image,Width,Height)
dev_open_window_fit_size (0, 0, Width, Width, -1, -1, WindowHandle)
dev_display(Image)

* 高斯噪声
gauss_distribution (60, Distribution)
* 添加噪声分布
add_noise_distribution (Image, ImageNoise, Distribution)
* 生成图像(保存到本地)这里保存的使‘bmp’格式的图片,第三个参数是保存的路径
* 生成图像保存到本地
* 参数一:句柄
* 参数二:保存的图片格式
* 参数三:保存的路径
* dump_window (WindowHandle, 'bmp', 'D:/Halcon/绘制图形/高斯噪声')

* 均值平滑 (对图像进行平均滤波处理,以降低图像中的噪声。)
mean_image (ImageNoise, ImageMean, 5,5)
dump_window (WindowHandle, 'bmp', 'D:/Halcon课程/绘制图形/均值平滑')

* 中值滤波
* 参数:(输入图像,输出图像,滤波器形状(圆circle、正方形square),尺寸,边界处理方式(持续continued、循环cyclic))
median_image (ImageMean, ImageMedian, 'circle', 1, 'mirrored')
dump_window (WindowHandle, 'bmp', 'D:/Halcon/绘制图形/中值滤波1')

median_image (ImageMean, ImageMedian, 'circle', 5, 'mirrored')
dump_window (WindowHandle, 'bmp', 'D:/Halcon/绘制图形/中值滤波5')

median_image (ImageMean, ImageMedian, 'circle', 7, 'mirrored')
dump_window (WindowHandle, 'bmp', 'D:/Halcon/绘制图形/中值滤波7')

* 椒盐噪声分布
sp_distribution (5, 5, Distribution)
add_noise_distribution (ImageMedian, ImageNoise1, Distribution)
dump_window (WindowHandle, 'bmp', 'D:/Halcon/绘制图形/椒盐噪声')

参考文章:median_image

在这里插入图片描述

3、绘制线段(案例)

read_image (Image, 'D:/VisionPro/Images/0.bmp')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)

* 绘制线
* 参数一:句柄
* 参数二、三:起点XY坐标
* 参数四、五:终点XY坐标
draw_line (WindowHandle, Row1, Column1, Row2, Column2)
* 生成线
gen_region_line (Line1, Row1, Column1, Row2, Column2)

* 测量
Line1Param:=[Row1,Column1,Row2,Column2]
* 1、创建后面使用的计量句柄(模型) out
create_metrology_model (MetrologyHandle)

* 2、设置测量模型的图像大小
set_metrology_model_image_size (MetrologyHandle, Width, Height)

* 3、给测量句柄添加要测量的模型
* 参数一:输入的句柄
* 参数二:查找的形状
* 参数三:形状的参数(如果是找线就是起点XY坐标,如果是找圆就是圆心的半径坐标)
* 参数四:要输入卡尺的搜索(测量)长度
* 参数五:要输入卡尺的投影(测量)长度
* 参数六:输入Sigma系数,相当于过滤掉n个像素
* 参数七:输入对比度阈值
* 参数八、九:通用参数设置
* 参数十:计算对象的索引,如果添加了多个对象,方便分辨
add_metrology_object_generic (MetrologyHandle, 'line', Line1Param, 10, 1, 1, 30, [], [], Index)

* 4、需要设置找线的参数
* 参数一:句柄
* 参数二:边缘检测
* 参数三:设置找线的极性 由暗到明
* 参数四:边缘检测
set_metrology_object_param (MetrologyHandle, 'all', 'measure_transition','all')

* 5、设置30个有效的点拟合一条直线
set_metrology_object_param (MetrologyHandle, 'all', 'num_instances', 30)
* 6、设置最小分数
set_metrology_object_param (MetrologyHandle, 'all', 'min_score', 0.7)
* 7、对图像进行测量
apply_metrology_model (Image, MetrologyHandle)
* 8、获取卡尺找到的行列坐标,显示卡尺的数量和区域
get_metrology_object_measures (Contours, MetrologyHandle, 'all', 'all', Row, Column)

* 9、生成一个十字,用于显示卡尺找到的点
* 参数一:用于存储生成的交叉轮廓的变量。
* 参数二、三:生成的十字的XY坐标
* 参数四:交叉线的长度
* 参数五:交叉线相对于水平线的夹角(单位弧度)
gen_cross_contour_xld (Cross, Row, Column, 6, 0.785398)

* 10、显示找到的线
get_metrology_object_result_contour (Contour, MetrologyHandle, 'all', 'all', 1.5)

dev_display (Image)
dev_set_color ('green')
dev_display (Line1)

* 11、获取测量结果
get_metrology_object_result (MetrologyHandle, 'all', 'all', 'result_type', 'all_param', Parameter)
* 获取测量的 (起点行列坐标)
get_metrology_object_result (MetrologyHandle, 'all', 'all', 'result_type', 'row_begin', RowBegin)

* 绘制完成,清除句柄
clear_metrology_model (MetrologyHandle)

参考文章:get_metrology_object_result

在这里插入图片描述

4、全阈值分割

* 获取当前活动窗口的句柄(handle)
dev_get_window (WindowHandle)
read_image (Image, 'pellets.png')

* 全局阈值分割,适用于环境稳定,目标与背景存在明显的灰度差的情况
* 参数一、二:输入图像和输出区域
* 参数三、四:阈值上限和下限
threshold (Image, Region, 128, 255)

* connection 连通性
* 参数一:输入区域
* 参数二:输出链接
connection (Region, Connection)

* select_shape 根据形状的特征选择目标区域
* 参数一:输入图像链接或区域
* 参数二:输出的选择后的区域
* 参数三:选择区域的特征,'area'表示区域的面积
* 参数四:多个条件的逻辑关系,'and'表示满足所有条件的区域
* 参数五、六:表示选择面积的最大值和最小值
select_shape (Connection, SelectedRegions, 'area', 'and', 550, 99999)

* erosion_circle 对选定的区域进行圆形腐蚀操作,断开链接区域
* 参数一:输入选定区域
* 参数二:输出腐蚀后的区域
* 参数三:腐蚀半径
erosion_circle (SelectedRegions, RegionErosion, 7.5)

* connection 连通性 核心用途就是拿着腐蚀处理后的对象,生成一个新的对象
connection (RegionErosion, ConnectedRegions2)

* 膨胀:对每个连通域做圆形膨胀操作,还原轮廓大小,目的是为了绘制边缘(半径越大,膨胀越明显)
dilation_circle (ConnectedRegions2, RegionDilation, 7.5)

* 设置绘图参数,'margin' 参数表示设置绘图模式为绘制边缘。
dev_set_draw ('margin')
dev_display (Image)
dev_display (RegionDilation)

* area_center 用于计算给定区域的面积以及重心的位置
area_center (RegionDilation, Area, Row, Column)
* gen_cross_contour_xld 生成一个由两条相互垂直的线段组成的轮廓,形成一个十字形状。
gen_cross_contour_xld (Cross, Row, Column, 15, 0.785398)
* count_obj 计数器:出现一次++  RegionDilation出现一次++,加的值在Number
count_obj (RegionDilation, Number)

* 设置画笔颜色
dev_set_color('green')
* set_display_font 设置显示字体
* 参数一:句柄
* 参数二:字体大小
* 参数三:'mono' 表示选择单色字体
* 参数四:表示字体是否加粗
* 参数五:表示是否设置字体倾斜
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')

* 设置画笔放的位置
set_tposition (WindowHandle,10,240)
* 设置画笔的内容
write_string (WindowHandle, '数量:'+Number)

参考文章:select_shape

在这里插入图片描述

5、开运算、闭运算

* read_image (Image, 'C:/Users/Public/Documents/MVTec/HALCON-17.12-Progress/examples/images/claudia.png')
* 转灰度
* rgb1_to_gray (Image, GrayImage)
* 设置阈值
* threshold (GrayImage, Regions, 32, 113)
* 分割区域:将所关联的像素区域连成一组
* ConnectedRegions会按照面积和中心划分成多个区域
* connection (Regions, ConnectedRegions)
* 选择的区域
* select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20377.7, 83996)
* 特征直方图:纵坐标是数量,横坐标是对应的参数取值范围
* select_shape (ConnectedRegions, SelectedRegions1, 'row', 'and', 250, 296)
* 获取区域面积的区域和中心,如果有多个区域结果将存储在一组数中,数组的顺序与输入区域的顺序对应
* area_center (SelectedRegions1, Area, Row, Column)

* 形态学操作 膨胀
* dilation_circle (SelectedRegions1, RegionDilation, 3.5)
* dilation_rectangle1

* 形态学操作 腐蚀
* erosion_circle (RegionDilation, RegionErosion, 3.5)


********** 开运算(先腐蚀后膨胀)
* read_image (Image, 'C:/Users/Public/Documents/MVTec/HALCON-17.12-Progress/examples/images/pellets.png')
* 全局阈值分割
* threshold (Image, Regions, 106, 255)
* connection (Regions, ConnectedRegions1)
* select_shape(ConnectedRegions1,SelecteRegions,'area','and',500,9999)

* 腐蚀
* erosion_circle (SelecteRegions, fushi, 7.5)
* connection 分割区域:将所关联的像素区域连成一组
* connection (fushi, ConnectedRegions)

* 膨胀
* dilation_circle (ConnectedRegions, pengzhang, 7.5)
* dev_display (Image)
* dev_display (pengzhang)


********** 闭运算(先膨胀后腐蚀)
* 结构元素半径:边长越大,膨胀或腐蚀越明显
* 增加像素:使用膨胀或闭运算
* 减少像素:使用腐蚀或开运算
read_image (Image, 'pellets')
threshold (Image, Region, 128, 255)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 150, 99999)
dilation_circle (SelectedRegions, pengzhang, 3.5)
connection (pengzhang, ConnectedRegions1)
erosion_circle (ConnectedRegions1, fushi, 3.5)
dev_display (Image)
dev_display(fushi)

在这里插入图片描述

6、局部阈值分割

read_image (Image, 'clip')
* 全自动阈值分割,主要原理是两个波峰图像的自动阈值分割
* max_separability(最大限度的可分型) 和 smooth_histo(直方图平滑)属于分割方法
binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold)
* 均值滤波处理
mean_image (Image, ImageMean, 7, 7)
* 局部阈值分割,背景差异不明显的时候使用。
* dyn_threshold (Image, ImageMean, RegionDynThresh, 5, 'light')

* 均值和标准偏差局部阈值分割,主要是用来区分目标和背景
var_threshold (ImageMean, Region1, 15, 15, 0.2, 2, 'dark')

* 根据直方图确定阈值自动全阈值分割
* 2代表sigma,数值越大代表提取区域越小
auto_threshold (ImageMean, Regions, 2)

* 快速全局阈值分割类似于threshold,速度更快
fast_threshold (ImageMean, Region2, 128, 255, 20)

* 分水岭图像分割,可以分割出分水岭和盆地
watersheds_threshold (ImageMean, Basins, 10)

参考文章:dyn_threshold

在这里插入图片描述

7、形态学调整

* 关闭窗口更新
dev_update_window ('off')
* 清空显示窗口内容
dev_clear_window ()

* 打开新窗口
* 参数一、二:左上角位置坐标
* 参数三、四:窗口的宽度和高度
* 参数五:'black' 表示窗口的背景颜色为黑色
* 参数六:用于存储新打开窗口的标识符或句柄
dev_open_window (0, 0, 730, 520, 'black', WindowID)
read_image (Bond, 'die/die_03.png')
dev_display (Bond)
* 设置显示字体
set_display_font (WindowID, 16, 'mono', 'true', 'false')
* 在窗口中显示消息
disp_continue_message (WindowID, 'black', 'true')
* 停止程序执行
stop ()

* 用于进行图像阈值分割
* 参数一:要进行阈值分割的输入图像
* 参数二:用于存储分割出的区域的变量
* 参数三:低阈值
* 参数四:高阈值
threshold (Bond, Bright, 100, 255)
* 将二值化区域转化成一个带方向的矩形。主要的用途是定位,将来也可以做orc识别
shape_trans (Bright, Die, 'rectangle2')
* 设置字体颜色
dev_set_color ('green')
* 设置绘制线条的宽度
dev_set_line_width(3)
* 设置显示设备的绘制模式
dev_set_draw('margin')
dev_display (Die)
* 确定了处理的区域,和定位,有效的减少了不相关区域的干扰
disp_continue_message (WindowID, 'black', 'true')
stop ()
* 裁剪图像
reduce_domain (Bond, Die, DieGray)
* 对输入图像进行阈值处理
threshold (DieGray, Wries, 0, 50)
* 填充具有给定形状特征的区域中的空,限定条件是面积在1~100的孔进行填充。
fill_up_shape (Wries, WiresFilled, 'area', 1, 100)
dev_display (Bond)
dev_set_draw ('fill')
dev_set_color ('red')
dev_display (WiresFilled)

disp_continue_message (WindowID, 'black', 'true')
stop ()

* 对圆区域进行开运算---减少像素
opening_circle (WiresFilled, Balls, 15)
dev_set_color ('green')
dev_display (Balls)
disp_continue_message (WindowID, 'black', 'true')
stop ()


* 把整个区域断开
* connection (Balls, ConnectedRegions)
* select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 0, 2000)
* count_obj(SelectedRegions, Number)
* area_center(SelectedRegions, Area, Row, Column)
* for i:=1 to |Number| by 1
*     a:=sqrt(Area/3.14)
*     b:=Row[i]+20
*     c:=Column[i]-10
*     dev_set_color ('red')
*     set_tposition (WindowID, b, c)
*     write_string (WindowID, '半径:'+a)
* endfor


* 把整个区域断开
connection (Balls, ConnectedRegions)
* 选择圆的相似度在0.8~1之间
select_shape (ConnectedRegions, SelectedRegions, 'circularity', 'and', 0.9, 1)
* 如果不进行 connection 断开,则是整个区域,没办法使用
* connection (SelectedRegions, ConnectedRegions1)
* 目的是为了显示圆的直径
sort_region (SelectedRegions, SortedRegions, 'first_point', 'true', 'column')
dev_display (Bond)
dev_display (SortedRegions)

* 取出来最小的圆
smallest_circle (SortedRegions, Row, Column, Radius)
* 准备元组取出来Radius
NumBalls:=|Radius|
* 直径
Diameter:=2*Radius
* 最小值
minDiameter := min(Diameter)
* 最大值
maxDiameter := max(Diameter)
* 平均值
meanDiameter := mean(Diameter)

dev_display (Bond)
disp_circle (WindowID, Row, Column, Radius)
dev_set_color ('white')
for i:=1 to NumBalls by 1
    * 1.输入窗口句柄 2.输入要打印的信息 3.参考的位置 4&&5.打印的位置 6.颜色 7.边框
    disp_message (WindowID, '直径:'+Diameter, 'window', Row, Column, 'black', 'true')
endfor
dev_set_color ('green')
dev_update_window ('on')
disp_continue_message (WindowID, 'black', 'true')
stop ()

在这里插入图片描述

8、blob斑点检测案例

read_image (Image, 'progres')
get_image_size(Image,Width,Height)
dev_open_window(0,0,Width,Height,'black',WindowHandle)
* dev_display 用于显示图像
dev_display(Image)
dev_set_color ('green')
dev_set_draw ('margin')

* 创建Roi
gen_rectangle2 (ROI_0, 308, 212, rad(4.15129), 124, 36)
* 裁剪
reduce_domain (Image, ROI_0, ImageReduced)

threshold (ImageReduced, Region, 0, 160)

* 连同预处理(1>>1.1)
connection (Region, ConnectedRegions)
* 根据面积筛选
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20, 30)

* Ra:主半径  Rb:次半径  Phi:圆的方向    获取区域的等效椭圆参数
elliptic_axis (SelectedRegions, Ra, Rb, Phi)

* 获取区域面积与中心点
area_center (SelectedRegions, Area, Row, Column)

dev_display (Image)
dev_set_color ('red')
dev_display (SelectedRegions)

在这里插入图片描述

标签:set,Image,dev,halcon,参数,image,图形,绘制,display
From: https://blog.csdn.net/qq_51810680/article/details/136628647

相关文章

  • Chart.js绘制动态折线图
    案例1<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>动态折线图</ti......
  • 软件测试|使用Python绘制雷达图
    前言之前用matplotlib绘制了雷达图,可能代码量会相对多一些,今天我想起了我们之前介绍过的pyecharts,这个绘图神器,也是支持绘制雷达图的,今天我们来看看实现起来会不会更简单。我们还是以买车的朋友选择来作为我们的数据进行绘制。 绘制基础雷达图pyecharts支持绘制的图形中就包......
  • C# EPPlus导出dataset----Excel2绘制图像
    一、生成折线图方法 ///<summary>    ///生成折线图    ///</summary>    ///<paramname="worksheet">sheet页数据</param>    ///<paramname="colcount">总列数</param>    ///<paramname="......
  • R语言可视化包ggplot2绘制分组回归线实战(Regression Line by Group)
    R语言可视化包ggplot2绘制分组回归线实战(RegressionLinebyGroup)目录R语言可视化包ggplot2绘制分组回归线实战(RegressionLinebyGroup)......
  • Android View 绘制原理
    在Android中,视图绘制原理是指系统如何创建、管理和更新用户界面上显示的各种视图(Views)的过程。以下是Android视图绘制的基本原理概述:1.**视图层次结构**:  -AndroidUI是由一系列嵌套的视图构成的层次结构,顶层通常是`DecorView`,它包裹着`ContentView`(即Activity的根视图......
  • R:共现网络图例绘制
    #清除所有变量rm(list=ls())#设置工作目录setwd("C:\\Users\\Administrator\\Desktop\\新建文件夹\\Co-occurrenceNetwork\\图例")#载入ggplot2包library(ggplot2)#创建一个数据框,包含您想要在图例中展示的颜色和类别#确保Category是按照正确的顺序设置为因子类......
  • 如何在Qt的 paintEvent之外进行绘制
    QPainter默认只能在paintEvent中进行绘制这在有些情况下会很不方便,有时候我们希望可以在任意地方直接进行绘制 为了实现这个目的,可以采用以下方法:继承QWidget,通过子类提供直接绘制的方法,并将所有绘制保存到中间的QPixmap最后在重载的paintEvent中将QPixmap复制显示:#prag......
  • PS 图形导出路径为svg
    第一步、将图形转存为智能对象2、必须打开通过文件-》导出-》导出为3、 4、导出成功 ......
  • 转载:用示波器对单片机I2C时序进行图形波形分析的试验小结
    对于嵌入式开发的朋友来说,I2C协议实在是再熟悉不过了,有太多的器件,采用的都是通过I2C来进行相应的设置。今天,我们就随便聊聊这个I2C协议。I2C协议中最重要的一点是I2C地址。这个地址有7位和10位两种形式。7位能够表示127个地址,而在实际使用中基本上不会挂载如此多的设置,所以很多......
  • R语言中ggplot绘图绘制L型图形,并设置框线的粗细
     001、基础绘图library(ggplot2)##加载包ggplot(data=mtcars,aes(x=wt,y=mpg,colour=factor(cyl)))+geom_point()##绘制散点图 002、增加四边框线library(ggplot2)#导入ggplot包ggplot(d......