读图
write_image
read_image

*图片路径
FilePath:='d:/pic/demo.jpg'
*判断文件是否存在
file_exists ('/bin/cc', FileExists)
if(FileExists)
*读取图片
read_image(Image,FilePath)
*写入图片,第三个参数是填充值
write_image(Image,'jpg',,'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 := to |ImageFiles| - by
read_image(Image,ImageFiles[Index]) //循环显示出来
*do sth……
endfor 参数解释:
这些参数都写在一个中括号当中,如果需要就写,如果不需要就不要写在里面了。 files——指定搜索的格式为文件
directories——指定搜索的格式为文件夹
recursive——指定可以遍历子文件夹里面的文件
max_depth ——指定遍历的深度
max_files ——指定遍历的最大文件数量 \\——转义符
()——规则的集合。比如我们要选择bmp jpg tif格式的图片(bmp|jpg|tif)
ignore_case——忽略大小写

多张图片的读取

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

使用摄像头采集图像

    in.seq文件(用notepad打开之后会发现是图片的路径)
步骤同上,只是不点检测,直接生成代码。
* Code generated by Image Acquisition
open_framegrabber ('File', , , , , , , 'default', -, 'default', -, 'false', 'fabrik', 'default', , -, AcqHandle)
grab_image_start (AcqHandle, -)
while (true)
grab_image_async (Image, AcqHandle, -)
* 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补集

对ROI操作的函数

数组读写

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, )
endif

模板的读写操作

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

几何定位

read_image (Image, 'C:/Users/vichin.wc.wei/Desktop/捕获.PNG')

dev_set_draw('margin')

*画ROI区域
draw_rectangle2(,Row,Column,Phi,Length1,Length2)
gen_rectangle2(Rectangle, Row, Column, Phi, Length1, Length2)
*裁剪图像
reduce_domain(Image, Rectangle, ImageReduced)
*创建模板
create_shape_model(ImageReduced, 'auto', rad(-),rad(), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
*获取模板的轮廓
get_shape_model_contours(ModelContours, ModelID, )
*根据所训练的模板,查找最匹配的目标
find_shape_model(ImageReduced, ModelID, rad(-), rad(), 0.5, , 0.5, 'least_squares', , 0.9, Row1, Column1, Angle, Score)
*判断一下,找到的个数是否大于0
if(|Row|>)
*显示模板
dev_display_shape_matching_results(ModelID, 'red', Row1, Column1, Angle, , , )
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(对比度参数):当图片上的某一点的值大于你设定的这一个值,那么就会将该点显示出来。当对比度设定的较低的时候,找到的边缘信息较多,当对比度较高的时候,找到的边缘信息较少。对比度参数可以是一个数组,[,],在提取边缘信息的时候,会在这个范围内取选取点。 AngleStart和AngleExtent:halcon输入的参数为弧度,将定角度范围是-° ~ +°,那么可以设置为rad(-),rad(),第一个表示起始角度,第二个表示角度范围。角度上限值-角度下限值就是角度的范围。 AngleStep:角度步长(单位:弧度):模板越大,角度步长越小;要求越精确,步长越小;步长越小,占用内存越多,定位速度越慢。如果没有特殊要求,可以使用“auto”,让系统作出最佳选择。 Optimization 优化算法:一些模板包含了太多像素点,这导致模板过大(模板的边缘和信息量过大),增加了执行时间,增加了内存需求。可以使用Optimization来优化这些点。none:不减少像素点,point_reduction_low大约减少一半的点,point_reductino_medium大约减少1/.point_reduction_high大约减少1/.减少像素点可能会导致无法创建高层金字塔以及有可能降低结果的精度和准确都。当边缘较多时才会取减少像素点,一般都会使用auto。 Metric(极性):use_polarity(使用极性模式)————目标物体和模板的极性要一致,模板的前景时黑色,那么目标的前景色也一定是要黑色,模板的背景色是白色,那么目标的背景色也一定要是白色。ignore_global_polarity(忽略全局极性)————如果此时模板的前景色是黑色,背景色是白色,那么不管目标的背景色是黑色还是白色,都能匹配。ignore_local_polarity(忽略局部极性)————能够包含前两种情况的匹配,还多出了,当目标的对比度发生变化的时候,也能匹配。 MinContrast最小对比度:通过设置最小对比度来减少在查找模板的时候,噪声,纹理等因素产生的有害边缘。一般使用auto。 MaxOverlap:取值范围是0~,重叠区域占原本图片的比值。这里的重叠指的是物体最小外接矩形的重叠。 SubPixel:、none表示不使用亚像素,最大误差为半个像素。、interpolation插值法。、least_squares 标准最小二乘法4、least_squares_high。 高精度最小二乘法。、least_squares_very_high 最高精度最小二乘法。1和2在匹配图像时角度的误差精度最低时间较短,,,5在匹配时对角度的误差精度高,运行时间较长。 Greediness:范围时在0~1之间,时用来定位加速的,值越小,速度越慢,值越高,找丢目标的可能越大。建议取值0.~0.9。 ScaleMin,ScaleMax:一般对称设置。若放大倍率为1,ScaleMin设置成0.8的话,那么ScaleMax设置成1.。

create_shape_model

  

    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:输出的最小匹配分数。

find_shape_model

halcon的更多相关文章

  1. MFC&Halcon之实时视频监控

    上一篇实现了在MFC的窗体内显示图片,本篇介绍如何在MFC窗体内实时显示摄像头的影像. 要实现的功能是点击一个“开始”按钮,可以显示影像,再点击“停止”按钮,可以停止显示. 因为实时显示影像需要在一个 ...

  2. MFC&Halcon之图片显示

    上一篇介绍了MFC调用Halcon功能的简单例子,在这个例子中,点击按钮会弹出一个窗口显示图片,但是这样显示并不美观,而且...于是我决定把显示窗口做在MFC的窗体内部. 具体的方案是:使用一个Pic ...

  3. zw版·Halcon与delphi(兼谈opencv)

    zw版·Halcon与delphi(兼谈opencv) QQ群 247994767(delphi与halcon) <Halcon与delphi>系列,早两年就想写,不过一方面,因为Halc ...

  4. 【转】Delphi+Halcon实战一:两行代码识别QR二维码

    Delphi+Halcon实战一:两行代码识别QR二维码 感谢网友:绝代双椒( QQ号应原作者要求隐藏了:xxxx6348)的支持 本文是绝代双椒的作品,因为最近在忙zw量化培训,和ziwang.co ...

  5. 《zw版·Halcon入门教程与内置demo》

    <zw版·Halcon入门教程与内置demo> halcon系统的中文教程很不好找,而且大部分是v10以前的版本. 例如,QQ群: 247994767(Delphi与halcon), 共享 ...

  6. 图像开发的p2s模式:halcon+opencv的联动

    [<zw版·Halcon与delphi系列原创教程> 图像开发的p2s模式:halcon+opencv的联动 尽管halcon功能强大,基本上cv只是halcon的一个子集,不过cv毕竟是 ...

  7. 【《zw版·Halcon与delphi系列原创教程》 zw_halcon人脸识别

    [<zw版·Halcon与delphi系列原创教程>zw_halcon人脸识别 经常有用户问,halcon人脸识别方面的问题. 可能是cv在人脸识别.车牌识别方面的投入太多了. 其实,人脸 ...

  8. 《zw版·Halcon-delphi系列原创教程》 zw版-Halcon常用函数Top100中文速查手册

    <zw版·Halcon-delphi系列原创教程> zw版-Halcon常用函数Top100中文速查手册 Halcon函数库非常庞大,v11版有1900多个算子(函数). 这个Top版,对 ...

  9. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数017·point点函数

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数017·point点函数 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...

  10. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数015,vector矢量

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数015,vector矢量 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...

随机推荐

  1. js介绍及语法结构

    javaScript它是一门动态的,弱类型的,解释型面向Web的编程语言.虽然名字里有Java但其它与Java无关.它可以用来增强页面动态效果,实现页面与用户之间的实时,动态交互. javascrip ...

  2. 两个实体类 复制 copy 工具类

    import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Date; public class ...

  3. 基于mini2440嵌入式Linux根文件系统制作(Initramfs和nfs两种跟文件系统)

    嵌入式系统由三部分构成: 1.bootoader---bootparameters---2.kernel 3.Root-filesysytem 一个内核可以挂载多个文件系统,但是有一个根文件系统所以叫 ...

  4. Mac下的LDAP客户端 ApacheDirectoryStudio

    mac下的ldap browser,最开始下载的最新版本的 地址 http://directory.apache.org/studio/downloads.html 使用的时候经常卡死,尝试下载老版本 ...

  5. C# 文件操作的一些小点子

    1. 判断指定文件是否存在: bool System.IO.File.Exits(string fliePath);

  6. JavaScript 复制变量的三种方法

    参考:Copying Objects in JavaScript - Orinami Olatunji(@orinamio_) October 23, 2017    直接将一个变量赋给另一个变量时, ...

  7. struts2 JSON 插件的使用

    1. 导入包: json-lib-2.3-jdk15.jar struts2-json-plugin-2.3.15.3.jar 2. 在struts.xml中修改配置如下: <package n ...

  8. 关于客户端连接mysql的授权问题

    mysql远程连接 Host * is not allowed to connect to this MySQL server的错误. 是因为mysql需要授权才能访问.授权方式: 授权给某一个ip: ...

  9. 常用ASCII码表

  10. vue 中 弹幕的播放

    前言 最近在搞弹幕的问题,小程序上的和vue上的,不想使用插件,于是自己摸索了一下,其实包括 2中弹幕形式 有序和无序的 直接上代码吧 <!-- 弹幕 --> <template v ...