Halcon的使用逻辑是:首先用 HDevelop 完成算法设计和验证,然后导出为 C/C++、VB、C# 完成算法实现
Halcon的HDevelop提供所见即所得的算法验证平台,极大提高算法研发的效率
类似Matlab,HDevelop提供了一套编程语法
HDevelop主要包含两种变量:图像变量和控制变量;其中图像变量包含图像、轮廓、区域等类型,控制变量为数值类型(tuple)
如图1所示,主要分5个子窗口(乱了的时候菜单栏 -> 窗口 -> 排列窗口)
图中1为图像窗口,显示3中的图像变量(右键图像变量 -> 清除/显示 显示相应变量,否则为叠加效果)
注:图像变量包含几种类型(halcon称为语义):图像、区域、轮廓等等。
不同算子接受的类型不同,有时候需要做转换
**区域生成轮廓
gen_contour_region_xld (SelectedRegions, contour, 'border')
**轮廓生成区域
gen_region_contour_xld (contour, reg_contour, 'filled')
图中区域2为算子窗口,输入算子会自动展开输入输出变量,点击“插入/替换”就可以在区域5的光标位置插入算子。其最大的意义是提供了函数接口的快速查询(F1帮助文档的精简版)
区域4为控制变量窗口,包含各种数值类型
区域5为程序窗口,使用Halcon的算子配合简单的控制逻辑实现算法验证:
**窗口初始化
**dev_开头的为设备类操作,其他为算子操作
dev_close_window()
read_image(src_img, 'C:/Users/yayo/Desktop/1.jpg')
get_image_size(src_img, width, height)
dev_open_window(0, 0, width, height, 'black', WindowID)
set_display_font (WindowID, 20, 'mono', 'true', 'false')
dev_display(src_img)
**rgb转hsv
decompose3(src_img, img_r, img_g, img_b)
trans_from_rgb(img_r, img_g, img_b, img_h, img_s, img_v, 'hsv')
**dev_set_draw可以决定得到的区域或轮廓是填充的(‘fill’)还是中空的(‘margin’)
**dev_set_line_width可以决定获得的轮廓或区域的粗细程度
dev_set_draw('fill')
dev_set_line_width(2)
threshold(img_s, filted_s, 90, 255)
opening_circle(filted_s, opened, 3)
dilation_circle(opened, dil_region, 5)
connection(dil_region, regions)
area_center(regions, areas, rows, cols)
tuple_sort_index(areas, indexs)
tuple_inverse(indexs, indexs)
select_obj (regions, SelectedRegions, indexs[0]+1)
gen_contour_region_xld (SelectedRegions, contour, 'border')
dev_set_color('red')
dev_display(contour)
dev_set_draw('margin')
smallest_rectangle2 (SelectedRegions, rect_center_y, rect_center_x, rect_ang, rect_wid, rect_hei)
gen_rectangle2 (Rectangle, rect_center_y, rect_center_x, rect_ang, rect_wid, rect_hei)
dev_set_color('green')
dev_display(Rectangle)
gen_region_contour_xld (contour, reg_contour, 'filled')
inner_circle (reg_contour, cir_center_y, cir_center_x, cir_rad)
gen_circle (Circle, cir_center_y, cir_center_x, cir_rad)
dev_set_color('green')
dev_display(Circle)
message_length := 'length: ' + rect_hei
message_wide := 'wide: ' + rect_wid
message_ang := 'angle: ' + deg(rect_ang)$'.2f'
disp_message(WindowID, message_length,'image', 10, 10, 'red', 'false')
disp_message(WindowID, message_wide,'image', 40, 10, 'red', 'false')
disp_message(WindowID, message_ang,'image', 70, 10, 'red', 'false')
如图2所示,HDevelop的算子基本上都有对应的C/C++和其他几个语言的接口
因此,原则上,按照HDevelop的算法步骤,将每个算子换成相应语言接口就可以实现了
不过HDevelop还有一项导出功能,可以自动将其转换
参考文章《HALCON初步:HDevelop导出C++程序到VS 2013》
新建一个工程后
“VC++目录 -> 包含目录”添加
$(HALCONROOT)/include
$(HALCONROOT)/include/halconcpp
“VC++目录 -> 库目录”添加
$(HALCONROOT)/lib/$(HALCONARCH)
“链接器-> 输入”添加
halconcpp.lib
再把上一步导出的cpp添加进来稍微修改修改就可以了
1)算法主体被封装在函数 action() 内
2)个别函数由于涉及到操作系统的问题,需要实现(也是自动的)
比如:set_display_font、disp_message
3)可以看到,与HDevelop相对应,变量被分为两种类型:HObject 和 HTuple,前者对应图像变量,后者对应控制变量
4)HObject 和 HTuple 都是封闭的,无法自由查看其内部值。这里 OpenCV 的优势就是,与C的基本数据类型更紧密,连图像变量(Mat)都能直接访问
参考文章《【Halcon】HTuple数据和VC数据的相互赋值》,可以通过 HTuple 自带方法转换为基本数据类型
// HTuple→VC 数据类型转换
HTuple hTuple = 1234;
int i = hTuple[0].I(); // i=1234
long l = hTuple[0].L(); // l=1234
long lNumber = hTuple.Num(); // lNumber=1,数据个数
double d = hTuple[0].D(); // d=1234.0000
hTuple = "1234";
CString strBuffer = hTuple[0].S(); // strBuffer="1234"
// VC→HTuple 数据类型转换
int ii = 1234;
double dd = 1234.1234;
CString strTemp = "Halcon";
HTuple hTuple2;
hTuple2[0] = ii; // hTuple2[0].I()=1234
hTuple2[1] = dd; // hTuple2[1].D()=1234.1234
hTuple2[2] = strTemp.GetBuffer(); // hTuple2[2].S()="Halcon"
i = hTuple2[0].I(); // i=1234
d = hTuple2[1].D(); // d=1234.1234
strBuffer = hTuple2[2].S(); // strBuffer="Halcon"
lNumber = hTuple2.Num(); // lNumber=3,数据个数
上节生成的可执行文件移植到其他机器上,额外需要以下文件
halcon.dll
halconcpp.dll
hcanvas.dll
license.dat //halcon 运行版许可文件(加密狗)
msvcp120.dll
msvcr120.dll