*图像采集助手:
•打开采集设备:open_framegrabber()
•设置相机的采集参数:set_framegrabber_param()
•采集设备初始化:grab_image_start()
•采集图像采用异步:grab_image_async()
•关闭采集设备:close_framegrabber()
•设置相机的采集参数:set_framegrabber_param()
•正则表达式筛选元组中的数据:tuple_regexp_select()
cs
*// Halcon图像采集助手(两种采集方式:外部相机+本地文件)
*// 第一种:链接外部相机接口(GigEVision工业相机)
*// open_framegrabber打开采集设备
open_framegrabber ('GigEVision2', 0, 0, 0, 0, 0, 0, 'progressive', -1, 'default', -1, 'false', 'default', '34bd202ff9d2_Hikrobot_MVCS06010GC', 0, -1, AcqHandle)
*// 设置相机采集参数 TriggerMode-触发模式
*// 'Off' → 关闭硬件触发,采用连续采集模式
set_framegrabber_param (AcqHandle, 'TriggerMode', 'Off')
*// TrigerSource--触发源
*// 'Software'--软触发:手动触发,通过视觉软件触发采集图像
set_framegrabber_param (AcqHandle,'TrigerSource','Software')
*// 其他图像采集参数:Width--图像宽度 Height--图像高度 PixelFormat--图像格式(Monog-8位灰度图)
*// TriggerActivation相机触发机制(高电平、低电平、上升沿、下降沿、ExposureMode--曝光模式(Timed)ExposureTime--曝光时间ExposureAuto(off-关闭自动曝光,on--自动曝光)--是否自动曝光grab_timeout(-1 没有超时)--采集超时时间 单位为毫秒
*// 采集图像设备初始化-1:没有延迟时间
grab_image_start (AcqHandle, -1)
*// 连续采集--打开实时画面
while (true)
*// 采集图像采用异步--async,sync--同步
grab_image_async (Image, AcqHandle, -1)
endwhile
*// 关闭采集设备
close_framegrabber (AcqHandle)
********************************************
*// 第二种:加载本地的离线文件:读取单个文件,可以读取文件夹中存储的多个文件
*// ImageFiles元组内存入的是文件的绝对路径
list_files ('C:/Users/ZN/AppData/Roaming/MVTec/HALCON-23.05-Progress/examples/images/board', ['files','follow_links','recursive'], ImageFiles)
*// 通过正则筛选想要文件条件:筛选只要想要图形文件,忽略大小写 把复合条件的文件存入到到ImageFiles元祖中
*// ima|hobj:独有的文件类型
*// ignore_case:忽略大小写
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
*// 通过for循环,借助索引读取元组中存储的每一个图像文件
for Index := 0 to |ImageFiles| - 1 by 1
*// 加载图像
read_image (Image, ImageFiles[Index])
endfor
*ROI操作和画图:
•合并两个区域:union2()
•设置填充模式:dev_set_draw ()
•设置边框的线宽:dev_set_line_width ()
•设置边框的颜色dev_set_color ()
•设置颜色的个数dev_set_colored ()
•绘制一个圆draw_circle ()
•展示绘制的图形gen_circle ()
•绘制矩形:draw_rectangle1 ()
•展示矩形:gen_rectangle1 ()
•绘制仿射矩形:draw_rectangle2()
•展示仿射矩形:gen_rectangle2()
•绘制椭圆:draw_ellipse ()
•展示椭圆:gen_ellipse()
•绘制多边形:draw_region()
•展示多边形:gen_region()
cs
*// 自动代码插入绘制
*// ROI_0 绘制的区域
*// 61.1151, 140.106 绘制的坐标
*// 38.2473 绘制的半径
gen_circle (ROI_0, 61.1151, 140.106, 38.2473)//绘制一个圆
gen_rectangle1 (TMP_Region, 76.6283, 103.258, 144.499, 184.712)//绘制一个矩形
*// union2 合并两个区域
union2 (ROI_0, TMP_Region, ROI_01)//参数3 ROI_01是上面圆和矩形合并的图形
*// 清空
dev_clear_window ()
*// 运行时绘制区域
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*// 获取图片
read_image (Image, 'clip')
*// 设置绘制的区域的填充模式
*// margin:非填充模式 ; fill:填充模式
dev_set_draw ('margin')
*// 设置边框的大小
dev_set_line_width (4)
*// 设置边框的颜色
dev_set_color ('green')
*// 设置颜色的个数
dev_set_colored (3)
*// 手动绘制一个圆
*// Row, Column 输出参数绘制圆的坐标
*// Radius 输出参数半径
draw_circle (WindowHandle, Row, Column, Radius)
*// 展示手动绘制的图形
gen_circle (Circle, Row, Column, Radius)
*// 绘制一个矩形
dev_set_color ('red')
*// 交互式绘制轴平行矩形,返回矩形两个对角点坐标
*// 参数1 WindowHandle 绘制矩形的目标窗口句柄
*// 参数2 Row1 矩形第一个角点的行坐标(输出)
*// 参数3 Column1 矩形第一个角点的列坐标(输出)
*// 参数4 Row2 矩形第二个角点的行坐标(输出)
*// 参数5 Column2 矩形第二个角点的列坐标(输出)
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
*// 根据坐标生成轴平行矩形区域,用于展示/处理矩形
*// 参数1 Rectangle 生成的矩形区域对象(输出)
*// 参数2 Row1 矩形第一个角点的行坐标(输入)
*// 参数3 Column1 矩形第一个角点的列坐标(输入)
*// 参数4 Row2 矩形第二个角点的行坐标(输入)
*// 参数5 Column2 矩形第二个角点的列坐标(输入)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
*// 手动绘制一个椭圆
*// 参数1 WindowHandle:输入参数,绘图窗口句柄
*// 参数2 Row1:输出参数,椭圆中心行坐标
*// 参数3 Column1:输出参数,椭圆中心列坐标
*// 参数4 Phi:输出参数,椭圆旋转角度(弧度制,0=水平,π/2=垂直)
*// 参数5 Radius1:输出参数,椭圆半长轴长度(像素数)
*// 参数6 Radius2:输出参数,椭圆半短轴长度(像素数)
draw_ellipse (WindowHandle, Row1, Column1, Phi, Radius1, Radius2)
*// 展示手动绘制的椭圆
gen_ellipse (Ellipse, Row1, Column1, Phi, Radius1, Radius2)
*// 绘制仿射矩形
*// 参数1 WindowHandle:输入参数,绘图窗口句柄
*// 参数2 Row3:输出参数,矩形中心行坐标
*// 参数3 Column3:输出参数,矩形中心列坐标
*// 参数4 Phi:输出参数,矩形旋转角度(弧度制,0=水平,π/2=垂直)
*// 参数5 Length1:输出参数,矩形半宽度(水平方向半长,像素数)
*// 参数6 Length2:输出参数,矩形半高度(垂直方向半长,像素数)
draw_rectangle2 (WindowHandle, Row3, Column3, Phi, Length1, Length2)
*// 展示仿射矩形
gen_rectangle2 (Rectangle1, Row3, Column3, Phi, Length1, Length2)
*// 绘制任意多边形
*// 参数1 Region:输出参数,绘制完成的任意形状区域对象(包含多边形/不规则形状)
*// 参数2 WindowHandle:输入参数,绘图窗口句柄
draw_region (Region, WindowHandle)
*// polygon--基于顶点坐标数组生成多边形区域
gen_region_polygon (Region1, Row3, Column3)
*ROI实现区域与轮廓之间的相互转换:
•根据区域生成对应的轮廓:gen_contour_region_xld()
•根据轮廓生成对应的区域:gen_region_contour_xld()
•获取区域的像素点的坐标:get_region_points()
•获取轮廓的像素点的坐标:get_contour_xld()
•计算区域的面积和中心坐标:area_center()
•计算区域的方向(弧度值):orientation_region()
•区域形状转换:shape_trans()
•区域的最小外接圆:smallest_circle()
•圆的最小轴平行矩形:smallest_rectangle1()
•轮廓的最小外接圆:smallest_circle_xld()
•轮廓的最小外接轴平行矩形:smallest_rectangle1_xld()
•对区域进行排序 :sort_region()
•选择区域对象:select_obj()
•亚像素边缘提取:edges_sub_pix()
•生成十字形的交叉线:gen_cross_contour_xld()
•角度转换弧度:tuple_rad()
•弧度转换角度:tuple_deg()
•复制对象:copy_obj()
•合并对象到数组:concat_obj()
•计算椭圆的长半轴、短半轴和方向(弧度值):elliptic_axis()
cs
*// 获取窗体句柄
dev_get_window (WindowHandle)
*// 绘制一个圆
draw_circle (WindowHandle, Row, Column, Radius)
*// 显示圆
gen_circle (Circle, Row, Column, Radius)
*// 根据区域生成对应的轮廓
* 参数1 Circle 输入的圆形区域
* 参数2 Contours 输出的轮廓对象
* 参数3 'border' 提取区域的外边界
gen_contour_region_xld (Circle, Contours, 'border')
*// 清空窗体
dev_clear_window ()
*// 展示生成对应的轮廓
dev_display (Contours)
*// 根据轮廓生成对应的区域//---------------------
* 参数1 Contours 输入的轮廓对象
* 参数2 Region 输出的填充区域
* 参数3 'filled' 填充模式生成区域
gen_region_contour_xld (Contours, Region, 'filled')
*// 清空窗体
dev_clear_window ()
*// 展示生成对应的区域
dev_display (Region)
*// ROI其他常用算子//---------------------
*// 1.获取区域的像素点的坐标(y,x) //---------------------
* 参数1 Region 输入参数,待提取像素点的目标区域
* 参数2 Rows 输出参数,所有像素点的行坐标数组
* 参数3 Columns 输出参数,所有像素点的列坐标数组
get_region_points (Region, Rows, Columns)
*// 2.获取轮廓的像素点的坐标(y,x) //---------------------
* 参数1 Contours 输入参数,待提取坐标的亚像素级XLD轮廓对象
* 参数2 Row1 输出参数,所有轮廓点的行坐标数组
* 参数3 Col 输出参数,所有轮廓点的列坐标数组
get_contour_xld (Contours, Row1, Col)
*// 3.计算区域的面积大小及其中心坐标(单个/多个)//---------------------
* 参数1 Region 输入区域
* 参数2 Area 区域面积
* 参数3 AreaRow 区域中心行坐标
* 参数4 AreaCol 区域中心列坐标
area_center (Region, Area, Row2, Column1)
*// 加载一个图像
read_image (Image, 'printer_chip/printer_chip_01')
*// 阈值分割
threshold (Image, Region1, 128, 255)
*// 连通性处理
connection (Region1, ConnectedRegions)
*// 计算多个区域的面积及其中心坐标//---------------------
* 参数1 ConnectedRegions 输入区域集合
* 参数2 Area1 各区域面积数组
* 参数3 Row3 各区域中心行坐标数组
* 参数4 Column2 各区域中心列坐标数组
area_center (ConnectedRegions, Area1, Row3, Column2)
*// 4.计算区域的方向(弧度值)//---------------------
* 参数1 ConnectedRegions 输入区域集合
* 参数2 Phi 各区域方向(弧度,0~2π)
orientation_region (ConnectedRegions, Phi)
*// 5.区域形状转换, 把区域形状凸起/椭圆/内接圆/外接圆 //---------------------
* 参数1 ConnectedRegions 输入区域集合
* 参数2 RegionTrans 输出的椭圆形状区域
* 参数3 'ellipse' 转换为椭圆形状
shape_trans (ConnectedRegions, RegionTrans, 'ellipse')
*// 6.计算区域的最小外接圆 //---------------------
* 参数1 ConnectedRegions 输入区域集合
* 参数2 MinCircleRow 最小外接圆中心行坐标数组
* 参数3 MinCircleCol 最小外接圆中心列坐标数组
* 参数4 MinCircleRadius 最小外接圆半径数组
smallest_circle (ConnectedRegions, MinCircleRow, MinCircleCol, MinCircleRadius)
*// 清空窗体
dev_clear_window ()
*// 显示最小外接圆区域
gen_circle (Circle1, MinCircleRow, MinCircleCol, MinCircleRadius)
*//计算圆的最小轴平行矩形 //---------------------
* 参数1 Circle1 输入圆形区域
* 参数2 Rect1Row1 矩形左上角行坐标
* 参数3 Rect1Col1 矩形左上角列坐标
* 参数4 Rect1Row2 矩形右下角行坐标
* 参数5 Rect1Col2 矩形右下角列坐标
smallest_rectangle1 (Circle1, Rect1Row1, Rect1Col1, Rect1Row2, Rect1Col2)
*// 清空窗体
dev_clear_window ()
*// 显示平行矩形 不带角度//---------------------
gen_rectangle1 (Rectangle, Rect1Row1, Rect1Col1, Rect1Row2, Rect1Col2)
*// 根据区域生成对应的轮廓//---------------------
* 参数1 Rectangle 输入参数,待提取轮廓的像素级区域对象
* 参数2 Contours1 输出参数,提取得到的亚像素级XLD轮廓对象
* 参数3 Mode 输入参数,轮廓提取模式(常用'border'表示提取区域外边界,'filled'表示提取区域所有像素的轮廓)
gen_contour_region_xld (Rectangle, Contours1, 'border')
*// 7.计算轮廓的最小外接圆和轴平行矩形 //---------------------
* 参数1 Contours1 输入轮廓
* 参数2 ContMinCircleRow 轮廓最小外接圆中心行坐标
* 参数3 ContMinCircleCol 轮廓最小外接圆中心列坐标
* 参数4 ContMinCircleRadius 轮廓最小外接圆半径
smallest_circle_xld (Contours1, ContMinCircleRow, ContMinCircleCol, ContMinCircleRadius)
* 参数1 Contours1 输入轮廓
* 参数2 ContRect1Row1 矩形左上角行坐标
* 参数3 ContRect1Col1 矩形左上角列坐标
* 参数4 ContRect1Row2 矩形右下角行坐标
* 参数5 ContRect1Col2 矩形右下角列坐标
smallest_rectangle1_xld (Contours1, ContRect1Row1, ContRect1Col1, ContRect1Row2, ContRect1Col2)
*// 清空窗体
dev_clear_window ()
*// 生成轮廓的最小外接圆
gen_circle (Circle2, ContMinCircleRow, ContMinCircleCol, ContMinCircleRadius)
*// 清空窗体
dev_clear_window ()
*// 生成轮廓的最小外接矩形
gen_rectangle1 (Rectangle1, ContRect1Row1, ContRect1Col1, ContRect1Row2, ContRect1Col2)
*// 8.对区域进行排序 (按首点行序升序) //---------------------
* 参数1 Rectangle1 待排序区域
* 参数2 SortedRegions 排序后区域
* 参数3 'first_point' 排序参考点(首点)
* 参数4 'true' 升序
* 参数5 'row' 按行坐标排序
sort_region (Rectangle1, SortedRegions, 'first_point', 'true', 'row')
*// 9.选择区域对象(索引从1开始) //---------------------
* 参数1 SortedRegions 区域集合
* 参数2 ObjectSelected 选中的单个区域
* 参数3 1 选中第1个区域
select_obj (SortedRegions, ObjectSelected, 1)
*// 清空窗体
dev_clear_window ()
*// 显示选中的区域
dev_display (ObjectSelected)
*// 清空窗体
dev_clear_window ()
*// 10.亚像素边缘提取 //---------------------
* 参数1 Image 输入图像
* 参数2 Edges 输出亚像素边缘轮廓
* 参数3 'canny' 边缘检测算法
* 参数4 1 高斯平滑sigma值
* 参数5 20 低阈值
* 参数6 40 高阈值
edges_sub_pix (Image, Edges, 'canny', 1, 20, 40)
*// 11.生成十字形的交叉线,用于标记图像中的指定坐标点
* 参数1 Edges 输出参数,生成的十字形XLD轮廓对象
* 参数2 Rows 输入参数,十字形中心的行坐标
* 参数3 Columns 输入参数,十字形中心的列坐标
* 参数4 Size 输入参数,十字形单臂的长度(像素单位,如6表示每个臂从中心向外延伸6像素)
* 参数5 Angle 输入参数,十字形的旋转角度(弧度单位,0.785398=π/4=45度,0为水平/垂直方向)
gen_cross_contour_xld (Edges, Row, Column, 6, 0.785398)
*// 清空窗体
dev_clear_window ()
*// 显示边缘
dev_display (Edges)
*// 12.获取图像尺寸
* 参数1 Image 输入图像
* 参数2 Width 图像宽度
* 参数3 Height 图像高度
get_image_size (Image, Width, Height)
*// 13.弧度与角度转换 //---------------------
*// 弧度转换成角度
* 参数1 Phi 输入弧度值
* 参数2 Deg 输出角度值
tuple_deg (Phi, Deg)
*// 角度转换成弧度
* 参数1 Deg 输入角度值
* 参数2 Rad 输出弧度值
tuple_rad (Deg, Rad)
*// 14.复制对象 //---------------------
* 参数1 Edges 源对象
* 参数2 ObjectsSelected 复制后的对象
* 参数3 1 起始索引
* 参数4 1 复制数量
copy_obj (Edges, ObjectsSelected, 1, 1)
*// 15.合并对象到数组 //---------------------
* 参数1 ObjectsSelected 第一个待合并对象
* 参数2 ObjectsSelected 第二个待合并对象
* 参数3 ObjectsConcat 合并后的对象数组
concat_obj (ObjectsSelected, ObjectsSelected, ObjectsConcat)
*// 16.计算椭圆的长半轴、短半轴和方向(弧度值)//---------------------
* 参数1 SortedRegions 输入的区域/椭圆区域集合
* 参数2 Ra 输出的椭圆长半轴长度数组
* 参数3 Rb 输出的椭圆短半轴长度数组
* 参数4 Phi1 输出的椭圆方向(弧度值,0~2π)
elliptic_axis (SortedRegions, Ra, Rb, Phi1)
*交集、差集、取反:
•两个区域的交集:intersection()
•两个区域的差集(属于第一个区域不属于第二个区域的部分):difference()
•取反:complement()
cs
*// 获取图片
read_image (Image, 'printer_chip/printer_chip_01')
*// 绘制圆
gen_circle (ROI_0, 221.515, 216.543, 51.9552)
gen_circle (ROI_01, 203.716, 290.004, 57.0317)
*// 两个区域的交集intersection
intersection (ROI_0, ROI_01, RegionIntersection)
*// 绘制矩形
gen_rectangle1 (ROI_02, 339.433, 136.404, 419.528, 223.222)
gen_rectangle1 (ROI_03, 330.533, 183.152, 448.451, 321.17)
*// 两个区域的差集difference(属于第一个区域不属于第二个区域的部分)
difference (ROI_02, ROI_03, RegionDifference)
*// 绘制矩形
gen_rectangle1 (ROI_04, 139.194, 321.17, 310.509, 396.857)
*// 取反complement
complement (ROI_04, RegionComplement)
*// 合并区域union2
gen_rectangle1 (ROI_05, 139.194, 321.17, 310.509, 396.857)
gen_circle (TMP_Region, 575.657, 455.152, 102.695)
union2 (ROI_05, TMP_Region, ROI_06)
希望对大家有所帮助, 感谢大家的关注和点赞。