zl程序教程

您现在的位置是:首页 >  云平台

当前栏目

halcon脚本-微小二维码识别【附源码】

识别源码 脚本 二维码 HALCON
2023-09-27 14:21:00 时间


鉴于普通二维码,一般halcon算子都可直接识别,但是对于微小二维码,,怎么设置修改参数都很难识别,对此针对小型二维码定了本次的思路


一、原图

在这里插入图片描述


二、实现思路

  • 首先建立一个可变比例的基于形状的模板,为了后续定位二维码
  • 扣图,并对图进行图像增强
  • 识别

三、halcon脚本实现

本次是直接链接相机进行检测

* Image Acquisition 01: Code generated by Image Acquisition 01
Devices := ['002149014d1b_DahengImaging_MER12209GMP','d47c4430150c_OMRONSENTECH_STCMBS1242POE','00214901bbd9_DahengImaging_MER107010GM','00214901bbd5_DahengImaging_MER107010GM']
ExposureTimes := [85000, 80000, 70000, 70000]
Image0File := 'F:\\MyBarcodeScanner\\Image0.bmp'
ShapeModelFile := 'F:\\MyBarcodeScanner\\ShapeModel.shm'
MatchROIFile := 'F:\\MyBarcodeScanner\\MatchROI.reg'
RefParamFile := 'F:\\MyBarcodeScanner\\RefParam.tup'

AcqHandles := []
for j := 0 to |Devices|-1 by 1
    open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'default', Devices[j], 0, -1, AcqHandle)
    tuple_concat (AcqHandles, AcqHandle, AcqHandles)
endfor
for j := 0 to |AcqHandles|-1 by 1
    set_framegrabber_param (AcqHandles[j], 'ExposureTime', ExposureTimes[j])
endfor

file_exists (Image0File, Image0FileExists)
if (Image0FileExists)
    read_image (Image0, Image0File)
else
    grab_image (Image0, AcqHandles[0])
    write_image (Image0, 'bmp', 0, Image0File)
endif
get_image_size (Image0, Width, Height)

dev_close_window ()
WinWidth := Width/6
WinHeight := Height/6
dev_open_window (0, 0, WinWidth, WinHeight, 'white', WindowHandle1)
dev_open_window (0, 20+WinWidth, WinWidth, WinHeight, 'white', WindowHandle2)
dev_open_window (75+WinHeight, 0, WinWidth, WinHeight, 'white', WindowHandle3)
dev_open_window (75+WinHeight, 20+WinWidth, WinWidth, WinHeight, 'white', WindowHandle4)
dev_open_window (0, 40+WinWidth*2, 320, 360, 'black', WindowHandle)
dev_open_window (0, 60+WinWidth*2+320, 320, 240, 'black', WindowHandle0)
tuple_concat (WindowHandle1, WindowHandle2, WindowHandles)
tuple_concat (WindowHandles, WindowHandle3, WindowHandles)
tuple_concat (WindowHandles, WindowHandle4, WindowHandles)

dev_set_window (WindowHandle1)
dev_display (Image0)
set_display_font (WindowHandle, 20, 'mono', 'true', 'false')
disp_message (WindowHandle, 'Information', 'window', 5, 5, 'yellow', 'false')

file_exists (ShapeModelFile, ShapeModelFileExists)
if (ShapeModelFileExists)
    read_shape_model (ShapeModelFile, ShapeModelID)
    read_region (RegionMatchROI, MatchROIFile)
    read_tuple (RefParamFile, RefParam)
    tuple_select (RefParam, 0, RefRow)
    tuple_select (RefParam, 1, RefColumn)
else
    draw_region (ROI1, WindowHandle1)
    draw_region (ROI2, WindowHandle1)
    draw_region (ROI3, WindowHandle1)
    concat_obj (ROI1, ROI2, ModelROI)
    concat_obj (ModelROI, ROI3, ModelROI)
    union1 (ModelROI, ModelROI)
    draw_region (RegionMatchROI, WindowHandle1)
    reduce_domain (Image0, ModelROI, Image0Reduced)
    create_scaled_shape_model (Image0Reduced, 'auto', -rad(30), rad(60), 'auto', 0.75, 1.25, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ShapeModelID)
    write_shape_model (ShapeModelID, ShapeModelFile)
    write_region (RegionMatchROI, MatchROIFile)
    area_center (ModelROI, Area, RefRow, RefColumn)
    tuple_concat (RefRow, RefColumn, RefParam)
    write_tuple (RefParam, 'F:/MyBarcodeScanner/RefParam.tup')
endif

create_data_code_2d_model ('QR Code', [], [], DataCodeHandle)
set_data_code_2d_param (DataCodeHandle, 'polarity', 'dark_on_light')
set_data_code_2d_param (DataCodeHandle, 'timeout', 1000)
set_data_code_2d_param (DataCodeHandle, 'contrast_min', 20)

stop ()

while (true)
    dev_set_window (WindowHandle0)
    gen_empty_obj (Images)
    for j := 0 to |AcqHandles|-1 by 1
        grab_image (Image, AcqHandles[j])
        concat_obj (Images, Image, Images)
    endfor
    count_obj (Images, Number)
    
    dev_set_window (WindowHandle0)
    
    DecodedResults := []    
    
    for Index := 1 to Number by 1
        dev_set_window (WindowHandles[Index-1])
        select_obj (Images, ObjectSelected, Index)
        
        dev_display (ObjectSelected)
        find_scaled_shape_model (ObjectSelected, ShapeModelID, -rad(30), rad(60), 0.75, 1.25, 0.25, 1, 0.25, 'least_squares', 0, 0.5, Row, Column, Angle, Scale, Score)
        if (|Score|=1 and Score>0.5)
            vector_angle_to_rigid (RefRow, RefColumn, 0, Row, Column, Angle, HomMat2D)
            affine_trans_region (RegionMatchROI, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
            reduce_domain (ObjectSelected, RegionAffineTrans, ImageReduced)
            find_data_code_2d (ImageReduced, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)
            if (|DecodedDataStrings|=1)
                tuple_concat (DecodedResults, DecodedDataStrings, DecodedResults)
                disp_message (WindowHandles[Index-1], DecodedDataStrings, 'window', 5, 5, 'yellow', 'false')
            endif
        endif      
    endfor
    
    dev_set_window (WindowHandle)
    dev_clear_window ()
    for i := 0 to |DecodedResults|-1 by 1
        disp_message (WindowHandle, DecodedResults[i], 'window', 5+25*i, 5, 'green', 'false')
    endfor
    
    * Image Acquisition 01: Do something
*     stop ()
    wait_seconds (0.1)
endwhile

stop ()
clear_shape_model (ShapeModelID)
clear_data_code_2d_model (DataCodeHandle)

stop ()
for j := 0 to |AcqHandles|-1 by 1
    close_framegrabber (AcqHandles[j])
endfor