Skip to content

HaIcon


杂项写法

HaIcon
*角度转弧度
rad(0)

num:=[1,2,3,4,5,6,7,8,9]
*获取元组长度
tuple_length(nums,Length)

引入文件加所有文件

助手 -> 打开新的 Image Acquisition -> 点击图像文件 -> 选择路径 —> 点击代码生成 -> 点击插入代码

算子

图像

rgb1_to_gray 彩色转灰度图像

  • 将Image图片转为灰度图片赋值给GrayImage变量
    rgb1_to_gray(Image,GrayImage)

mirror_image 镜像翻转图像

  • 将Image图片进行镜像翻转,赋值给mirrorImage变量 (row垂直翻转,column水平翻转)
    mirror_image(Image,mirrorImage,'row')

fill_up 填充连通域

  • 将ConnectedRegions变量进行填充,赋值给FilledRegions变量
    fill_up(ConnectedRegions,FilledRegions)

shape_trans 变换区域形状,是轮廓更加平滑

  • 将FilledRegions变量进行轮廓形状拟合,赋值给FilledRegions变量
    shape_trans(FilledRegions,FilledRegions,'outer_circle')

difference 计算差值

  • 计算Image和mirrorImage的差值,赋值给Difference变量
    difference(Image,mirrorImage,Difference)

erosion_circle 腐蚀操作

  • 将Difference变量进行腐蚀操作,腐蚀程度为Size,赋值给Erosion变量
    erosion_circle(Difference,Erosion,Size)

gray_opening_shape 灰度开运算

  • 开运算是形态学处理中的一种基本操作,他首先对图像进行腐蚀(erosion),然后进行膨胀(dilation)

    这种组合有助于去除小的明亮的活着暗淡的区域(即噪声),同时保持图像上的整体形状和结构 gray_opening_shape(Image,ImageOpening,7,7,'octagon')

opening_shape 开运算

gray_closing_shape 灰度闭运算

  • 闭运算是形态学处理中的一种基本操作,他首先对图像进行膨胀(dilation),然后进行腐蚀(erosion)

    这种组合有助于填充图像中的小孔或黑色区域,同时平滑图像的轮廓,但不会显著的改变他们的总体位置和形状。 gray_closing_shape(Image,ImageClosing,7,7,'octagon')

region_to_bin 区域二值化

  • 将Erosion变量进行二值化处理,显示区域的灰度值为255,背景为0,生成图像的宽为656,高为492, 赋值给Region变量
    region_to_bin(Erosion,Region,255,0,656,492)

select_sharp 借助形状特征选择区域

  • 筛选ConnectedRegions变量中面积在150到99999之间的区域,赋值给SelectedRegions变量
    select_sharp(ConnectedRegions,SelectedRegions,'area','and',150,99999)

count_obj 计算连通域数量

  • 计算ConnectedRegions变量中连通域的数量,赋值给Number变量
    count_obj(SelectedRegions,Number)

area_center 获取区域的中心位置

  • 获取到SelectedRegions图片的面积和中心原点
    area_center(SelectedRegions,Area,Row,Column)

smallest_rectangle1 获取最小外接矩形

  • 获取到SelectedRegions图片的最小外接矩形,拿到每一个矩形的信息赋值给Row,Column,Phi,Length1,Length2 smallest_rectangle2(SelectedRegions,Row,Column,Phi,Length1,Length2)

read_ocr_multi_class_mlp 读取OCR模型

  • 读取OCR模型,赋值给ModelID变量
    read_ocr_multi_class_mlp('Indudustrial_0-9A-Z_NoRej.omc',OCRHandle)

skeleton 获取骨架

  • 获取到SelectedRegions图片的骨架,赋值给Skeleton变量
    skeleton(SelectedRegions,Skeleton)

gray_histo 计算灰度直方图分布

gray_histo(Image,Image,AbsoluteHisto,RelativeHisto)

histo_to_thresh 根据图像直方图自动确定阈值,从而将灰度图像转化为二值图像

histo_to_thresh(RelativeHisto,8,MinThresh,MaxThresh)

wait_seconds 延时

wait_seconds(0.5)延时0.5秒

图像分割

threshold 阈值分割

  • 将GrayImage图片进行二值化处理,赋值给Region变量
    threshold(GrayImage,Region,128,255)

dyn_threshold 动态阈值分割

  • 局部阈值分割操作

    dyn_threshold(ImageOpening,ImageClosing,RegionDynThresh,75,'not_equal')

binary_threshold 自动全局阈值分割

  • binary_threshold(Image,Region,'max_separability','dark',WindowHandle)

auto_threshold 使用直方图确定阈值对图像进行分割

  • 基于阈值,分割成前景(亮区域)和后景(暗区域)

  • 会自动计算阈值,根据阈值划分成不同的区域(Region)

    auto_threshold(Image,Regions,5)

connection 连通域分析

  • 将Region变量进行连通域分析,赋值给ConnectedRegions变量
    connection(Region,ConnectedRegions)

sort_region 根据区域的相对位置进行排序

参数: ConnectedRegions:要排序的区域 SortRegions:排序后的区域 'character':按照字符排序 'true':增加或减少 'row':按照行排序
sort_region(ConnectedRegions,SortRegions,'charscter','true','row')

union1 返回所有输入区域的并集

  • 将每个单独的对象的合并成一个对象

    union1(ConnectedRegions,union1Region)

图像对比

create_shape_model 创建一个要匹配的模板

**参数:**ImageReduced1输入的模型 'auto'金字塔等级的数量 rad(0)角度开始 rad(360)角度范围 auto角度的步长(分辨率) auto优化类型 'use_polarity'Match指标 'auto'对比度阈值 'auto'搜索图像中对象的最小对比度 ModelID模型的句柄create_shape_model(ImageReduced1,'auto',rad(0),rad(360),'auto','auto','use_polarity','auto','auto',ModelID)

find_shape_model 查找图像中形状模型的最佳匹配项

**参数:**Image输入的图像 ModelID模型的句柄 rad(0)最小旋转 rad(360)旋转的角度范围 0.5最低接受分数 1匹配的数量 0.5实例的最大重叠数 'least_squares'子像素 0匹配使用金字塔等级数 0.9搜索启发式的贪婪模式 Row1找到模型的行坐标 Cloumn1找到模型的列坐标 Angle找到的模型实例的旋转角度 Score找到的模型的实例分数find_shape_model(Image,ModelID,rad(0),rad(360),0.5,1,0.5,'least_squares',0,0.9,Row1,Cloumn1,Angle,Score)

dev_display_shape_matching_results 显示匹配结果

参数: ModelID输入的匹配模型 'red'输入匹配结果后用什么颜色展示 Row1输入匹配的y坐标的位置 Column1输入匹配的x坐标的位置 Angle输入匹配的对应的角度 1水平方向的缩放比例 1垂直方向的缩放比例 0找到的模型实例的索引dev_display_shape_matching_results(ModelID,'red',Row1,Column1,Angle,1,1,0)

vector_angle_to_rigiid 计算来自点和角度的刚性仿射变换

**参数:**Row 原始点的行坐标 Column原始点的列坐标 0原始点的旋转角度 Row1 变换点的行坐标 Column1变换点的列坐标 Angle变换点的旋转角度 HomMat2D输出的转换矩阵

vector_angle_to_rigiid(Row,Column,0,Row,Column1,Angle,HomMat2D)

仿射变换

hom_mat2d_identity 获取图片的矩阵常量

  • 获取图片的常量矩阵赋值给HomMat2D
    hom_mat2d_identity(HomMat2D)

hom_mat2d_translate 平移矩阵

  • 将HomMat2D矩阵进行平移,Row为行,Column为列,赋值给HomMat2DTranslate变量
    hom_mat2d_translate(HomMat2D,Height/2-Row,Width/2-Column,HomMat2DTranslate)

hom_mat2d_rotate 旋转矩阵

  • 将HomMat2D矩阵进行旋转,Angle为角度,Height/2、Width/2为旋转的中心原点,赋值给HomMat2DRotate变量 hom_mat2d_rotate(HomMat2D,Angle,Height/2,Width/2,HomMat2DRotate)

hom_mat2d_scale 缩放矩阵

  • 将HomMat2D矩阵进行缩放,XFactor为X轴缩放比例,YFactor为Y轴缩放比例,Height/2、Width/2为缩放的中心原点,赋值给HomMat2DRotate变量 hom_mat2d_scale(HomMat2D,2,2,Height/2,Width/2,HomMat2DRotate)

affine_trans_image 仿射变换

  • 将Image图片根据HomMat2DRotate矩阵进行仿射变换,将变换后的图像赋值给ImageAffineTrans变量 affine_trans_image(Image,ImageAffineTrans,HomMat2DRotate,'constant','false')

affine_trans_region 对区域应用任意仿射2D变换

参数: RegionUnion要旋转和缩放的区域 RegionAffineTrans变换过的图像 HomMat2D输入变换矩阵 nearest_neighbor应该使用插值来完成转换吗affine_trans_region(RegionUnion,RegionAffineTrans,HomMat2D,'nearest_neighbor')

图像增强

invert_image 图像取反算子

  • 将GrayImage图片进行取反操作,赋值给InvertImage变量
    invert_image(GrayImage,InvertImage)

emphasize 增强图像的对比度

  • 增强图像的对比度 将Mask图片进行增强,赋值给Emphasize变量
    emphasize(Mask,Emphasize,9,9,1,0)

scale_image 图像缩放灰度

  • 将Emphasize图片进行缩放灰度,赋值给ScaleImage变量
    scale_image(Emphasize,ScaleImage,0,255)

equ_hist_image 直方图均衡化

  • 将ScaleImage图片进行直方图均衡化,赋值给EquImage变量
    equ_hist_image(ScaleImage,EquImage)

图像噪声

gauss_distribution 生成高斯噪声分布

  • 生成高斯噪声分布,均值为20,将噪声分布赋值给Distribution变量
    gauss_distribution(20,Distribution)

add_noise_distribution 向图像添加噪声

  • 将Distribution噪声分布添加到GrayImage图片中,赋值给ImageNoise变量
    add_noise_distribution(GrayImage,ImageNoise,Distribution)

sp_distribution 生成椒盐噪声分布

  • 生成30百分比的盐(白色像素),40胡椒粉(黑噪声像素),将噪声分布赋值给Distribution
    sp_distribution(30,40,Distribution)

mean_image 均值滤波,通过平均平滑

  • 将Image图片进行均值滤波,滤镜遮罩高度为3宽度为3的图片赋值给Mean变量
    mean_image(Image,Mean,3,3)

图像锐化

sobel_amp 使用Sobel算子检测边缘(振幅) (图像锐化)

  • 使用Sobel算子检测边缘(振幅) 将Image图片进行边缘检测,过滤类型为sum_abs,滤镜遮罩大小为3,赋值给Amp变量
    sobel_amp(Image,Amp,'sum_abs',3)

laplace 拉普拉斯算法

  • 使用拉普拉斯算法将Image图片进行边缘检测,滤镜遮罩大小为3,赋值给Laplace变量
    laplace(Image,ImageLaplace,'signed',3,'n_4')

频域图像处理

fft_generic 快速傅里叶变换

  • 将Image图片进行快速傅里叶变换,赋值给ImageFFT变量 ('to_freq'正变换,'from_freq'反变换)
    fft_generic(Image,ImageFFT,'to_freq',-1,'sqrt','dc_center','complex')

gen_lowpass 生成低通滤波器模型

  • 生成一个低通滤波器,赋值给ImageLowpass变量,半径为0.1,类型为none,中心为dc_center,宽高为Width,Height
    gen_lowpass(ImageLowpass,0.1,'none','dc_center',Width,Height)

convol_fft

  • 将ImageFFT图片进行卷积操作,赋值给ImageFFTConv变量
    convol_fft(ImageFFT,ImageLowpass,ImageFFTConv)

文件

gen_image_const 生成一个常量图像

  • 设置一个单通道图片,大小 宽为12像素,高为9像素
    gen_image_const(Image,'byte',12,9)

set_grayval 设置某个像素点的灰度值

  • 设置Image图片中坐标为0,0的像素点灰度值为255
    set_grayval(Image,0,0,255)

write_image 写入图片文件

  • 将Image图片写入到文件中,文件名为clip 无法识别的区域用黑色代替(灰度值为0)
    write_image(Image,'pnd',0,'clip.png')

read_image 读取图片文件

  • 读取图片文件,赋值给Image变量
    read_image(Image,'clip')

zoom_image_factor

  • 将Image图片进行缩放,赋值给ZoomImage变量
    zoom_image_factor(Image,ZoomImage,0.5,0.5,'constant')

get_image_size 获取照片的宽高

  • 获取照片的宽高并赋值给Height,Width变量
    get_image_size(Image,Height,Width)

窗口

dev_open_window 打开一个窗口

  • 打开一个窗口 位置在0,0,宽高为自适应,背景为黑色,赋值给WindowID变量
    dev_open_window(0,0,-1,-1,'black',WindowID)

dev_close_window 关闭窗口

  • 关闭WindowID窗口
    dev_close_window(WindowID)

dev_display

  • 将Image图片显示在窗口上
    dev_display(Image)

draw_rectangle1

  • 在WindowID窗口上绘制一个矩形将坐标位置赋值给Row1,Column1,Row2,Column2
    draw_rectangle1(WindowID,Row1,Column1,Row2,Column2)

gen_rectangle1

  • 根据绘制的矩形窗口坐标创建一个矩形框
    gen_rectangle1(Rectangle,Row1,Column1,Row2,Column2)

reduce_domain

  • 缩小图像的区域 将Image图片根据Rectangle矩形框进行裁剪,赋值给Mask变量
    reduce_domain(Image,Rectangle,Mask)

dev_set_part

  • 修改显示的图像部分 将Emphasize图片显示在WindowID窗口上,显示部分为Rectangle矩形框
    dev_set_part(Row1,Column1,Row2,Column2)

dev_disp_text

  • 在windows窗口上显示文本,文本内容为Text
    dev_disp_text(Text,'window',Row,Column,'black',[],[])

set_display_font 设置字体

  • 设置窗口显示的字体,字体大小为26,字体类型为mono,字体粗体为true,斜体为false
    set_display_font(WindowID,26,'mono','true','false')

颜色

SetColored 设置颜色数量

  • 设置颜色数量为12
    SetColored(Image,12)

dev_set_colored 设置颜色数量

识别

二维码和一维码识别

halcon扫描二维码若出现中文会有中文乱码问题,在halcon中给出方案是

set_system ('filename_encoding', 'utf8')

*创建一个二维码数据class模型 1.create_data_code_2d_model (‘QR Code’,‘default_parameters’, ‘maximum_recognition’,DataCodeHandle) *-检测和读取图像中的二维数据代码符号或训练二维数据代码模型。 2.find_data_code_2d (GrayImage,SymbolXLDs,DataCodeHandle, ‘train’, ‘all’,ResultHandles, DecodedDataStrings) *删除2D数据代码模型并释放分配的内存。 3.clear_data_code_2d_model(DataCodeHandle)

我们经常会碰到的问题

1.Halcon算子默认情况下,只识别一个。如果需要识别多个二位码,修改下面参数: find_data_code_2d (Image2, SymbolXLDs, DataCodeHandle, ‘stop_after_result_num’, 3, ResultHandles, DecodedDataStrings) 表示识别图片中3个二位数。按照要求修改。 2.关于二维码的类型:

create_data_code_2d_model算子的第一个参数,就是二位码类型,如果想做成通用的二位码类型,就需要枚举每个类型了。 2d_codeMode:=[‘Aztec Code’, ‘Data Matrix ECC 200’, ‘GS1 Aztec Code’, ‘GS1 DataMatrix’, ‘GS1 QR Code’, ‘Micro QR Code’, ‘PDF417’, ‘QR Code’]

3.图像预处理和二维码增强(图片本身问题调整) 对比度太低:scale_image(Scale the gray values of an image),增强图像的对比度。白话的意思是让黑的地方更黑,亮的地方更亮 图像模糊:emphasize锐化图像,使二维码看起来更清晰。 关于这两个算子,将在下面章节介绍。

4.如果整张图信息太多,则可以先把二维码区域挖出来,使用reduce_domain和crop_domain算子,这样不仅可以降低解码难度,还可以减少解码时间。

5、当二维码很小的时候,可以尝试用zoom_image_factor放大了二维码图像。

6、create_data_code_2d_model (‘QR Code’, [], [], DataCodeHandleQR)

创建模型时,[ ]中不填内容,实际默认属性名是‘default_parameters’,默认属性值是‘standard_recognition’。 如果想大幅度提高解码成功率,可以将属性值置为‘enhanced_recognition’或者‘maximum_recognition’。注意:解码能力越强,解码时间越长。

最后还有几个算子也值得注意一下:

set_data_code_2d_param :设置解码时的参数

get_data_code_2d_param :获取解码时的参数(如果没有设置过,则获得的是默认值)

get_data_code_2d_results :获得解码后的一些结果

以上是关于二维码识别的相关情况的总结,实际工程项目中,还需要将二维码识别数据显示出来和传递出去。

Released under the MIT License.