halcon
读图
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的更多相关文章
- MFC&Halcon之实时视频监控
上一篇实现了在MFC的窗体内显示图片,本篇介绍如何在MFC窗体内实时显示摄像头的影像. 要实现的功能是点击一个“开始”按钮,可以显示影像,再点击“停止”按钮,可以停止显示. 因为实时显示影像需要在一个 ...
- MFC&Halcon之图片显示
上一篇介绍了MFC调用Halcon功能的简单例子,在这个例子中,点击按钮会弹出一个窗口显示图片,但是这样显示并不美观,而且...于是我决定把显示窗口做在MFC的窗体内部. 具体的方案是:使用一个Pic ...
- zw版·Halcon与delphi(兼谈opencv)
zw版·Halcon与delphi(兼谈opencv) QQ群 247994767(delphi与halcon) <Halcon与delphi>系列,早两年就想写,不过一方面,因为Halc ...
- 【转】Delphi+Halcon实战一:两行代码识别QR二维码
Delphi+Halcon实战一:两行代码识别QR二维码 感谢网友:绝代双椒( QQ号应原作者要求隐藏了:xxxx6348)的支持 本文是绝代双椒的作品,因为最近在忙zw量化培训,和ziwang.co ...
- 《zw版·Halcon入门教程与内置demo》
<zw版·Halcon入门教程与内置demo> halcon系统的中文教程很不好找,而且大部分是v10以前的版本. 例如,QQ群: 247994767(Delphi与halcon), 共享 ...
- 图像开发的p2s模式:halcon+opencv的联动
[<zw版·Halcon与delphi系列原创教程> 图像开发的p2s模式:halcon+opencv的联动 尽管halcon功能强大,基本上cv只是halcon的一个子集,不过cv毕竟是 ...
- 【《zw版·Halcon与delphi系列原创教程》 zw_halcon人脸识别
[<zw版·Halcon与delphi系列原创教程>zw_halcon人脸识别 经常有用户问,halcon人脸识别方面的问题. 可能是cv在人脸识别.车牌识别方面的投入太多了. 其实,人脸 ...
- 《zw版·Halcon-delphi系列原创教程》 zw版-Halcon常用函数Top100中文速查手册
<zw版·Halcon-delphi系列原创教程> zw版-Halcon常用函数Top100中文速查手册 Halcon函数库非常庞大,v11版有1900多个算子(函数). 这个Top版,对 ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数017·point点函数
<zw版·Halcon-delphi系列原创教程> Halcon分类函数017·point点函数 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数015,vector矢量
<zw版·Halcon-delphi系列原创教程> Halcon分类函数015,vector矢量 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...
随机推荐
- 使用@ResponseBody输出JSON
添加jackson依赖 添加@ResponseBody 测试: 原理: 当一个处理请求的方法标记为@ResponseBody时,就说明该方法需要输出其他视图(json.xml),SpringMVC通过 ...
- spring-boot 启动图标修改-启动彩蛋
spring boot启动总会显示这样的图标,但是我想不一样 到网上找了一圈,恩,找到一个不错的,做个记录 首先我们在resource目录下面放入一个banner.txt文件,Spring Boot启 ...
- 【转】CNN+BLSTM+CTC的验证码识别从训练到部署
[转]CNN+BLSTM+CTC的验证码识别从训练到部署 转载地址:https://www.jianshu.com/p/80ef04b16efc 项目地址:https://github.com/ker ...
- Nginx,LVS,HAProxy详解
Nginx/LVS/HAProxy负载均衡软件的优缺点详解 PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验 ...
- ISO/IEC 15444-12 MP4 封装格式标准摘录 2
目录 Track Media Structure Media Box Media Header Box Handler Reference Box Media Information Box Medi ...
- deepin下挂载的的Windows系统(NTFC)目录怎么是只读的???
关键命令: df-h sudo ntfsfix /dev/sda4 重启 参考博客:深度官网问题之大神回复
- Dubble 01 架构模型&start project
Dubbo 01 架构模型 传统架构 All in One 测试麻烦,微小修改 全都得重新测 单体架构也称之为单体系统或者是单体应用.就是一种把系统中所有的功能.模块耦合在一个应用中的架构方式.其优点 ...
- oracle exp 和 imp 数据和表结构互相独立导出导入
1)只导入数据.不到导入表结构 不可能只导出数据而不导出表结构 这里做了一个变向处理可以在imp时使用ignore=Y选项就可以了,而不报错. 这样就可以实现把数据导入到原来的表里: imp user ...
- RWD(Responsive Web Design)(转)
The key point is adapting to the user’s needs and device capabilities. Suppose a mobile user will be ...
- ubuntu下usb抓包方法步骤--usbmon
开发或者调试USB设备相关的工具或者驱动,一个调试的利器就是usbmon抓包. 在ubuntu下使用步骤如下: 1 运行命令 sudo mount -t debugfs none /sys/ke ...