halcon绘制图形

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)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/539063.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

指针的函数传参的详细讲解(超详细)

如果对指针基础知识已经有可以直接跳到 函数的指针传参与解引用,哪里不明白可以评论,随时解答。 目录 所以就有了一句话:指针就是地址,地址就是指针 对于指针在C语言中,指针类型就是数据类型,是给编译器…

【Flask开发实战】项目介绍-防火墙规则查询系统

一、前言 硬件防火墙为常备主用网络安全设备,主要通过网络访问控制方式实现安全防护。 不同厂家防火墙的网络访问控制功能均采用同样的模式操作:防火墙配置若干条防火墙规则,当IP包到来,防火墙根据包的五元组属性(协…

大模型的实践应用18-大模型的开发框架LangChain的简单应用与Faiss向量数据库实现

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用18-大模型的开发框架LangChain的简单应用与Faiss向量数据库实现。LangChain是一个强大的开发框架,专门用于构建基于大型语言模型(LLM)的应用程序。它提供了丰富的工具和组件,帮助开发者更轻松地利用LLM的能力。下面…

汇编语言程序设计 第3章:汇编语言程序格式

文章目录 1. 伪指令1.1 段定义伪指令1.2 段寄存器说明伪指令1.3 过程定义伪指令1.4 源程序结束伪指令 2. 变量/标号定义伪指令2.1 变量定义2. 2 标号定义2.3 表达式 3.地址计数器与对准伪指令3.1 地址计数器$3.2 对准伪指令 4. DOS功能调用4.1 DOS功能调用的一般方法4.2 常用的…

汽车电子零部件(1):综述

汽车零部件有哪些? 这里有一份汽车零部件清单,它们是汽车制造的部件,包括油车和电车;并不详尽。这些零件中的许多(并非全部)也用于卡车和公共汽车等其他机动车辆。 <

Sublime查看ANSI编码文档乱码问题

原因为没有安装对应的解码插件。 选择安装插件包 选择插件包&#xff1a;ConvertToUTF8或者GBK&#xff0c;我试了第一个插件包不行&#xff0c;安装GBK插件包后OK。

Git提交代码进入coding

安装Git后建一个文件在文件里右键点击Git Bash使用命令配置用户名和邮箱git config --global user.name "你的用户名"和git config --global user.email "你的邮箱"命令git init来初始化&#xff0c;自动将当前仓库设置为master创建一个项目&#xff08;一…

SpringBoot之Bean扫描、Bean注册

目录 Bean扫描 Bean注册 Bean lmport 自定义注解 注册条件 Bean扫描 Bean扫描有两种方式 1、标签:<context:component-scan base-package"com.mybatis"/> 2、注解: ComponentScan(basePackages "com.mybatis") springboot启动类注解可以自…

NO9 蓝桥杯单片机之串口通信的使用

1 基本概念 简单来说&#xff0c;串口通信是一种按位&#xff08;bit&#xff09;传输数据的通信方式。 其他一些知识就直接贴图吧&#xff08;单工&#xff0c;半双工这些学过通信的同学应该都知道&#xff0c;可以上网查询一下具体概念。&#xff09; 来源还是&#xff1a;…

派对游戏2024年新局面:二超多强,市场细分

2023年末&#xff0c;《元梦之星》上线迎战《蛋仔派对》&#xff0c;网腾大战打响。 这场战役从开局就进入到了白热化&#xff0c;双方投入真金白银来拉拢玩家&#xff0c;于春节这一亲朋相聚最适合派对游戏的时段集中发力&#xff0c;互有胜负。 目前《元梦之星》略处下风&a…

打开链接跳转的模式

摘要&#xff1a; 今天遇到一个需求&#xff1a;后台小程序的域名下打开微信客服链接的&#xff01;但是小程序的域名拒绝任何第三方域名&#xff0c;跨域了&#xff01;为了上线这微信客服的功能&#xff0c;打开新页签&#xff0c;脱离小程序的域名实现微信客服链接的跳转启动…

python练习一

1. 五个PPT上的界面打印【print、input函数】 print("\t\t\t\t\t英雄联盟商城登录界面\n~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~\n\t\t\t\t\t1. 用户登录\n\t\t\t\t\t2. 新用户注册\n\t\t\t\t\t3. 退出系统\n" "~ * ~ * ~ * ~ * ~ * ~ * ~…