ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

halcon——条码定位与识别(一维码)

2021-06-13 15:33:47  阅读:365  来源: 互联网

标签:条码 code bar image halcon 一维 endif 提取


引言

条码识别的应用大多数在物流行业中(需要识别的条码一般在快递包裹中),对于一维码的识别,halcon有自带条码识别算子create_bar_code_model和find_bar_code 。而快递标签处有很多的文字,符号和边框,增大了定位的难度。,因此有时也有检测不到条码的情况。针对这一现象,本篇就来深度分析一下如何更好的去识别一维码。


 一,相关算子分析

  • create_bar_code_model(创建一维码模型)

create_bar_code_model ([], [], BarCodeHandle) 
参数一//输入   需要调整的参数名称(为[]表示暂时不设置)
参数二//需要调整的该参数的值。 
参数三// 返回的条码模板句柄 
  • set_bar_code_param(对模型设置参数)
set_bar_code_param( BarCodeHandle, GenParamNames, GenParamValues )

BarCodeHandle(in)//模型句柄
GenParamNames(in)//参数名称
GenParamValues (in)//参数值

  • find_bar_code (识别一维码)

find_bar_code(Image ,SymbolRegions ,BarCodeHandle, CodeType , DecodedDataStrings)

参数列表:
Image //输入图像
SymbolRegions//检测到的条形码区域(输出)
BarCodeHandle//    条形码句柄
CodeType//    条形码类型
DecodedDataStrings//识别结果(输出)

二,提高解码能力的其他措施

(1)图像预处理(增强条码)

  • 对比度太低:scale_image(或使用外部程序scale_image_range),增强图像的对比度。
  • 图像模糊:emphasize锐化图像,使条码看起来更清晰。
  • 深色背景上读取浅色条码:invert_image反转图像。

(2)如果整张图信息太多,则可以先把条码区域挖出来,使用reduce_domain和crop_domain算子,这样不仅可以降低解码难度,还可以减少解码时间。也可使用decode_bar_code_rectangle2在指定的矩形区域内解码。

(3)当条码很密或者很小的时候,可以尝试用zoom_image_factor放大了条码图像。

(4)find_bar_code中将“CodeType”设置为“auto”可以读取多种类型的条码,但是会增加运行时间,且可能会降低解码的可靠性。最好只扫描预知的条形码类型。

三,如何在图像提取条码区域

以快递上的一维码为例,由于快递标签处有很多的文字,符号和边框,增大了定位的难度。(如下图)而且有很多噪声的影响。

 halcon实现:


 1,读入图像,提取轮廓


 有两种方法:

  1. 基于边缘提取
  2. blob分析
read_image (Image, 'C:/Users/86175/Desktop/4.png')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle)
dev_display (Image)
rgb1_to_gray (Image, GrayImage)

*第一种边缘提取初步提取轮廓
laplace_of_gauss(GrayImage, ImageLaplace, 2)//拉布拉斯算子
threshold(ImageLaplace, Region3, 5, 127)
skeleton(Region3, Skeleton3)
connection (Skeleton3, ConnectedRegions2)
select_shape (ConnectedRegions2, SelectedRegions, ['area','width','height'], 'and', [0,0,0], [220,80,200])

*第二种Blob分析法初步提取条码
threshold (GrayImage, Regions, 7, 107)
connection (Regions, ConnectedRegions)

二者提取效果差不多,但是考虑到Blob分析法可能对相机像素有较大的要求,否则二值化后可能提取不出条码线,个人觉得用边缘提取的方式较稳定。


 2,筛选条码区域


*通过面积和矩形度筛选
select_shape (ConnectedRegions, SelectedRegions1, 'area', 'and', 60, 1500)
select_shape_std (SelectedRegions1, SelectedRegions, 'rectangle2', 60)

*提取轮廓
union1 (SelectedRegions, RegionUnion)
skeleton (RegionUnion, Skeleton4)
gen_contours_skeleton_xld (Skeleton4, Contours1, 1, 'filter')
*通过轮廓长度过滤小噪声
select_contours_xld (Contours1, SelectedContours, 'contour_length', 30, 200, -0.5, 0.5)


 3,拟合直线,进一步筛选


*因为条码都是直线,可以通过角度相同的直线分割条码
*拟合直线
fit_line_contour_xld (SelectedContours, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist1)
*画拟合线
gen_region_line (RegionLines1, RowBegin, ColBegin, RowEnd, ColEnd)
*在0~-180°里每-30°查找一次条码
for i:=-1 to -150 by -30
    
    select_shape (RegionLines1, SelectedRegions3, 'phi', 'and', rad(i-30),  rad(i))
    count_obj (SelectedRegions3, Number)
    if(Number>12)
        union1 (SelectedRegions3, RegionUnion1)
        area_center (RegionUnion1, Area1, Row, Column)
        orientation_region (RegionUnion1, Phi)
        if(Phi>rad(90))
            Phi:=Phi-rad(180)
        endif
        if(Phi<-rad(90))
            Phi:=rad(180)+Phi
        endif
        vector_angle_to_rigid (Row, Column, Phi, Row, Column,rad(0), HomMat2D)
        affine_trans_region (RegionUnion1, RegionAffineTrans1, HomMat2D, 'nearest_neighbor')
        affine_trans_image (GrayImage, ImageAffineTrans, HomMat2D, 'constant', 'false')   
        closing_rectangle1 (RegionAffineTrans1, RegionClosing, 80, 2)
        connection (RegionClosing, ConnectedRegions1)
        select_shape (ConnectedRegions1, SelectedRegions4, 'area', 'and', 2954.26, 50000)
        shape_trans (SelectedRegions4, RegionTrans, 'rectangle2')
        region_features (RegionTrans, 'width', w)
        region_features (RegionTrans, 'height', h)
        if(w/h<2.5 or w/h>10)
            continue
        endif
        reduce_domain (ImageAffineTrans, RegionTrans, ImageReduced1)
        threshold (ImageReduced1, Regions1, 160, 254)
        area_center (Regions1, Area, Row1, Column1)
        threshold (ImageReduced1, Regions2, 0, 120)
        area_center (Regions2, Area2, Row2, Column2)
        if(Area>Area2)
            if(Area/Area2>2)
                continue
            endif
        endif
        if(Area2>Area)
            if(Area2/Area>2)
                continue
            endif
        endif
        dilation_circle (RegionTrans, RegionDilation, 6)
        reduce_domain (ImageAffineTrans, RegionDilation, ImageReduced)
    endif
endfor

 

 

参考博文:(2条消息) Halcon条码定位算法(一维码)_三元荧的博客-CSDN博客

标签:条码,code,bar,image,halcon,一维,endif,提取
来源: https://www.cnblogs.com/xyf327/p/14880348.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有