HALCON学习之旅(六)
文章目录
1、Halcon代码如何导出高级编程语言代码 + 配置Halcon/C++编程环境
流程如下:
①打开一个之前写好的程序:
②打开导出菜单:
③选择导出文件格式(在此举例导出C++格式文件):
④选择导出的其他文件属性:
④点击导出,生成cpp文件
⑤打开vs2017,将该文件内容替换到新建工程下的.cpp文件中
⑥配置Halcon环境:
⑥运行:
2、Halcon连续采集相机图像
工业相机的打开方式有两种:
①、用工业相机自带的相机管家打开
②、用Halcon自带的图像采集助手打开(前提:必须是Halcon所支持的相机)
Halcon图像采集助手功能介绍:
①、资源
②、连接(以电脑自带的摄像头做实例)
③、参数
④、检测
⑤、代码生成
代码演示:
* Image Acquisition 01: Code generated by Image Acquisition 01
* Image Acquisition 01: Attention: The initialization may fail in case parameters need to
* Image Acquisition 01: be set in a specific order (e.g., image resolution vs. offset).
*打开并配置图像采集设备
*参数1 图像采集接口名称 即对应的DLL(Windows)或共享库(Linux/macOS)的名称
*参数2 图像采集界面所需的水平分辨率(绝对值或 1 表示全分辨率,2 表示半分辨率,或 4 表示四分之一分辨率)
*参数3 图像采集接口所需的垂直分辨率(绝对值或 1 表示全分辨率,2 表示半分辨率,或 4 表示四分之一分辨率)
*参数4 所需图像部分的宽度(绝对值或0水平分辨率- 2*开始列)
*参数5 所需图像部分的高度(绝对值或0垂直分辨率- 2*开始行)
*参数6 所需图像部分左上角的行号(开始行)
*参数7 所需图像部分左上角的列号(开始列)
*参数8 所需半图或全图
*参数9 每像素和图像通道传输的位数
*参数10 抓取图像的输出颜色格式,对于单通道通常为“灰色”或“原始”,对于三通道图像通常为“rgb”或“yuv”
*参数11 具有设备特定含义的通用参数
*参数12 外部触发
*参数13 使用的相机类型
*参数14 图像采集设备连接到的端口
*参数15 多路复用器的相机输入线
*参数16 打开的图像采集设备句柄
open_framegrabber ('DirectShow', 1, 1, 0, 0, 0, 0, 'default', 8, 'rgb', -1, 'false', 'default', '[0] Integrated Webcam', 0, -1, AcqHandle)
*设置图像采集设备的具体参数。
*参数1 要使用的采集设备的句柄
*参数2 要更改的参数类型
*参数3 设置更改内容
set_framegrabber_param (AcqHandle, 'grab_timeout', 5000)
set_framegrabber_param (AcqHandle, 'brightness', -3)
set_framegrabber_param (AcqHandle, 'contrast', 0)
set_framegrabber_param (AcqHandle, 'hue', -1232)
set_framegrabber_param (AcqHandle, 'saturation', 67)
set_framegrabber_param (AcqHandle, 'sharpness', 5)
set_framegrabber_param (AcqHandle, 'gamma', 100)
set_framegrabber_param (AcqHandle, 'white_balance', 4930)
set_framegrabber_param (AcqHandle, 'backlight_compensation', 'on')
set_framegrabber_param (AcqHandle, 'exposure', -6)
*从指定的图像采集设备开始异步抓取
*参数1 要使用的采集设备的句柄
*参数2 此参数已过时且无效
grab_image_start (AcqHandle, -1)
while (true)
*从指定的图像采集设备异步抓取图像
*参数1 抓取的图像
*参数2 要使用的采集设备的句柄
*参数3 异步抓取开始和图像交付之间的最大容许延迟 [ms]
grab_image_async (Image, AcqHandle, -1)
* Image Acquisition 01: Do something
endwhile
*关闭指定的图像采集设备
*参数1 要关闭的图像采集设备的句柄。
close_framegrabber (AcqHandle)
效果展示:
3、Halcon批量加载图像
方法一:
方法二:
出现了一个新认识的算子接口tuple_regexp_select,以下是该算子的详细参数详解。
* Image Acquisition 01: Code generated by Image Acquisition 01
*列出目录里的所有文件
list_files ('F:/halcon_Learning/image', ['files','follow_links'], ImageFiles)
*选择与正则表达式匹配的元素
*参数1 要匹配的输入字符串
*参数2 正则表达式
* ^ 匹配字符串的开头
* $ 匹配字符串的结尾(允许末尾换行)
* . 匹配除换行符外的任何字符
* [...] 匹配括号中列出的任何字符字面量。如果第一个字符是'^',则匹配除列表中的字符外的任何字符。
* 您可以使用'-'字符,如'[A-Z0-9]'来选择字符范围。除了'\'外,其他字符在括号中失去了它们的特殊含义。
* 在这些方括号中,可以使用以下POSIX字符类(注意需要额外的方括号)
* [:alnum:] 字母和数字字符
* [:alpha:] 字母字符
* [:blank:] 空格和tab
* [:cntrl:] 控制字符
* [:digit:] 数字
* [:graph:] 非空白(如空格或控制字符)
* [:lower:] 小写字母
* [:print:] 类似[:graph:],但包含空格
* [:punct:] 标点字符
* [:space:] 所有空格字符([:blank:],换行符,…)
* [:upper:] 大写字母
* [:xdigit:] 允许的十六进制数字(0-9a-fA-F)
* * 允许前面的文字或组重复0次或更多次
* + 允许1次或更多的重复
* ? 允许0或1次重复
* {n,m} 允许n到m个重复
* {n} 允许n次重复
* 上面的重复量词默认是贪婪的,也就是说,它们尽量延长比赛时间。附加,尝试查找最小匹配,例如+?
* | 分离备选匹配表达式
* () 分组子模式并创建捕获组
* 该组捕获的子字符串将单独存储
* (?:) 分组子模式而不创建捕获组
* (?=) 正向预测(要求的条件右侧的比赛)
* (? !) 负向预测(禁赛的条件右侧的比赛)
* (?<=) 正向后预测(要求的条件左侧的比赛)
* (? < !) 负向后预测(禁赛的条件左侧的比赛)
* \ 转义任何特殊符号以将其视为文字。请注意,一些宿主语言,如HDevelop和C/ c++已经使用了反斜杠
* 作为通用转义字符。在这种情况下,'\\.”匹配一个文字点,而'\\\\'匹配文字反斜杠。
* 此外,还有一些特殊的代码(大写的每个表示否定的版本):
* \d,\D 匹配一个数字
* \w, \W 匹配一个字母、数字或下划线
* \s,\S 匹配空白字符
* \b,\B 匹配单词边界
*此外,可以通过传递字符串元组来设置一些选项
*'ignore_case' 不区分大小写
*'multiline' '^'和'$'匹配每行的开始和结束
*'dot_matches_all' 允许'.'字符也匹配换行符
*newline_lf' , 'newline_crlf' , 'newline_cr' 指定输入数据中换行符的编码所有系统上的默认值都是 LF(尽管在 Windows 文件中通常 CRLF 用作换行符,但当将文件读入内存时,读取操作符为每个换行符返回 '\n',这与 LF 相同)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
*读取图像变量
read_image (Image, ImageFiles[Index])
* Image Acquisition 01: Do something
endfor
4、Halcon设置自动保存程序
流程如下:
①、点击编辑->参数选择
②、点击一般属性->一般选项
③、Halcon崩溃/异常后文件临时存储路径 C:Users/ADMINI ~1/AppData/Local/Temp/hdevelop/程序名称.hdev,其中"ADMINI ~1" 是用户文件名。比如我是 “Administrator” ,路径如下:
5、Halcon数据结构讲解
Halcon有两类基本参数:图像参数Iconic (image, region, XLD)与控制参数Control (string, integer, real, handle)。在Halcon算子的参数中,它们依次被分为:输入图像参数、输出图像参数、输入控制参数、输出控制参数;并且其输入参数不会被算子改变。
图像参数:
①、Image
在Halcon中,Image是由通道和域构成。其中,通道可以看做为像素矩阵,同时通道包含单通道和多通道,一张图像可以由一个通道或者多个通道组成且通道大小相同。域可以看做Halcon中的region of interest(感兴趣区域)即regions,所有通道共享这个域。
像素类型:
类型 | 位数 | 有无符号 | 用途 |
---|---|---|---|
Byte | 8位 | 无符号 | 标准的灰度图像 |
Uint2 | 16位 | 无符号 | 标准的灰度图像 |
Int1 | 8位 | 有符号 | 两帧图像差异 |
Int2 | 16位 | 有符号 | 两帧图像差异 |
Int4 | 32位 | 有符号 | 两幅图像的灰度频谱 |
Direction | 8位 | 无符号(值为:0 - 179) | 边缘梯度 |
Real | 32位 | 有符号 | 边缘提取 |
Complex | 两个 Real 值 | 有符号 | 用频率表示图像 |
Cyclic | 8位 | 无符号 | 给每个颜色分配灰度值 |
Vector_field | 两帧 Real 类型图像 | 有符号 | 描述X或者Y方向的运动 |
②、regions
将区域表示为以行列坐标为内容的游程编码的形式,使之成为一种压缩方式,存储更加高效。
③、XLD(Extended Line Description)
XLD对象提供了提供了亚像素精度。有两种基本结构:轮廓和多边形XLD。(和regions的区别亚像素)。
控制参数:
控制数据 | 类型 |
---|---|
string | 字符串 |
integer | 整型 |
real | 实型 |
tuple | 数组(可为整型,实型或是字符串) |
handle | 句柄 |
注意要点:
①、Iconic tuple(图像数组) 最小索引是:1;最大索引是元素个数。
②、Control tuple(控制数组) 最小索引是:0;最大索引是元素个数减一。