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

news2024/9/28 9:18:20

在做项目时,之前使用的是某康的智能读码器,综合考虑成本,可通过相机拍照来读取图片的二维码,我这边用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;
        }

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

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

相关文章

微信小程序map组件自定义气泡真机不显示

最近遇到一个需求需要使用uniapp的map自定义气泡 &#xff0c;做完之后发现在模拟器上好好的&#xff0c;ios真机不显示&#xff0c;安卓页数时好时不好的 一番查询发现是小程序的老问题了&#xff0c;网上的方法都试了也没能解决 后来看到有人说用nvue可以正常显示&#xff0c…

数据结构 ——— 顺序表oj题:编写函数,合并两个有序数组

目录 题目要求 代码实现 题目要求 nums1 和 nums2 是两个升序的整型数组&#xff0c;另外有两个整数 m 和 n 分别代表 nums1 和 nums2 中的元素个数 要求合并 nusm2 到nums1 中&#xff0c;使合并后的 nums1 同样按升序顺序排列 最终&#xff0c;合并后的数组不应由函数返…

基于Hive和Hadoop的招聘分析系统

本项目是一个基于大数据技术的招聘分析系统&#xff0c;旨在为用户提供全面的招聘信息和深入的职位市场分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 Spark 为核…

Text-to-SQL方法研究

1、面临的挑战 自然语言问题往往包含复杂的语言结构,如嵌套语句、倒装句和省略等,很难准确映射到SQL查询上。此外,自然语言本身就存在歧义,一个问题可能有多种解读。消除歧义需要深入的语言理解能力以及融入上下文和领域知识。 要生成正确的SQL查询,文本到SQL系统需要全面理解…

webpack 4 的 30 个步骤构建 react 开发环境

将 react 和 webpack4 进行结合&#xff0c;集 webpack 的优势于一身&#xff0c;从 0 开始构建一个强大的 react 开发环境。 其实很多人都有 一看就会&#xff0c;一做就废 的特点(当然也包括我在内)&#xff0c;这个时候&#xff0c;你需要制定一个略微详细的计划&#xff0…

Redis的基础认识与在ubuntu上的安装教程

来自Redis的自我介绍 我是Redis&#xff0c;一个中间件&#xff0c;职责是把数据存储在内存上&#xff0c;因此可以作为数据库、缓存、消息队列等场景使用。由于可以把数据存储在内存上&#xff0c;因此江湖人称快枪手 1.redis的功能特性 &#xff08;1&#xff09;数据在内存…

9.3 Linux_I/O_文件I/O相关函数

打开与关闭 1、打开文件 int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);返回值&#xff1a;成功返回文件描述符&#xff0c;失败返回EOF pathname&#xff1a;文件路径 flags&#xff1a;标志&#xff0c;其中O_RDO…

深入浅出CSS盒子模型

“批判他人总是想的太简单 剖析自己总是想的太困难” 文章目录 前言文章有误敬请斧正 不胜感恩&#xff01;什么是盒子模型&#xff1f;盒子模型的组成部分详解1. 内容区&#xff08;Content&#xff09;2. 内边距&#xff08;Padding&#xff09;3. 边框&#xff08;Border&am…

『功能项目』下载Mongodb【81】

下载网址&#xff1a;Download MongoDB Community Server | MongoDB 点击安装即可 选择Custom 此时安装已经完成 桌面会创建图标 检查是否配置好MongoDB 输入cmd命令行 Windows键 R 打开命令行 输入cmd 复制安装路径 复制data路径 如果输出一大串代码即配置mongdb成功

Mysql高级篇(中)——锁机制

锁机制 一、概述二、分类1、读锁2、写锁★、FOR SHARE / FOR UPDATE&#xff08;1&#xff09;NOWAIT&#xff08;2&#xff09;SKIP LOCKED&#xff08;3&#xff09;NOWAIT 和 SKIP LOCKED 的比较 ★、 脏写3、表级锁之 S锁 / X锁&#xff08;1&#xff09;总结&#xff08;2…

免费视频无损压缩工具+预览视频生成工具

视频无损压缩工具 功能与作用 &#xff1a;视频无损压缩工具是一种能够减少视频文件大小&#xff0c;但同时保持视频质量的工具。它通过先进的编码技术和算法&#xff0c;有效降低视频文件的存储空间&#xff0c;同时保证视频的清晰度和观感。这对于需要分享或存储大量视频内容…

ZLMediaKit快速上手【保姆级简单快速版】

一、前言 1、ZLMediaKit使用场景 最近在写一个摄像头检测的项目&#xff0c;其中需要做拉流测试&#xff0c;但是摄像头数量不够用&#xff0c;如果直接重复拉流可能会出现问题&#xff0c;使用ZLMediaKit&#xff08;一个基于C11的高性能运营级流媒体服务框架&#xff09;可…

对抗攻击方法详解:梯度攻击、转移攻击与模型集成攻击

对抗攻击方法详解&#xff1a;梯度攻击、转移攻击与模型集成攻击 近年来&#xff0c;随着深度学习模型在各个领域取得惊人突破&#xff0c;对抗攻击&#xff08;Adversarial Attack&#xff09; 逐渐成为研究热点。对抗攻击旨在通过在输入数据上施加精心设计的微小扰动&#x…

Doris安装部署指南

Doris安装部署指南 一、环境准备二、下载并解压安装包三、配置FE和BEFE配置BE配置四、验证集群状态五、集群扩容与缩容六、总结Apache Doris(原百度Palo)是一款基于MPP架构的高性能、实时的分析型数据库。它支持标准SQL,高度兼容MySQL协议,能够运行在绝大多数主流的商用服务…

第50篇 汇编语言实现中断<六>

Q&#xff1a;怎样设计汇编语言程序使用定时器中断实现实时时钟&#xff1f; A&#xff1a;此前我们曾使用轮询定时器I/O的方式实现实时时钟&#xff0c;而在本实验中将采用定时器中断的方式。新增的interval_timer.s间隔定时器的中断服务程序中增加了TIME变量&#xff0c;还更…

<<迷雾>> 第 1 章 了解计算机, 要从电开始 示例电路

简单灯泡电路 info::操作说明 灯的亮起有一定的延时, 需要过一会才逐渐亮起来 另: 可通过 “菜单–选项–显示电流” 控制是否显示电流 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/cyjsjdmw-examples/assets/circuit/cyjsjdm…

Unity XR 环境检测

需求&#xff1a; 检测环境是XR还是手机 代码&#xff1a; using UnityEngine.XR;public class EnvmentUtility {/// <summary>/// 是否是XR环境/// </summary>/// <returns>如果是XR&#xff0c;返回true&#xff0c;否则false</returns>public sta…

Gin框架简易搭建(3)--Grom与数据库

写在前面 项目地址 个人认为GORM 指南这个网站是相比较之下最为清晰的框架介绍 但是它在环境搭建阶段对于初学者而言不是很友好&#xff0c;尤其是使用mysql指令稍有不同&#xff0c;以及更新的方法和依赖问题都是很让人头疼的&#xff0c;而且这些报错并非逻辑上的&#xf…

linux 下的静态库与动态库

目录 一、介绍 1、静态库 2、动态库 二、操作 1、静态库 2、动态库 3、使用库文件 &#xff08;1&#xff09;方法一 &#xff08;2&#xff09;方法二 &#xff08;3&#xff09;方法三 一、介绍 1、静态库 静态链接库实现链接操作的方式很简单&#xff0c;即程序文…

vue启动报错

vue执行npm run dev报错如下 Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:69:19)at Object.createHash (node:crypto:133:10)at module.exports (F:\ray\taisheng-erp-frontend-master\node_modules\webpack\lib\ut…