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
相关文章
- plsql 只能识别32位的oracle解决办法
- 人脸识别5.3- insightface人脸3d关键点检测源码更改,根据姿态角修正图片角度,调整向量解析值,增大识别准确度,以及返回俯仰角,偏航角,旋转角
- 多路径识别算法
- 【Selenium项目实战】实现工具类:设计获得坐标、复杂验证码识别、随机字符串、cookie操作工具类
- Android | 教你如何在安卓上实现二代身份证识别,一键实名认证
- SwiftUI 语音合成与语言识别教程之 06 语音合成支持多少种语言 AVSpeechSynthesisVoice是什么
- SwiftUI 语音合成与语言识别教程之 05 语音合成 AVSpeechUtterance是什么
- SwiftUI 语音合成与语言识别教程之 02 请求使用语音识别的权限
- VisionKit教程之 01 识别图像中的文字
- 《敏捷可执行需求说明 Scrum提炼及实现技术》—— 2.6 识别出一系列高级别的特征
- android tesseract-ocr实例教程(包含中文识别)(附源码)
- VS Code识别编辑规范,ESlint规则,VS Code保存去掉自动加分号、逗号、双引号
- 【树莓派4B学习】十、使用zbar进行二维码识别
- Tensorflow高速入门2--实现手写数字识别
- C++反汇编第三讲,反汇编中识别继承关系,父类,子类,成员对象
- 识别条码时输入法自动切换问题—IMEMode