当前位置: 首页 > java >正文

【HALCON】 HALCON 教程:正确使用 `get_dict_tuple` 获取字典内容

📘 HALCON 教程:正确使用 get_dict_tuple 获取字典内容

在使用 HALCON 的过程中,get_dict_tuple 是一个非常常用的算子,它用于从字典中读取一个键对应的 元组值(HTuple)。但如果使用不当,很容易遇到错误,比如:

HALCON error #1302: Wrong value of control parameter 2 in operator get_dict_tuple

本文将详细介绍 get_dict_tuple 的正确用法,并结合实际错误案例,分析如何避免此类问题。


🧩 1. get_dict_tuple 是什么?

在 HALCON 中,字典(dict)是一种用于存储键值对的数据结构。get_dict_tuple 的作用是:

从字典中取出某个 key 对应的 tuple 值(如字符串、数字、数组等)

🧪 基本语法:
HOperatorSet.GetDictTuple(dictHandle, key, out value);
参数名类型说明
dictHandleHTuple有效的字典句柄
keyHTuple 或字符串要读取的键名(必须为已存在的 key)
valueout HTuple输出的结果元组

🔍 2. 示例:正确读取键值对

以下是一个完整示例:

// 创建一个字典并插入键值对
HTuple dict;
HOperatorSet.CreateDict(out dict);
HOperatorSet.SetDictTuple(dict, "DList", new HTuple("A", "B", "C"));// 正确读取
HTuple dList;
HOperatorSet.GetDictTuple(dict, "DList", out dList);Console.WriteLine(dList.ToString());  // 输出:A B C

⚠️ 3. 常见错误:HALCON error #1302

如果运行中遇到如下异常:

HALCON error #1302: Wrong value of control parameter 2 in operator get_dict_tuple

这里我想重点说下:
说明 get_dict_tuple 的第二个控制参数参数 key 错误
HOperatorSet.GetDictTuple(dict, “DList”, out dList);
前两个就是控制参数,最后一个输出参数。
这里说的value of control parameter 2 就是 “DList”(halcon中数参数是从1开始数,而不是0,这里注意!)
为啥 "DList"报错呢,其实是我再某个函数分支直接返回了,还没来得及set_dict_tuple。所以找不到 “DList” 这个key!!!!

总的来说具体原因可能还有以下几种:


🧨 4. 错误分析:为什么会出错?

❌ 错误原因一:key 不存在或拼写错误

get_dict_tuple 要求 key 必须已存在且为元组类型的值。如果 DList 不存在,或字典中保存的不是元组(如图像、句柄等),都会报错。

✔️ 建议加上存在性判断:

HTuple keys;
HOperatorSet.GetDictParam(dict, "keys", out keys);if (keys.TupleFind("DList") >= 0)
{HOperatorSet.GetDictTuple(dict, "DList", out dList);
}
else
{Console.WriteLine("Key 'DList' does not exist in the dictionary.");
}

❌ 错误原因二:字典未初始化或为默认值

如果 dictHandle 是一个默认未初始化的 HTuple(),也会出错。

✔️ 建议加判断:

if (!dict.IsInitialized())
{Console.WriteLine("字典尚未初始化!");return;
}

❌ 错误原因三:Key 存在,但类型不匹配

例如你存的是图像、区域、句柄,而不是元组类型,使用 get_dict_tuple 也会报错。此时应使用:

  • get_dict_object:获取非元组的对象
  • get_dict_param:获取字典属性(如所有键、类型等)

🛠️ 5. 推荐的安全使用方式

整合安全判断逻辑的推荐代码如下:

if (ResultDict.IsInitialized())
{HTuple keys;HOperatorSet.GetDictParam(ResultDict, "keys", out keys);if (keys.TupleFind("DList") >= 0){HOperatorSet.GetDictTuple(ResultDict, "DList", out DList);}else{DList = new HTuple(); // 默认值Console.WriteLine("⚠️ 字典中未找到键 DList");}
}
else
{Console.WriteLine("❌ ResultDict 未初始化!");
}

🧾 6. 总结

问题建议处理方式
键不存在使用 GetDictParam 检查键是否存在
字典未初始化使用 IsInitialized() 检查字典有效性
值类型不匹配使用 get_dict_object 或注意 SetDictTuple 类型

📝 7. 参考链接

  • 🔗 get_dict_tuple 官方文档(MVTec HALCON 18.11)
  • 📚 HALCON 字典相关 API 索引

如果你在实际使用中也遇到了类似问题,欢迎留言交流或分享你是如何解决的,希望这篇文章对你有所帮助!

📌 欢迎收藏 + 关注,后续将分享更多 HALCON 调试与 C# 集成开发技巧!

ps:我发现一个问题,把在程序中直接通过HImage直接进行模板匹配,与图片指定一种格式保存到本地后加载模板匹配。得到的打分会有一些差异!
直接打分得到4.9分,保存后在打分得到5.3分。其实是保存导致的问题,我们下一篇讲解~~~

http://www.xdnf.cn/news/6229.html

相关文章:

  • win11 VSCode 强制弹窗微软登录
  • 【数据管理平台测试文档】
  • 40-canvas中文字的横向对齐方式
  • CSS 锚点滑动效果的技术
  • NDM:高效全能的下载工具
  • 【设计模式】- 创建者模式
  • 2011-2020年各省粗离婚率数据
  • 记录: Windows下远程Liunx 系统xrdp 用到的一些小问题(免费踩坑 记录)
  • Qwen3模型架构、训练方法梳理
  • 因果推断 | 用SHAP分值等价因果效应值进行反事实推理
  • 怎样将MM模块常用报表设置为ALV默认格式(MB52、MB5B、ME2M、ME1M等)
  • Redis实现-优惠卷秒杀(基础版本)
  • 数据安全学习指南(1.0版本)
  • 开发指南112-样式的优先级别
  • Ascend的aclgraph(七)AclConcreteGraph:capture_begin
  • prisma连接关系型数据库如mysql数据库并完善用户的增删改查
  • ROOM 数据库 | 实现自定义 ContentProvider 插入数据
  • 30天通过软考高项-第九天
  • LeetCode 55. 跳跃游戏(中等)
  • 多线程(三)
  • 团结引擎 1.5.0 发布,抖音小游戏平台即将开放、Shader Graph功能新增…引擎能力再提升!
  • 深入探索局域网技术:从理论到实战
  • 如何下载 Microsoft SQL Server Management Studio 2019
  • 最大子段和(就是之前总结线性dp思想)
  • 现代垃圾收集器
  • 公路水运安全员A证备考要点
  • 如何解决电脑蓝屏错误代码:Oxc0000098
  • OSS-承载数据的巨轮
  • 同设备访问php的多个接口会有先后等待问题
  • 基于 art 下的类加载机制,实现函数抽取壳