读图
write_image
read_image

*图片路径 FilePath:='d:/pic/demo.jpg' *判断文件是否存在 file_exists ('/bin/cc', FileExists) if(FileExists) *读取图片 read_image(Image,FilePath) *写入图片,第三个参数是填充值 write_image(Image,'jpg',0,'F:/demo.jpg') endif

list_file('路径',['files','directories','recursive','max_depth 3',follow_links],ImageFiles)//选取文件夹里的图片 tuple_regexp_select(ImageFiles,['\.(jpg)$','ignore_case'],ImageFiles)//在上面的那些图片中找到需要的图片 for Index := 0 to |ImageFiles| - 1 by 1 read_image(Image,ImageFiles[Index]) //循环显示出来 *do sth…… endfor 参数解释: 这些参数都写在一个中括号当中,如果需要就写,如果不需要就不要写在里面了。 files——指定搜索的格式为文件 directories——指定搜索的格式为文件夹 recursive——指定可以遍历子文件夹里面的文件 max_depth 3——指定遍历的深度 max_files 1000——指定遍历的最大文件数量 \——转义符 ()——规则的集合。比如我们要选择bmp jpg tif格式的图片(bmp|jpg|tif) ignore_case——忽略大小写

助手→打开新的image acquisition,在新弹出的窗口中选择“图像获取接口”→ “检测”→“实时”(是一个图标)→插入代码 * Code generated by Image Acquisition 05 open_framegrabber ('DirectShow', 1, 1, 0, 0, 0, 0, 'default', 8, 'rgb', -1, 'false', 'default', 'Sirius USB2.0 Camera', 0, -1, AcqHandle) grab_image_start (AcqHandle, -1) while (true) grab_image_async (Image, AcqHandle, -1)//抓取图像,抓取到的图像会在Image中 * Do something//对图像进行处理 endwhile close_framegrabber (AcqHandle)

in.seq文件(用notepad打开之后会发现是图片的路径) 步骤同上,只是不点检测,直接生成代码。 * Code generated by Image Acquisition 06 open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'fabrik', 'default', 1, -1, AcqHandle) grab_image_start (AcqHandle, -1) while (true) grab_image_async (Image, AcqHandle, -1) * Do something endwhile close_framegrabber (AcqHandle) 代码生成之后,再fabrik改成in.seq文件的路径 xxx/in.seq
ROI读写
write_region后缀".reg" ".tif" ."tiff"
read_region后缀".reg" ".tif" ".tiff"

erosion_*腐蚀ROI dilation_*膨胀ROI shape_trans形状转换 move_region移动区域到新位置 vector_angle_to_rigid+affine_trans_region区域仿射变换 intersection 交集 difference 差集(差集一定要第一个输入图片比第二个输入图片要大) union1 并集 union2 并集 complement补集
数组读写
write_tupe后缀".tup"
read_tuple后缀".tup"
模板读写
write_shape_model后缀".shm"
read_shape_model后缀".shm"

//读取region read_region(Region, FilePath) //创建模板 create_shape_model(Image, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID) //保存模板 ModelID是模板的句柄,FileExists是模板文件保存的路径。以shm结尾 write_shape_model(ModelID, 'd:/aa.shm') //模板路径 ModelFilePath:='d:/a.shm' //判断模板文件是否存在 file_exists (ModelFilePath, FileExists1) //如果存在 if(FileExists1) //读取模板 read_shape_model(FileExists, ModelID1) //获取模板的轮廓。 参数1是轮廓,参数2是模板的句柄,参数3是金字塔等级 get_shape_model_contours(ModelContours, ModelID1, 1) endif

几何定位: 几何定位又叫几何匹配,基于物体的形状、边缘、轮廓等几何信息进行定位,其特点如下; 1、支持非线性光照变化,对物体灰度信息的非线性变化有很好的适应性。 2、支持尺度变化,即x,y方向的缩放 3、支持旋转 4、支持物体遮挡 几何定位编程流程: 1、设置ROI区域。 2、定义需要训练的参数。 3、创建模板并训练。 4、根据创建好的模板句柄去图片中找到相似的结果。 5、将找到的结果显示出来。 6、销毁模板。

read_image (Image, 'C:/Users/vichin.wc.wei/Desktop/捕获.PNG') dev_set_draw('margin') *画ROI区域 draw_rectangle2(3600,Row,Column,Phi,Length1,Length2) gen_rectangle2(Rectangle, Row, Column, Phi, Length1, Length2) *裁剪图像 reduce_domain(Image, Rectangle, ImageReduced) *创建模板 create_shape_model(ImageReduced, 'auto', rad(-90),rad(180), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID) *获取模板的轮廓 get_shape_model_contours(ModelContours, ModelID, 1) *根据所训练的模板,查找最匹配的目标 find_shape_model(ImageReduced, ModelID, rad(-90), rad(180), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row1, Column1, Angle, Score) *判断一下,找到的个数是否大于0 if(|Row|>0) *显示模板 dev_display_shape_matching_results(ModelID, 'red', Row1, Column1, Angle, 1, 1, 0) endif clear_shape_model(ModelID)
匹配助手的使用:
如果勾选了 预生成形状模板 ,那么在生成模板的时所花费的时长会变大,如果对时间有要求,那么最好不要勾选。
最大行缩放也不要选的太大,也会增加创建模板的时长。
halcon算子
几何定位:

几何定位分为基于模板图像的定位和基于xld的几何定位。在使用xld进行定位的时候,通常metric都设置为ignore_local_polarity。 常见的几何定位函数: 不支持缩放:create_shape_model create_shape_model_xld find_shape_model find_shape_models 常用的模板参数:经常要设置的参数为AngleStart,AngleExtent,Metric,Score,ScaleMin,ScalaMax Template 模板图像 NumLevels 图像金字塔 AngleStart 起始角度 AngleExtent 角度步长 Optimization优化算法 Metric 极性 Contrast 对比度 MinContrast 最小对比度 Score 匹配分数 MaxOverlap 最大重叠比 SubPixel 亚像素精度 Greediness 贪婪度 ScaleMin 缩放系数(缩放下限) ScalaMax 缩放系数(缩放上限) 金字塔等级默认分为4个等级(也可以提升成5,6甚至7等级,但是等级越高,图片越是模糊,怕是难以用于匹配),从level1为图片的原始尺寸,level2是由level1每相邻的4个像素点合并成一个像素点之后形成的图片,level3又由level2的每相邻的4个像素点合并成一个像素点生成的图片,level4同理。当进行图片比较的时候,先用level4的图片进行图像的模糊比较,当比较结果较为接近的时候,就会使用level3的图片进行比较,直至使用level1进行比较。 Contrast(对比度参数):当图片上的某一点的值大于你设定的这一个值,那么就会将该点显示出来。当对比度设定的较低的时候,找到的边缘信息较多,当对比度较高的时候,找到的边缘信息较少。对比度参数可以是一个数组,[10,50],在提取边缘信息的时候,会在这个范围内取选取点。 AngleStart和AngleExtent:halcon输入的参数为弧度,将定角度范围是-90° ~ +90°,那么可以设置为rad(-90),rad(180),第一个表示起始角度,第二个表示角度范围。角度上限值-角度下限值就是角度的范围。 AngleStep:角度步长(单位:弧度):模板越大,角度步长越小;要求越精确,步长越小;步长越小,占用内存越多,定位速度越慢。如果没有特殊要求,可以使用“auto”,让系统作出最佳选择。 Optimization 优化算法:一些模板包含了太多像素点,这导致模板过大(模板的边缘和信息量过大),增加了执行时间,增加了内存需求。可以使用Optimization来优化这些点。none:不减少像素点,point_reduction_low大约减少一半的点,point_reductino_medium大约减少1/3.point_reduction_high大约减少1/4.减少像素点可能会导致无法创建高层金字塔以及有可能降低结果的精度和准确都。当边缘较多时才会取减少像素点,一般都会使用auto。 Metric(极性):use_polarity(使用极性模式)————目标物体和模板的极性要一致,模板的前景时黑色,那么目标的前景色也一定是要黑色,模板的背景色是白色,那么目标的背景色也一定要是白色。ignore_global_polarity(忽略全局极性)————如果此时模板的前景色是黑色,背景色是白色,那么不管目标的背景色是黑色还是白色,都能匹配。ignore_local_polarity(忽略局部极性)————能够包含前两种情况的匹配,还多出了,当目标的对比度发生变化的时候,也能匹配。 MinContrast最小对比度:通过设置最小对比度来减少在查找模板的时候,噪声,纹理等因素产生的有害边缘。一般使用auto。 MaxOverlap:取值范围是0~1,重叠区域占原本图片的比值。这里的重叠指的是物体最小外接矩形的重叠。 SubPixel:1、none表示不使用亚像素,最大误差为半个像素。2、interpolation插值法。3、least_squares 标准最小二乘法4、least_squares_high。 高精度最小二乘法。5、least_squares_very_high 最高精度最小二乘法。1和2在匹配图像时角度的误差精度最低时间较短,3,4,5在匹配时对角度的误差精度高,运行时间较长。 Greediness:范围时在0~1之间,时用来定位加速的,值越小,速度越慢,值越高,找丢目标的可能越大。建议取值0.7~0.9。 ScaleMin,ScaleMax:一般对称设置。若放大倍率为1,ScaleMin设置成0.8的话,那么ScaleMax设置成1.2。

find_shape_model:根据所训练的模板,查找最匹配的目标。其参数释义如下;
Image:使用模板进行匹配的图像。
ModelID:模板的句柄。
AngleStart:起始角度。(要小于或者等于create_xxx_model的值)
AngleExtent:角度的范围。(要小于或者等于create_xxx_model的值)
MinScore:最小匹配分数。(目标特征和模板特征的相似度)。
NumMatches:匹配目标的数量。
MaxOverlap:同上。
SubPixel:同上。
NumLevels:金字塔的结构(默认值是0,表示使用与crate_xxx_model时一样的结构。)
Greediness:同上。
Row:匹配到的特征点的Y坐标。
Column:匹配到的特征点的X坐标。
Angle:匹配到的目标与模板的角度的偏差。
Score:输出的最小匹配分数。