鉴于普通二维码,一般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