Halcon 算子 一维码检测识别、项目案例

首先我们要明白码的识别思路

  • 把窗口全部关闭
  • 读取新的图片
  • 图像预处理
  • 创建条码模型
  • 设置模型参数
  • 搜索模型
  • 获取条码结果
  • 显示条码结果

图像预处理和条码增强

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

 基本算子:

create_bar_code_model  创建条码模型

create_bar_code_model(GenParamNames,GenParamValues,BarCodeHandle)

  • GenParamNames:参数名
  • GenParamValues:参数值
  • BarCodeHandle:条码句柄

 set_bar_code_param  设置条码参数

set_bar_code_param(BarCodeHandle,GenParamName,GenParamValue)

  • BarCodeHandle:条码句柄
  • GenParamNames:参数名
  • GenParamValue:条码参数
'element_size_min'条码的最小尺寸,指条码宽度和间距,大码应设大一点,减少处理时间
'element_size_max'条码的最大尺寸,不能过小,也不能过大
'check_char'是否验证校验位,'absent'不检查校验和'present'检查校验
'persistence'设置位1,则保留中间结果,评估条码印刷质量时会用到
'num_scanlines'解码时所用扫码线的最大数目,设置为0表示自动确定,一般设置为2~30
'start_stop_tolerance'容许误差值,可设置为'low'或者'high',设置为'high'可能造成误判
'orientation'、'orientation_tol'分别指条码的方向和方向容差,设置准确可大大提高解码效率
'elemnet_height_min'条码的最小高度,默认设置-1白哦是子哦对那个推测条码高度,该参数对速度影响大
'stop_after_result_num'设置要解码的个数,0表示全部找出,设置为2表示找到2个就不找了

 find_bar_code 查找条码

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

  • Image:输入图像
  • SymbolRegions:检测到的条形码区域
  • BarCodeHandle:条形码区域
  • CodeType:条形码类型
  • DecodedDataStrings:识别结果

get_bar_code_result  显示条码结果

 get_bar_code_result(BarCodeHandle,CandidateHandle,ResultName,BarCodeResults)

  • BarCodeHandle:条码模型处理(条码句柄)
  • CandidateHandle:候选句柄
  • ResultName:结果名
  • BarCodeResults:条形码的结果

 一维码示例

1.检测单个条形码

dev_close_window ()
dev_update_off ()
dev_set_draw ('margin')
dev_set_line_width (3)
read_image (Image, 'F:/Halcon/‫Image/1一维码barcor/barcode_1.bmp')
* 创建条码模型
create_bar_code_model ([], [], BarCodeHandle)
* 设置条码参数
set_bar_code_param (BarCodeHandle, 'barcode_width_min', 280)
set_bar_code_param (BarCodeHandle, 'barcode_height_min', 80)
* 检测读取一维码
find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)
* 获取条码结果
get_bar_code_result (BarCodeHandle, 'all', 'decoded_types', BarCodeResults)
*显示
dev_get_window (WindowHandle)
msg:=BarCodeResults+'条码编号'+DecodedDataStrings
area_center (SymbolRegions, Area, Row, Column)
dev_display (Image)
dev_display (SymbolRegions)
disp_message (WindowHandle, msg, 'image', Row, Column, 'black', 'true')

 


2.检测多个条形码

dev_update_off ()
dev_close_window ()
dev_get_window (WindowHandle)
query_font (WindowHandle, Font)
tuple_find (Font, '楷体', Indices)
if(Indices!=-1)
    set_display_font (WindowHandle, 16, '楷体', 'true', 'false')
else
    set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
endif
dev_set_draw ('margin')
dev_set_line_width (3)
dev_set_color ('green')
create_bar_code_model ([], [], BarCodeHandle)
minWidth:=280
minHeight:=60
set_bar_code_param (BarCodeHandle, 'barcode_height_min', minHeight)
set_bar_code_param (BarCodeHandle, 'barcode_width_min', minWidth)
list_files ('F:/Halcon/‫Image/1一维码barcor', 'files', Files)
tuple_regexp_select (Files, '.bmp', Selection)
num:=|Selection|-1
for i:=0 to num by 1
    read_image (Image,Selection[i])
    find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)
    get_bar_code_result (BarCodeHandle, 'all', 'decoded_types', BarCodeResults)
    dev_display (Image)
    dev_display (SymbolRegions)
    msg:=BarCodeHandle+'\\='+DecodedDataStrings
    disp_message (WindowHandle, msg, BarCodeResults, 12, 12, 'black', 'true')
    stop ()
endfor

 3.检测多个,和检测不到的

dev_update_off ()
dev_close_window ()
dev_get_window (WindowHandle)
query_font (WindowHandle, Font)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_color ('green')
dev_set_line_width (3)
create_bar_code_model ([], [], BarCodeHandle)
gen_empty_obj (EmptyObject)
list_files ('F:/Halcon/‫Image/2一维码', 'files', Files)
tuple_regexp_select (Files, '.bmp', Selection)
num:=|Selection|-1
for i:=0 to num by 1
    read_image (Image, Selection[i])
    find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)
    test_equal_obj (EmptyObject, SymbolRegions, IsEqual)
    if(IsEqual!=0)
        disp_message (WindowHandle, '没有识别到一维码', 'image', 12, 12, 'black', 'true')
    endif
    get_bar_code_result (BarCodeHandle, 'all', 'decoded_types', BarCodeResults)
    dev_display (Image)
    dev_display (EmptyObject)
    mesg:=BarCodeResults+'\\='+DecodedDataStrings
    disp_message (WindowHandle, mesg, 'image', 12, 12, 'black', 'true')
    stop ()
endfor

4. 查询多个不同种类

create_bar_code_model (['stop_after_result_num'], [1], BarCodeHandle)
dev_clear_window ()
dev_update_off ()
dev_get_window (WindowHandle)
query_font (WindowHandle, Font)
set_display_font (WindowHandle, 16, Font[0], 'true', 'false')
dev_set_draw ('margin')
dev_set_color ('green')
dev_set_line_width (3)
list_files ('F:/Halcon/‫Image/N维码/Ean13 一维码读取/ean13', 'files', Files)
tuple_regexp_select (Files, '(ean13)[0-9]{1,7}\\.(png)', Selection)
count:=|Selection|-1
for i:=0 to count by 1
    read_image (Image, Selection[i])
    find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)
    get_bar_code_result (BarCodeHandle, 'all', 'decoded_types', BarCodeResults)
    dev_display (Image)
    dev_display (SymbolRegions)
    msg:=BarCodeResults+'\\'+DecodedDataStrings
    area_center (SymbolRegions, Area, Row, Column)
    disp_message (WindowHandle, msg, 'image', Row, Column, 'black', 'true')
    if(i<count)
        disp_continue_message (WindowHandle, 'black', 'true')
    endif
    stop ()
endfor
dev_disp_text ('已经是最后一张了', 'window', 'bottom', 'right', 'red', [], [])
clear_bar_code_model (BarCodeHandle)

5.旋转查询

方法1: 

read_image (Image, 'barcode/ean13/ean1305')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
dev_set_color ('green')
dev_set_draw ('margin')
dev_set_line_width (3)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
create_bar_code_model ('element_size_min', 1.5, BarCodeHandle)
for i:=0 to 360 by 30
    * 旋转图像
    rotate_image (Image, ImageRotate, i, 'constant')
    dev_display (ImageRotate)
    get_image_size (ImageRotate, Width, Height)
    *改变当前激活窗口的大小和位置
    dev_set_window_extents (0, 0, Width, Height)
    find_bar_code (ImageRotate, SymbolRegions, BarCodeHandle, 'EAN-13', DecodedDataStrings)
    get_bar_code_result (BarCodeHandle, 'all', 'orientation', Orientation)
    area_center (SymbolRegions, Area, Row, Col)
    * 创建一个十字箭头的轮廓
    gen_arrow_contour_xld (Arrow, Row + sin(rad(Orientation)) * 70, Col - cos(rad(Orientation)) * 70, Row - sin(rad(Orientation)) * 70, Col + cos(rad(Orientation)) * 70, 25, 25)
    dev_display (ImageRotate)
    dev_display (SymbolRegions)
    dev_set_color ('green')
    dev_display (Arrow)
    disp_message (WindowHandle, DecodedDataStrings, 'window', 12, 12, 'black', 'true')
    stop ()
endfor
clear_bar_code_model (BarCodeHandle)

方法2:

 

**** 主要内容:如何获取图像与平行线的夹角
**** 基于夹角 生成带有方向的箭头
dev_update_off ()
read_image (Image, 'barcode/ean13/ean1305')
dev_set_draw ('margin')
dev_set_color ('green')
dev_set_line_width (3)

create_bar_code_model (['element_size_min'], [1.5], BarCodeHandle)
for rot :=0 to 360 by 30
    
    find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)
    
    get_bar_code_result (BarCodeHandle, 'all', 'orientation', angle)
    area_center (SymbolRegions, Area, cehnterRow, centerCol)
    gen_arrow_contour_xld (Arrow1, cehnterRow, centerCol, cehnterRow, centerCol, 10, 1)
    
    * 难题:怎么基于 区域的中线点,与 图像与水平面的弧度,求xld的起点和终点
    * 以区域中心坐标为基准点,该点是,箭头上的点
    * 以为该点位置,将箭头分为2个部分:假设第一部分,长度为100 第二部长度为80
    * 已:匹配模板与水平面的夹角  rad(angle)
    * 求:起点 行列坐标 与 终点行列坐标 、 下面就是计算公式。
    startRow:= cehnterRow +sin(rad(angle)) * 100 
    startCol := centerCol - cos(rad(angle)) * 100 
    endRow := cehnterRow - sin(rad(angle)) * 80
    endCol := centerCol + cos(rad(angle)) * 80
    
    gen_arrow_contour_xld (Arrow, startRow, startCol, endRow, endCol, 20, 20)
    * 显示结果
    dev_display (Image)
    dev_display (SymbolRegions)
    dev_display (Arrow)

    rotate_image (Image, Image, rot, 'constant')
    
    
    stop()

endfor

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/983140.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32使用有源蜂鸣器

1.1 介绍&#xff1a; 有源蜂鸣器&#xff1a;内部自带振荡源&#xff0c;将正负极接上直流电压即可持续发声&#xff0c;频率固定 无源蜂鸣器&#xff1a;内部不带振荡源&#xff0c;需要控制器提供振荡脉冲才可发声&#xff0c;调整提供振荡脉冲的频率&#xff0c;可发出不同…

人工智能之数学基础:对线性代数中逆矩阵的思考?

本文重点 逆矩阵是线性代数中的一个重要概念,它在线性方程组、矩阵方程、动态系统、密码学、经济学和金融学以及计算机图形学等领域都有广泛的应用。通过了解逆矩阵的定义、性质、计算方法和应用,我们可以更好地理解和应用线性代数知识,解决各种实际问题。 关于逆矩阵的思…

数据仓库架构全解析:如何构建高效、有序的数据分层?

1.数仓架构规范 &#xff08;一&#xff09;分层架构规范 1.明确分层原则&#xff1a;通常遵循自下而上的 ODS&#xff08;操作数据存储层&#xff09;、DWD&#xff08;明细数据层&#xff09;、DWS&#xff08;汇总数据层&#xff09;、ADS&#xff08;应用数据层&#xff…

windows:curl: (60) schannel: SEC_E_UNTRUSTED_ROOT (0x80090325)

目录 1. git update-git-for-windows 报错2. 解决方案2.1. 更新 CA 证书库2.2. 使用 SSH 连接&#xff08;推荐&#xff09;2.3 禁用 SSL 验证&#xff08;不推荐&#xff09; 1. git update-git-for-windows 报错 LenovoLAPTOP-EQKBL89E MINGW64 /d/YHProjects/omni-channel-…

为何吹订单?因为特斯拉的销量已遥遥领先,掩耳盗铃之举!

从去年以来&#xff0c;多家新造车企业都经常拿大定、小定的数据来说事&#xff0c;而不是如之前说销量领先&#xff0c;原因就在于他们曾对标的特斯拉在销量方面已远远超越&#xff0c;在销量方面无法与特斯拉比拼&#xff0c;就只好用订单 国内媒体一片宣传特斯拉在中国的销量…

【智能体架构:Agent】LangChain智能体类型ReAct、Self-ASK的区别

1. 什么是智能体 将大语言模型作为一个推理引擎。给定一个任务&#xff0c; 智能体自动生成完成任务所需步骤&#xff0c; 执行相应动作&#xff08;例如选择并调用工具&#xff09;&#xff0c; 直到任务完成。 2. 先定义工具&#xff1a;Tools 可以是一个函数或三方 API也…

MC9S12单片机的内存映射机制

地址空间 这是个16位的单片机。CPU的寻址空间最大为2^1664K。 这个64K是包括外设、RAM、EEPROM、和FLASH的。现在程序越来越大&#xff0c;64K的空间肯定是不够用的。因此&#xff0c;需要扩展。 扩展方法就是&#xff1a;分页。 把原来的64K空间&#xff0c;划分一块出来&a…

C++ primier plus 函数探幽第二部分

系列文章目录 C primer plus 第一节 步入C-CSDN博客 C primer plus 第二节 hello world刨析-CSDN博客 C primer plus 第三节 数据处理-CSDN博客 C primer plus 第四节 复合类型-CSDN博客 C primer plus 第五节 循环-CSDN博客 C primier plus 第七节 函数探幽第一部分-CSDN博客 …

单细胞的一组基因或富集分数的高低表达分组差异分析作图教程

单细胞的一组基因或富集分数的高低表达分组计算差异分析和可视化教程 单细胞的一组基因或富集分数的高低表达分组计算 软件分析界面 运行结果 会得到一组基因或通路等富集分数的高低分组的seurat对象rds文件和meta.data文件 包含了指定的一组基因或富集分数的各自的高低表达分…

Qt之QGraphicsView图像操作

QGraphicsView图像操作:旋转、放大、缩小、移动、图层切换 1 摘要 GraphicsView框架结构主要包含三个主要的类QGraphicsScene(场景)、QGraphicsView(视图)、QGraphicsItem(图元)。QGraphicsScene本身不可见,是一个存储图元的容器,必须通过与之相连的QGraphicsView视图来显…

cSpell无法识别词语消除报错

VSCode extension: cSpell 使用VSCode时&#xff0c;cSpell可以帮助我们检查拼写错误。但是经常有一些单词会被误报&#xff0c;可以采取以下的方法解决。 1. 手动添加&#xff1a;将鼠标光标放在无法识别的词语上&#xff0c;左键点击Quick Fix&#xff0c;再次选择将未知词…

python的内置函数 - round()

知识点1 - round() 定义/功能 round() 是一个用于四舍五入的内置函数。它可以将一个浮点数或整数四舍五入到指定的小数位数。 知识点2 - round() 语法 round(number, ndigitsNone) number&#xff1a;需要四舍五入的数值&#xff08;可以是整数或浮点数&#xff09;。 nd…

SAP服务器进程预警通知

在财务月结&#xff0c;HR薪资核算等系统用户集中使用高峰时期。通过判断判断当前系统可用的并行对话框进程数&#xff0c;用户使用过多给出提示&#xff0c;服务器进程预警通知。 1. 根据配置的进程最大可使用率80%&#xff0c;根据进程数判断&#xff1a;当进程可用数少于20%…

无人机推流/RTMP视频推拉流:EasyDSS无法卸载软件的原因及解决方法

视频推拉流/直播点播EasyDSS平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务&#xff0c;在应用场景中可实现视频直播、点播、转码、管理、录像、检索、时移回看等。此外&#xff0c;平台还支持用户自行上传视频文件&#xff0c;也可将上传的点播…

【工具】ProToDeviseR一个自动化的蛋白质拓扑方案生成器

文章目录 介绍代码案例参考 介绍 氨基酸序列表征是几乎任何蛋白质分析的基本组成部分&#xff0c;创建简洁清晰的蛋白质拓扑结构在蛋白质组学研究中具有重要意义。尽管存在许多数据库和预测服务器&#xff0c;但是将来自各种资源&#xff08;有时是竞争资源&#xff09;的数据…

数据结构基础(一)

文章目录 1 数据结构基础1.1 什么是程序&#xff1f;1.2 数据、数据元素、数据项、数据对象1.3 基本的逻辑结构 2 算法效率2.1 时间复杂度2.1.1 循环执行次数2.1.2 大O(n)表示法 2.2 空间复杂度 1 数据结构基础 1.1 什么是程序&#xff1f; ​ 程序 数据结构 &#xff0b; 算…

taosd 写入与查询场景下压缩解压及加密解密的 CPU 占用分析

在当今大数据时代&#xff0c;时序数据库的应用越来越广泛&#xff0c;尤其是在物联网、工业监控、金融分析等领域。TDengine 作为一款高性能的时序数据库&#xff0c;凭借独特的存储架构和高效的压缩算法&#xff0c;在存储和查询效率上表现出色。然而&#xff0c;随着数据规模…

RangeError: Maximum call stack size exceeded

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

《白帽子讲 Web 安全》之文件操作安全

目录 引言 &#xff08;一&#xff09;文件上传与下载漏洞概述 1.文件上传的常见安全隐患 1.1前端校验的脆弱性与服务端脚本执行危机在文件上传流程中&#xff0c;部分开发者可能会在前端使用 JavaScript 代码对文件后缀名进行简单校验&#xff0c;试图以此阻止非法文件上传…

[FE] React 初窥门径(五):React 组件的加载过程(commit 阶段)

1. 回顾 前一篇文章我们看到&#xff0c;ReactDOM.render 总共包含这些步骤&#xff0c; 然后介绍了 performSyncWorkOnRoot 做的事情&#xff0c;它主要做了两件事&#xff0c; renderRootSync 可称之为 render 阶段&#xff1a;创建了一颗 Fiber Tree&#xff08;包含 html …