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')
elseset_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 1read_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+'\\='+DecodedDataStringsdisp_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 1read_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')endifget_bar_code_result (BarCodeHandle, 'all', 'decoded_types', BarCodeResults)dev_display (Image)dev_display (EmptyObject)mesg:=BarCodeResults+'\\='+DecodedDataStringsdisp_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 1read_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+'\\'+DecodedDataStringsarea_center (SymbolRegions, Area, Row, Column)disp_message (WindowHandle, msg, 'image', Row, Column, 'black', 'true')if(i<count)disp_continue_message (WindowHandle, 'black', 'true')endifstop ()
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 30find_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)) * 80endCol := centerCol + cos(rad(angle)) * 80gen_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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue-cli3+vue2+elementUI+avue升级到vite+vue3+elementPlus+avue总结

上一个新公司接手了一个vue-cli3vue2vue-router3.0elementUI2.15avue2.6的后台管理项目&#xff0c;因为vue2在2023年底已经不更新维护了&#xff0c;elementUI也只支持到vue2&#xff0c;然后总结了一下vue3的优势&#xff0c;最后批准升级成为了vitevue3vue-router4.5element…

SpringBoot实战(三十五)微服务集成OAuth2.0(UAA)

目录 一、知识回顾1.1 什么是 OAuth2 协议&#xff1f;1.2 OAuth2 的4个角色1.3 OAuth2 的3种令牌1.4 OAuth2 的5种认证方式1.5 OAuth2 内置接口地址 二、UAA介绍2.1 概述2.2 UAA的主要功能2.3 UAA 的应用场景 三、微服务集成3.1 集成示例介绍3.2 集成测试 一、知识回顾 在进行…

红果短剧安卓+IOS双端源码,专业短剧开发公司

给大家拆解一下红果短剧/河马短剧&#xff0c;这种看光解锁视频&#xff0c;可以挣金币的短剧APP。给大家分享一个相似的短剧APP源码&#xff0c;这个系统已接入穿山甲广告、百度广告、快手广告、腾讯广告等&#xff0c;类似红果短剧的玩法&#xff0c;可以看剧赚钱&#xff0c…

从0开始的操作系统手搓教程23:构建输入子系统——实现键盘驱动1——热身驱动

目录 所以&#xff0c;键盘是如何工作的 说一说我们的8042 输出缓冲区寄存器 状态寄存器 控制寄存器 动手&#xff01; 注册中断 简单整个键盘驱动 Reference ScanCode Table 我们下一步就是准备进一步完善我们系统的交互性。基于这个&#xff0c;我们想到的第一个可以…

百度SEO关键词布局从堆砌到场景化的转型指南

百度SEO关键词布局&#xff1a;从“堆砌”到“场景化”的转型指南 引言 在搜索引擎优化&#xff08;SEO&#xff09;领域&#xff0c;关键词布局一直是核心策略之一。然而&#xff0c;随着搜索引擎算法的不断升级和用户需求的多样化&#xff0c;传统的“关键词堆砌”策略已经…

Python ❀ Unix时间戳转日期或日期转时间戳工具分享

设计一款Unix时间戳和日期转换工具&#xff0c;其代码如下&#xff1a; from datetime import datetimeclass Change_Date_Time(object):def __init__(self, date_strNone, date_numNone):self.date_str date_strself.date_num date_num# 转时间戳def datetime2timestamp(s…

【目标检测】【NeuralPS 2023】Gold-YOLO:通过收集与分发机制实现的高效目标检测器

Gold-YOLO&#xff1a; Efficient Object Detector via Gather-and-Distribute Mechanism Gold-YOLO&#xff1a;通过收集与分发机制实现的高效目标检测器 0.论文摘要 在过去的几年中&#xff0c;YOLO系列模型已成为实时目标检测领域的领先方法。许多研究通过修改架构、增强数…

π0源码解析——一个模型控制7种机械臂:对开源VLA sota之π0源码的全面分析,含我司的部分落地实践

前言 ChatGPT出来后的两年多&#xff0c;也是我疯狂写博的两年多(年初deepseek更引爆了下)&#xff0c;比如从创业起步时的15年到后来22年之间 每年2-6篇的&#xff0c;干到了23年30篇、24年65篇、25年前两月18篇&#xff0c;成了我在大模型和具身的原始技术积累 如今一转眼…

K8s 1.27.1 实战系列(六)Pod

一、Pod介绍 1、Pod 的定义与核心设计 Pod 是 Kubernetes 的最小调度单元,由一个或多个容器组成,这些容器共享网络、存储、进程命名空间等资源,形成紧密协作的应用单元。Pod 的设计灵感来源于“豌豆荚”模型,容器如同豆子,共享同一环境但保持隔离性。其核心设计目标包括…

企业日常工作中常用的 Linux 操作系统命令整理

Linux 操作系统命令整理 在企业级运维、开发和日常工作中&#xff0c;Linux 命令是绕不开的核心技能。不论是日志排查、进程管理&#xff0c;还是高效运维优化&#xff0c;掌握这些命令都能让你事半功倍&#xff01;本篇文章整理了自己在日常工作中积累最常用的 Linux 命令&am…

实现NTLM relay攻击工具的Python代码示例

以下是一个实现NTLM relay攻击工具的Python代码示例&#xff0c;该工具可以完成自动扫描IP、配置相关协议、获取hash、自动化设置和执行攻击步骤等功能。 代码思路 IP扫描&#xff1a;使用scapy库进行IP扫描&#xff0c;找出活跃的IP地址。Responder配置&#xff1a;自动配置…

Kotlin和Java区别

哈哈哈&#xff0c;前段时间&#xff0c;面试的时候&#xff0c;突然问到我Kotlin和Java的区别&#xff0c;一下子把我问懵逼了&#xff0c;确实没遇到问这个的&#xff0c;想了下&#xff0c;说了下Kotlin的编译时空检查机制&#xff0c;代码更简洁&#xff0c;很多封装好的AP…

【大模型】大模型分类

大模型&#xff08;Large Models&#xff09;通常指参数量巨大、计算能力强大的机器学习模型&#xff0c;尤其在自然语言处理&#xff08;NLP&#xff09;、计算机视觉&#xff08;CV&#xff09;等领域表现突出。以下是大模型的常见分类方式&#xff1a; 1. 按应用领域分类 …

centos中使用svn整理

centos中使用svn整理 1. 安装 SVN 客户端2. 常见 SVN 用法及示例2.1 创建 SVN 仓库2.2 检出&#xff08;Checkout&#xff09;项目2.3 添加文件到版本控制2.4 提交&#xff08;Commit&#xff09;更改2.5 更新&#xff08;Update&#xff09;本地工作副本2.6 查看文件状态2.7 查…

游戏元宇宙崛起:AI代理IP驱动虚拟世界“无限可能”​

在科技飞速发展的当下&#xff0c;游戏元宇宙正以一种前所未有的姿态崛起&#xff0c;它犹如一颗璀璨的新星&#xff0c;吸引着无数人的目光。而AI代理IP&#xff0c;正成为驱动这个虚拟世界展现“无限可能”的关键力量。 「快代理&#xff5c;11年专注企业级代理IP云服务 —…

基于Servlet + JSP 的物业管理系统

Javaweb物业管理系统&#xff5c;Java&#xff5c;Servlet | JavaWeb&#xff5c;web网站&#xff5c; 分管理员登录&#xff0c;用户登录。 一、内容 项目源码 配套文档 环境部署教程 项目运行教程 二、技术介绍 技术应用&#xff1a; Servlet JavaBean CSS JSP 开发环…

Billing的patient balance的2个例子

Billing的patient balance的2个例子 第一个例子 下面是 0852医院的00005641的计算&#xff1a; 主保险 Allowable: 78.81 Applied:61.79 CoInsurance:17.02 第二保险 Allowable: 15.76 Applied:15.76 我们在计算时是用主保险的Allowable: 78.81&#xff…

哪些培训课程适合学习PostgreSQL中级认证知识?

PostgreSQL 中级工程师 PGCP 认证培训&#xff1a;由重庆思 庄经验丰富的讲师郑全老师授课。课程内容系统全面&#xff0c;涵盖了 PostgreSQL 数据库从基础到高级的知识&#xff0c;包括数据库的安装、建库、用户与角色管理等基础内容&#xff0c;也有性能调优、索引原理与应用…

计算机二级MS之PPT

声明&#xff1a;跟着大猫和小黑学习随便记下一些笔记供大家参考&#xff0c;二级考试之前将持续更新&#xff0c;希望大家二级都能轻轻松松过啦&#xff0c;过了二级的大神也可以在评论区留言给点建议&#xff0c;感谢大家&#xff01;&#xff01; 文章目录 考题难点1cm25px…

第5章 使用OSSEC进行监控(网络安全防御实战--蓝军武器库)

网络安全防御实战--蓝军武器库是2020年出版的&#xff0c;已经过去3年时间了&#xff0c;最近利用闲暇时间&#xff0c;抓紧吸收&#xff0c;总的来说&#xff0c;第5章开始进入主机安全&#xff08;HIDS&#xff09;领域了&#xff0c;2022年的时候有幸做过终端安全一段时间&a…