halcon新手手册_1.0.1(修)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.无论读入什么图像,读入图像显示效果明显和原始图像不一致,哪怕是从相机读入的图像,也是明显颜色差异。
什么原因引起?
初步诊断是,显示的时候调用的颜色查找表存在异常不是default ,而是其它选项。
此时可以通过查阅相关参数,调用set_system解决,也可以在编辑-》参数选择-》颜色查找表进行更改。
2.裁剪图像;从图像上截取某段图像进行保存。
如何实现该操作?
首先应该知道,region不具有单独构成图像的要素,他没有灰度值。
有用过opencv的应该知道ROI(感兴趣区域),设置好它后,对图像的大部分操作就转为图像的一个矩形区域内进行。
类似的,halcon有domain 概念。
首先设置好一个矩形区,然后使用reduce_domain(是一个矩形区域)后,再使用crop_domain 就裁剪出图像。
3.读入bmp,或tiff 图像显示该图不是bmp文件或不能读。
原因是什么?
这个常有新手询问,画图,图像管理器都能打开,又或者是相机采集完直接存到硬盘。
Halcon 读取图像在windows下面到最后是调用windows库函数实现读图功能。
咱不清楚到底是怎么调用的。
对于图像格式,在读图函数F1说明很细。
基本bmp 如果文件头不是bw还是bm(百度百科bmp格式查找,编写此处时无网络,后续可能忘记),就读不进来。
其他规格欢迎补充。
解决办法,如果是相机采集,就在内存直接转换(参见halcon到VC.pdf 里面的halcon和bitmap互转);如果是采完的图片,大部分通过画图工具转换为24位bmp 格式,即可解决。
4.读入avi文件报错。
Halcon 通过directshow或另一个格式解析视频,正常来说应该可以读入市面大部分视频,实际测试发现只能读入最标准的avi文件格式。
如果需要临时处理,需要下格式工厂等工具转化为最标准的avi文件格式(论坛叶诺有发帖说明)。
5.Region 或xld 筛选。
Halcon提供了丰富的region 和xld筛选方法。
Region可以使用select_shape_xld,选择出符合要求的区域,如果不能满足还可以通过类似region feature 这样关键字组合成的算子获取区域特征,然后通过tuple 排序或相加减,再通过tuple_find 确定是对应哪个区域的特征。
同样的halcon也提供了select_contours_xld 进行轮廓筛选。
6.Halcon分几类对象,每个类的功用是?
Halcon总分俩大类,tuple和图标对象obj 。
Tuple涵盖了对所有基础数据类型的封装,可以理解为她是halcon定义的数组类。
Obj 是alcon定义图标类基类。
衍生出了许多类型,其中Region ,Xld,Image 其中最主要的类型。
7.F1说明,参数部分-array 是什么意思?
该符号说明,该参数接受一组输入,对tuple就是一组tuple,对obj 就是通过concat_obj 或其它操作产生的一组obj元组。
8.俩个相对方形物体的距离计算。
如果这俩个物体和背景对比清晰,最近的距离在俩条边下则可以再预处理之后进行如下操作:
1.Segement_contours_xld 分割边缘线段(edgeXXXX等得到的边缘);
2.select_contours_xld 选择出特定的长度或方向边缘;
3.假设此时刚好获取俩条线,则可以利用distance_ll ,求得距离,也可以自己fit_lineXXXX 拟合直线再求距离;
以上是一种方法,另一种常见方法是利用measure_pos 或measure_pair 进行测量,不熟悉的可以翻看示例或者使用测量助手进行测量。
9.创建过程或函数,或者全文编辑。
在算子编辑窗口,main所在行右边,有四个按钮,将鼠标移到该位置,将有中文提示,按提示点击按钮。
10.从其它halcon环境窗口复制函数或算子复制到新建的halcon窗口,无法使用,提示不识别。
除了敲错,此种情况都是由于该函数式本地或全局函数,而不是halcon算子。
确定的方法:注意该算子颜色然后去编辑参数选择查看该颜色代表的算子属于什么类型函数。
亦可以直接右键,如果有查看函数。
为黑色可点击,这种情况也是本地或全局函数。
解决方法:如果是全局函数,可以在halcon目录下面找到该函数,加载到新窗口就行;也可以新建输入输出一致的过程,将代码复制过来,然后使用。
本地函数只能使用后一种方法解决。
11. 64位系统,VS2010及以下版本报error LNK1112:模块计算机类型”X86”与目标计算机类型”X64”冲突。
问题原因是默认情况,halcon在64位系统会自动安装64位halcondll,并且添加到环境变量;而vs一般是默认X86编译环境,俩者dll库不一致,换句话说是底层机器指令不一致。
解决办法是将编译环境设置为64位,详见百度;或者再次安装halcon选择32位dll,并修改环境变量VC++路径为32位库路径,bin 指向32位dll 路径。
12. 64位系统,VS2012 。
无论怎么更改库文件,头文件,名空间,最好的提示也是找不到函数定义。
反复出现,无法解决时,有可能是问题11所述问题,解决办法见11.至于为何不提示error LNK1112,可能是VS更改了前面检测等级,在编译阶段就拦截到错误。
应该说是更先进了,只是比较不合情理。
13.如何查找halcon算子?
Halcon算子命名大部分所见即所得,也就是如果你记得你要找的算子汉字名称,输入到翻译器得到英文单词,在F1 的算子分栏从头开始输大部分能找到一些算子,这时候再点击进去注意算子功能解释,懂了是自己要的就拿起来到例程搜索示例,查阅功能;不懂就看说明部分;再不懂进群问。
另外,对于近半算子是按动作_类型/目标_属性命名。
Obj 是region,xld,image的父类,后三者找不到的算子可以输入obj查找。
14.Halcon 相等,不等于,异或,或等操作符。
直接在F1 出来的分栏输入operation ,查找可得。
15.在halcon环境使用get_grayval 进行像素操作太慢,如何加速?
注意到halcon环境是解释执行,get_grayval 可以一次获取多个,可以预先把行数据存入一个tuple对象,存一次以后可用多次。
因此提速方法,建议事先创建好行tuple (用tuple_add 加一,即可实现所有行加一),列的tuple 数组(创建好可以用多次) 。
这时每次再调用get_grayval ,速度将显著提升,因为节省了逐行解释时间。
注意:如果导出到VC,则建议用get_image_pointer 获取指针进行操作。
16. 从一组region或xld,image中获取单个对象,或多个halcon同类对象构成
-array 元组。
select_obj负责从多个对象的元组选出指定序号对象;concat_obj执行将俩个对象(或元组)链接成一个对象元组。
17.更改halcon颜色查找表,显示不同颜色空间。
在编辑参数选择颜色查找表进行更改;也可以在F1输入lut进行查找设置函数。
18.创建空对象,空Region ,空数组。
gen_empty_obj 创建空的对象;gen_emtpy_region 创建空数组;halcon环境中tuple 用:=[] 。
19.Region和xld 互相转化;多边形创建xld;直方图,直线,点集,多边形,行程编码创建region 。
Halcon里对象之间的相互转换,一般可以转化为gen_目标对象_源对象形式。
如:gen_region_contour_xld 使用xld创建一个region ;gen_contour_region_xld 从区域region 创建一个轮廓xld 。
直方图histo;直线是line,点集是points,行程编码runs,黑森线hline,多边形polygon 。
按照上面格式进行查找。
20.Halcon伪彩色
可以参照冈萨雷斯伪彩色章节。
21.Halcon角度分布
22.判断Region 是否为空?
首先一般region是多个region存在一个regions 变量里面。
所以先使用count_obj 获得有多少个obj;然后使用select_obj ,选出一个区域处理;接着使用area_center ,VC可以使用region.Id()!=H_EMPTY_REGION 判断是否为空。
23.新手入门书籍?
首推《机器视觉算法与应用》,这本书前面更多的是阐述一些通用的机器视觉经验,后面有跟示例,代码为halcon8.0,实际使用可能会有部分函数已经被抛弃使用;
其次,冈萨雷斯绿皮书《数字图像处理》,介绍内容丰富,全面,但是可能讲得比较深,没有实际实践或再找资料展开会比较,常读不深入。
是数字图像处理基础理论不可多得的书籍。
24. 用halcon调用halcon支持的品牌相机,使用相机自带的厂家软件可以发现相机,可是halcon总是提示:图像获取设备未初始化。
这是为什么?
把对应品牌的相机配置文件加到采集助手的
使当前halcon调用的相机参数与厂家软件一致;再确保相机驱动,采集卡驱动安装完毕。
25.屏幕/窗口截图。
使用dump_window_image 保存对应窗口截图,截图为当前肉眼所见图像,包括已经绘制到图像上的region,xld等。
26.导出halcon 11 代码为C++ 代码,经常提示不识别,或者名空间名字没找到。
解决办法是什么?
首先halcon11 导出如果没有勾选10 ,默认产生的C++代码,对应的主要头文件是HalconCPP.h 和using namespace HalconCPP 。
配置如下头文件#include “HalconCPP.h” ,代码在导出时已经自动生成。
using namespace HalconCPP; 代码导出时已经自动生成。
在VC++目录,配置include路径,一个是默认Halcon安装文件夹下面的include ,另外一个根据你导出的代码而定,上面是halconCPP ,所以对应添加include文件夹下面的HalconCPP文件夹到路径里面。
此外配置将安装文件夹下的lib添加到库文件目录。
最后将HalconCPP.lib添加到库的依赖项。
注意此处要一句导出代码而定,上述导出的是halcon -C++代码,所以是此处添加该项。
27.标定助手的“平均误差”是指什么?
这个平均误差的计算是按如下方式:
1.计算标定板图像的标志点位置,此处记为Mark1 ;
2.标定结束后,将标准标志点,按照得出的转换矩阵,进行转换得到Mark2;
3.由于可以得到Mark1 和Mark2 点之间对应关系,点对应相减,绝对值累加(此处累加方式请具体查标定程序查找具体平均误差计算函数,很久,已记忆不详) ,然后除以标志点数目。
4.此时得到的就是平均误差。
28.Halcon参数函数里面的四个冒号(::::)是什么意思?
四个冒号按照参数类型和输入输出不同进行了分隔。
从左到右依次是(输入的obj对象:输出的obkj对象:输入的控制变量:输出的控制变量) 。
29.Halcon F1 算子Parameters 格式说明。
例1:Image1 (input_object) (multichannel-)image(-array) →object (byte* / int1* / int2* / uint2* / int4* / int8 / real*) *allowed for compute devices
Input image 1.
Image1 对应参数名input_object 指示对象参数类型是输入对象
(multichannel-) 指示是可以是多通道图像image 指示参数是一个image类型
(-array) 指示可以一次输入多个object(……) 指示输入的是object,其中支持的object 参数的内部类型如(……)所示。
例2:Mult (input_control) number →(real / integer)
参数名(参数类型) 具体类型->(支持内部参数类型)
30.多线程调用代码,代码中包含halcon窗口代码,报错。
Halcon涉及到窗口的代码都不能跨线程调用,硬是跨线程调用可能出现参数输入错误等异常情况。
参见函数F1 说明的Parallelization 并行性说明。
最好的办法是当前窗口当前线程声明,定义并使用,其它线程可以对MFC的picturebox 控件进行关联(不同线程调用该代码稳定性待测试),然后不同线程自己定义变量进行具体操作。
31.region或者xld绘制或画到图像上用哪个函数?
Halcon绘制有paint和overpaint,区别是overpaint是绘制自身,paint输出可以是其他图像。
绘制region:paint_region 绘制xld:paint_xld 。
33.线触发,软触发,外触发
软触发:顾名思义就是到达设定的采集条件时,通过软件设置触发采集;
线触发:也称外触发,是利用相机自带触发线,在到达设定的采集条件时,触发相机采集,线的信号通常是由其他设备如:红外传感器,探测到目标物体出现在预定位置,就进行采集
34.编写程序过程中,程序崩溃,环境保存路径。
(待验证)
对于windows系统,路径是C:\Documents and Settings\login\Local Settings\Temp\hdevelop. 其中login为登录的系统用户名。
注意1:在win xp 下测试,在调试程序过程中未发现临时文本。
所以待验证。
注意2:win7要求版本为11.0.1之后,之前版本存在bug 。
35.字符串和HTuple互转/const char* 和HTuple互转。
HTuple 内部的字符串类型是HString 。
HString 可以接受const char* 变量,自己转换。
HString 到const char* 可以通过HString 的Text()进行转化。
HTuple 到const char* :HTuple 变量.S().Text()
const char* 到HTuple :直接赋值即可;
其它CString ,string 到HTuple 之间通过const char* 和HTuple 进行互转。
36.遍历文件夹,读取指定格式文件/图像。
* 遍历文件夹D:/资料库/Downloads
list_files ('D:/资料库/Downloads', ['files','follow_links'], ImageFiles)
* 筛选bmp或jpg格式的文件
tuple_regexp_select (ImageFiles, ['\\.(bmp|jpg)$','ignore_case'], ImageFiles)
37.HALCON 能自定义region的颜色么?
set_rgb ,set_hsi 设置输出颜色格式。
总共有set_color, set_pixel, set_rgb, set_hsi or set_gray 可以设置输出颜色格式。
要求输入参数是字符串时按'#rrggbb' 格式。
以上是一次性设置,当前设置直到再次设置或关闭程序为止。
如果是要设置系统颜色,需要用query_color ,获取当前使用的颜色查找表,然后修改相应颜色查找表,用set_system(::'graphic_colors',...:). 设置成永久使用的颜色查找表。
注意:用 set_system 设置颜色查找表将从排除黑,白,灰色的颜色从左到右直到seg_colord设置的输出颜色数目为止。
38.凸度convexity 概念理解。
凸度= 区域面积/包围他的最小凸包面积
注意在halcon说明文档中没有特别注明是最小凸包,但按常理来说应该是最小凸包。
有兴趣的的可以试验一下。
以下是图示计算过程。
凸度= 红色/黑框包围面积
39.halcon类层次关系。
示例
1.halcon里面有没有检测条码质量分析的算子?
条码质量评测算子为get_bar_code_result 。
参见示例print_quality_isoiec15416.hdev 。
回答者记录:广州-Rex-C++ 提供24号问题(图像设备未初始化)答案
苏州-问远-C++ 提供38号问题凸度概念图,深圳-地瓜-MFC附注解释该问题。
示例区回答者记录
1号问题,halcon有没有条码质量分析的算子?深圳-小文-C# 提出问题,北京-维-VC/B回答该问题。