Halcon实用系列1-识别二维条码

在做项目时,之前使用的是某康的智能读码器,综合考虑成本,可通过相机拍照来读取图片的二维码,我这边用Halcon来实现。

Halcon代码如下:

*创建模型
create_data_code_2d_model('Data Matrix ECC 200', [], [], DataCodeHandle)

*设置条码极性
set_data_code_2d_param(DataCodeHandle, 'polarity', 'any')

*解码时长的设置,超时直接将条码丢弃
set_data_code_2d_param(DataCodeHandle, 'timeout', 200)

*开始二维码识别
read_image (Image, 'C:/Users/Administrator/Desktop/AirPods/Image_20220815110012088.bmp')

*开始计时
count_seconds(Seconds)

*解析二维码
find_data_code_2d(Image, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)

*结束计时
count_seconds(Seconds1)

*累计耗时
time:=Seconds1-Seconds


*判断解码结果是否有结果
tuple_length(DecodedDataStrings, Length)
if (Length>0)
    *//获取区域
    concat_obj(SymbolXLDs, SymbolXLDs, ObjectsConcat)

    dev_clear_window ()
    dev_display (Image)
    *绘制区域
    dev_display(ObjectsConcat)

    *显示二维码
    dev_disp_text(DecodedDataStrings, 'window', 'top', 'left', 'black', [], [])
endif

 显示效果:

可以看出几十毫秒可以解读条码,如要识别其他类型的二维码,可更改create_data_code_2d_model算子的参数。

那么如何将Halcon代码转化为C#可调用的方法?

1 先将Halcon代码导出,得到cs文件

 2 在VS中添加Halcon的引用,并将方法调整,我这里是结合OpencvSHarp

调整后的方法:

/// <summary>
        ///  识别 Data Matrix ECC 200
        /// </summary>
        /// <param name="ho_InputImage">图片对象</param>
        /// <returns></returns>
        private string ReadDataMatrix(HObject ho_InputImage)
        {
            string result = string.Empty;
            // Local iconic variables
            HObject ho_SymbolXLDs;
            HObject ho_ObjectsConcat = null;
            // Local control variables
            HTuple hv_DataCodeHandle = new HTuple(), hv_Seconds = new HTuple();
            HTuple hv_ResultHandles = new HTuple(), hv_DecodedDataStrings = new HTuple();
            HTuple hv_Seconds1 = new HTuple(), hv_time = new HTuple();
            HTuple hv_Length = new HTuple();
            // Initialize local and output iconic variables
            HOperatorSet.GenEmptyObj(out ho_SymbolXLDs);
            HOperatorSet.GenEmptyObj(out ho_ObjectsConcat);
            try
            {

                //创建模型
                hv_DataCodeHandle.Dispose();
                //QR Code
                HOperatorSet.CreateDataCode2dModel("QR Code", new HTuple(), new HTuple(), out hv_DataCodeHandle);
                //HOperatorSet.CreateDataCode2dModel("QR Code", new HTuple(), new HTuple(), out hv_DataCodeHandle);

                //设置条码极性
                HOperatorSet.SetDataCode2dParam(hv_DataCodeHandle, "polarity", "any");

                //解码时长的设置,超时直接将条码丢弃
                HOperatorSet.SetDataCode2dParam(hv_DataCodeHandle, "timeout", 300);

                //**********开始二维码识别****************

                //开始计时
                hv_Seconds.Dispose();
                HOperatorSet.CountSeconds(out hv_Seconds);

                //解析二维码
                ho_SymbolXLDs.Dispose(); hv_ResultHandles.Dispose(); hv_DecodedDataStrings.Dispose();
                HOperatorSet.FindDataCode2d(ho_InputImage, out ho_SymbolXLDs, hv_DataCodeHandle,
                    new HTuple(), new HTuple(), out hv_ResultHandles, out hv_DecodedDataStrings);

                //结束计时
                hv_Seconds1.Dispose();
                HOperatorSet.CountSeconds(out hv_Seconds1);

                //累计耗时
                hv_time.Dispose();
                using (HDevDisposeHelper dh = new HDevDisposeHelper())
                {
                    hv_time = hv_Seconds1 - hv_Seconds;
                }
                //MessageBox.Show(hv_time);
                //判断解码结果是否有结果
                hv_Length.Dispose();
                HOperatorSet.TupleLength(hv_DecodedDataStrings, out hv_Length);
                if ((int)(new HTuple(hv_Length.TupleGreater(0))) != 0)
                {
                    result = hv_DecodedDataStrings;
                }
            }
            catch (Exception ex)
            {
                return result;
            }
            finally
            {
                ho_InputImage.Dispose();
                ho_SymbolXLDs.Dispose();
                ho_ObjectsConcat.Dispose();

                hv_DataCodeHandle.Dispose();
                hv_Seconds.Dispose();
                hv_ResultHandles.Dispose();
                hv_DecodedDataStrings.Dispose();
                hv_Seconds1.Dispose();
                hv_time.Dispose();
                hv_Length.Dispose();
            }
            return result;
        }

此处还涉及Mat对象转换为HObject

/// <summary>
        ///  Mat转换为HObject
        /// </summary>
        /// <param name="mat"></param>
        /// <returns></returns>
        public HImage Mat2HObject(Mat mat)
        {
            HImage hImage = new HImage();
            try
            {
                if (mat.Type() == MatType.CV_8UC1)
                {
                    hImage.GenImage1("byte", mat.Width, mat.Height, mat.Data);
                }
                else
                {
                    hImage.GenImageInterleaved(mat.Data, "rgb", mat.Width, mat.Height, 0, "byte", mat.Width, mat.Height, 0, 0, -1, 0);
                }
            }
            catch (Exception)
            {


            }
            finally
            {
                mat.Dispose();
            }
            return hImage;
        }

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

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

相关文章

5G NR物理信道简介

文章目录 NR 上行物理信道PRACHPUCCHPUSCH NR 下行物理信道PBCHPDCCHPDSCH NR 上行物理信道 PRACH PRACH&#xff08;Physical Random Access Channel)物理随机接入信道&#xff0c;用于传导preamble 序列。PRACH 由循环前缀CP、前导序列和保护间隔三部分组成。 PUCCH PUCCH…

【AI大模型】深入Transformer架构:编码器部分的实现与解析(上)

目录 &#x1f354; 编码器介绍 &#x1f354; 掩码张量 2.1 掩码张量介绍 2.2 掩码张量的作用 2.3 生成掩码张量的代码分析 2.4 掩码张量的可视化 2.5 掩码张量总结 &#x1f354; 注意力机制 3.1 注意力计算规则的代码分析 3.2 带有mask的输入参数&#xff1a; 3.…

FOCShield v2.0.4原理图

1.FOCShield v2.0.4原理图,开源原文件用AD制作。用 AD09可以打开。 主要部分为 1.电机驱动芯片部分 2.电流采样部分

Windows 环境下安装 Anaconda 并适配到 PowerShell 的保姆级教程

Anaconda Anaconda 是一个流行的 Python 数据科学和机器学习平台&#xff0c;它包括了 Conda 包管理器、Python 以及数百个用于科学计算的库和工具。Anaconda 旨在简化包和环境管理&#xff0c;使得安装、更新和管理软件包变得容易&#xff0c;同时也能够轻松创建和切换不同的P…

大数据毕业设计选题推荐-民族服饰数据分析系统-Python数据可视化-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【Linux】命令管道

一、命名管道的介绍 之前的管道博客中介绍的是匿名管道&#xff0c;这个管道的应用的一个限制就是只能在具有公共祖先&#xff08;具有亲缘关系&#xff09;的进程间通信。 如果我们不想在不相关的进程之间交换数据&#xff0c;可以使用FIFO文件来做这项工作&#xff0c;他经常…

输入捕获模式测频率PWMI模式测频率占空比

前沿知识&#xff1a;TIM输入捕获-CSDN博客 输入捕获相关函数 // 初始化输入捕获单元 // ICInit是4个通道共用一个函数的&#xff0c;第二个结构体参数&#xff0c;可以用来配置具体是哪个通道。 void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);/…

【MAUI】CollectionView之 垂直网格

App主页或者导航页面中动态按钮的垂直网格布局 在 XAML 中,CollectionView 可以通过将其 ItemsLayout 属性设置为 VerticalGrid,在垂直网格中显示其项: <CollectionView ItemsSource="{Binding Monkeys}"ItemsLayout

TCP/UDP初识

TCP是面向连接的、可靠的、基于字节流的传输层协议。 面向连接&#xff1a;一定是一对一连接&#xff0c;不能像 UDP 协议可以一个主机同时向多个主机发送消息 可靠的&#xff1a;无论的网络链路中出现了怎样的链路变化&#xff0c;TCP 都可以保证一个报文一定能够到达接收端…

【YOLO学习】YOLOv2详解

文章目录 1. 概述2. Better2.1 Batch Normalization&#xff08;批归一化&#xff09;2.2 High Resolution Classifier&#xff08;高分辨率分类器&#xff09;2.3 Convolutional With Anchor Boxes&#xff08;带有Anchor Boxes的卷积&#xff09;2.4 Dimension Clusters&…

二分查找算法专题(1)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; 优选算法专题 目录 二分查找算法的介绍 704. 二分查找 34. 在排序数组中查找元素的第一个和 最后一个位置 35. 搜索插入位置 69. x的平…

力扣题解 983

大家好&#xff0c;欢迎来到无限大的判断&#xff0c;祝大家国庆假期愉快 题目描述&#xff08;中等&#xff09; 最低票价 在一个火车旅行很受欢迎的国度&#xff0c;你提前一年计划了一些火车旅行。在接下来的一年里&#xff0c;你要旅行的日子将以一个名为 days 的数组给出…

Charles(青花瓷)抓取https请求

文章目录 前言Charles&#xff08;青花瓷&#xff09;抓取https请求 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&…

kafka下载配置

下载安装 参开kafka社区 zookeeperkafka消息队列群集部署https://apache.csdn.net/66c958fb10164416336632c3.html 下载 kafka_2.12-3.2.0安装包快速下载地址分享 官网下载链接地址&#xff1a; 官网下载地址&#xff1a;https://kafka.apache.org/downloads 官网呢下载慢…

2024/10/2 408 20题

c d d b b a b c b b a d c d a c

java基础 day1

学习视频链接 人机交互的小故事 微软和乔布斯借鉴了施乐实现了如今的图形化界面 图形化界面对于用户来说&#xff0c;操作更加容易上手&#xff0c;但是也存在一些问题。使用图形化界面需要加载许多图片&#xff0c;所以消耗内存&#xff1b;此外运行的速度没有命令行快 Wi…

【华为HCIP实战课程一】OSPF相关基础介绍及基础配置,网络工程师必修

一、OSPF介绍 开放式最短路径优先协议OSPF(Open Shortest Path First),IPv4使用的OSPFv2,针对IPv6使用OSPFv3协议。 二、为什么需要OSPF OSPF出现之前,网络广泛使用RIP路由协议,RIP由于最大16跳数限制无法适应大型网络,RIP是基于距离矢量算法的路由协议,应用在大型网…

过去8年,编程语言的流行度发生了哪些变化?PHP下降,Objective-C已过时

前天有一个汇总9个不同排名数据的“地表最强”编程语言排行榜&#xff0c;为了更好地理解语言流行度的变化&#xff0c;作者将2016年的类似调查结果与2024年的数据进行了比较。 虽然2016年的调查只包含6个排名&#xff0c;但它仍然提供了宝贵的参考数据。 我们来看看详细的情…

JSON的C实现(上)

JSON的C实现&#xff08;上&#xff09; JSON的C实现&#xff08;上&#xff09;前言JSON简介JSON的C实现思路小结 JSON的C实现&#xff08;上&#xff09; 前言 JSON是众多项目中较为常见的数据交换格式&#xff0c;为不同项目、系统间的信息交换提供了一个规范化标准。JSON…

Unity八股总结

这里写目录标题 OnEnable、Awake、Start运行时的发生顺序&#xff1f;哪些可能在同一个对象周期中反复的发生&#xff1f;动态加载资源的方式?Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期&#xff0c;请列出系统自带的几个重要的方法。物理更新一般放在哪个系统函数里…