Halcon 定位加二位测量找直线

图像:

代码:

dev_close_window () dev_open_window (0, 0, 512, 512, 'black', WindowHandle) *加载图像 read_image (Image,'//DESKTOP-V21FG2T/Share/2.bmp') threshold(Image,Region, 50, 100) connection(Region, ConnectedRegions) select_shape(ConnectedRegions, SelectedRegion, 'area', 'and', 100000, 9999999) * 获取最小外接矩形(水平矩形) smallest_rectangle1 (SelectedRegion, Row1, Column1, Row2, Column2) Width := Column2 - Column1 + 1 Height := Row2 - Row1 + 1 * 获取四条边的中心点 * 上边中心点 TopCenterRow := Row1 TopCenterCol := (Column2+Column1) / 2 * 下边中心点 BottomCenterRow := Row2 BottomCenterCol := (Column2+Column1) / 2 * 左边中心点 LeftCenterRow := (Row2+Row1) / 2 LeftCenterCol := Column1 * 右边中心点 RightCenterRow := (Row2+Row1) / 2 RightCenterCol := Column2 *界面操作得到测量区域,转到视野上画线 * draw_line (WindowHandle, Row1, Column1, Row2, Column2) * shapePararm:=[Row1,Column1,Row2,Column2] * 创建一个空元组来存储选择的对象 gen_empty_obj(EmptyObject) * 确定了测量区域的上线的中心和下线的中心 shapePararm:=[TopCenterRow,TopCenterCol,BottomCenterRow,BottomCenterCol] * 确定了测量区域的左线的中心和右线的中心 shapePararm1:=[LeftCenterRow,LeftCenterCol,RightCenterRow,RightCenterCol] params:=[shapePararm,shapePararm1] for i := 0 to 1 by 1 * 提取当前参数 *创建直线模型 create_metrology_model (MetrologyHandle) *设置直线模型图像大小,即需要被检测的图像大小 set_metrology_model_image_size (MetrologyHandle, Width, Height) *添加线模型通用测量对象 sharp参数设置为line Index:输出创建测量对象的索引值 if (i == 0) * 处理第一条参数(i=0) add_metrology_object_generic (MetrologyHandle, 'line', shapePararm, 700, 10, 1, 10, [], [], Index) elseif (i == 1) * 处理第二条参数(i=1) add_metrology_object_generic (MetrologyHandle, 'line', shapePararm1, 700, 10, 1, 10, [], [], Index) endif *找线方式,暗 / 亮(positive)或亮 / 暗(negative)边缘,'uniform' 表示同时检测并分别拟合 set_metrology_object_param (MetrologyHandle, 'all','measure_transition', 'all') *设置卡尺数量 set_metrology_object_param (MetrologyHandle, 'all', 'num_measures', 30) *拟合数,每个计量对象最多拟合的有效实例数,达到后停止拟合 set_metrology_object_param (MetrologyHandle, 'all', 'num_instances', 4) *高斯平滑系数,值越大边缘越清晰,越不容易找到边缘,值越小,干扰边缘越多 set_metrology_object_param (MetrologyHandle, 'all', 'measure_sigma', 2) *测量双立方插入值,区别于bilinear双线性 set_metrology_object_param (MetrologyHandle, 'all', 'measure_interpolation', 'bicubic') *边缘振幅最小值,最小边缘幅度越大,要求找到的边缘越锐利(灰度变化明显),反而越不容易找到边缘 set_metrology_object_param (MetrologyHandle, 'all', 'measure_threshold', 20) *取值 all,first,best,last set_metrology_object_param (MetrologyHandle, 'all', 'measure_select', 'all') *判定有效拟合实例的最低分数(检测边缘数 / 最大测量区域数) set_metrology_object_param (MetrologyHandle, 'all', 'min_score', 0.4) *开始找边缘 apply_metrology_model (Image, MetrologyHandle) *获取模型的计量区域和边缘结果 get_metrology_object_measures (Contours, MetrologyHandle, 'all', 'all', Rows, Columns) *把所有点显示出来 gen_cross_contour_xld (Cross, Rows, Columns, 6, 0.785398) * 如果需要拟合直线 * gen_contour_polygon_xld (Contour, Rows, Columns) * fit_line_contour_xld (Contour, 'drop', -1, 0, 5, 2, TempRowBegin, TempColBegin, TempRowEnd, TempColEnd, TempNr, TempNc, TempDist) * 计算拟合的直线和点之间的距离 * distance_pl (Rows, Columns, TempRowBegin, TempColBegin, TempRowEnd, TempColEnd, Distance) * tuple_max (Distance, Max) * 在联系的删除点中是不是有足够的点来拟合 * 删除不符合点到直线距离的点 * tuple_less_elem (Distance, Max/2, Less) * tuple_find (Less, 0, Indices) * tuple_remove (Rows, Indices, ValidRows) * tuple_remove (Columns, Indices, ValidCols) *得到线的起点坐标并显示出来 get_metrology_object_result (MetrologyHandle, 0, 'all', 'result_type', 'all_param', Parameter) *获模型计量对象的结果轮廓 get_metrology_object_result_contour (Contour, MetrologyHandle, 0, 'all', 5) select_obj(Contour, ObjectSelected1, 1) select_obj(Contour, ObjectSelected2, 2) concat_obj(EmptyObject, ObjectSelected1, TempObject) concat_obj(TempObject, ObjectSelected2, EmptyObject) * EmptyObject := [EmptyObject, ObjectSelected1, ObjectSelected2] * select_obj(Contour, ObjectSelected3, 3) *释放测量句柄,很重要否则导入C#代码运行没多久就会崩溃程序 clear_metrology_object (MetrologyHandle, 'all') endfor dev_clear_window() dev_display(Image) dev_display(EmptyObject) * 提取直线参数 Lines1 := [] select_obj(EmptyObject, Line, 1) fit_line_contour_xld(Line, 'tukey', -1, 0, 5, 2, Row1, Col1, Row2, Col2, _, _, _) Lines1 := [Lines1, [Row1, Col1, Row2, Col2]] * 获取线段角度(返回弧度) orientation_xld(Line, AngleRad) * 转换为角度(°) AngleDeg := AngleRad * 180 / 3.1415926535 Lines2 := [] select_obj(EmptyObject, Line, 2) fit_line_contour_xld(Line, 'tukey', -1, 0, 5, 2, Row1, Col1, Row2, Col2, _, _, _) Lines2 := [Lines2, [Row1, Col1, Row2, Col2]] Lines3 := [] select_obj(EmptyObject, Line, 3) fit_line_contour_xld(Line, 'tukey', -1, 0, 5, 2, Row1, Col1, Row2, Col2, _, _, _) Lines3 := [Lines3, [Row1, Col1, Row2, Col2]] Lines4 := [] select_obj(EmptyObject, Line, 4) fit_line_contour_xld(Line, 'tukey', -1, 0, 5, 2, Row1, Col1, Row2, Col2, _, _, _) Lines4 := [Lines4, [Row1, Col1, Row2, Col2]] *计算交点 intersection_lines (Lines1[0], Lines1[1], Lines1[2], Lines1[3], Lines3[0], Lines3[1], Lines3[2], Lines3[3], Row13, Column13, IsOverlapping) intersection_lines (Lines1[0], Lines1[1], Lines1[2], Lines1[3], Lines4[0], Lines4[1], Lines4[2], Lines4[3], Row14, Column14, IsOverlapping) intersection_lines (Lines2[0], Lines2[1], Lines2[2], Lines2[3], Lines3[0], Lines3[1], Lines3[2], Lines3[3], Row23, Column23, IsOverlapping) intersection_lines (Lines2[0], Lines2[1], Lines2[2], Lines2[3], Lines4[0], Lines4[1], Lines4[2], Lines4[3], Row24, Column24, IsOverlapping) AverageRow := (Row13 + Row14 + Row23 + Row24) / 4 AverageColumn := (Column13 + Column14 + Column23 + Column24) / 4 dev_clear_window() dev_display(Image) gen_cross_contour_xld (Cross1, AverageRow, AverageColumn, 200, AngleRad)

效果:

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

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

相关文章

Thinkphp-Laravel微信小程序的社区后勤报修系统

目录摘要项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理摘要 ThinkPHP-Laravel微信小程序社区后勤报修系统是一款基于Web和移动端的综合性服务平台,旨在为社区居民提供便捷的报修、投诉及后勤管理功能。系统采用ThinkPHP和Laravel双框…

正交电感的频率特性测量

01 正交电感频率特性 空心正交电感两路线圈信号极值偏移方向 初步测量结果 设置扫描范围, 从100kHz 到 200kHz,  这是扫描小型工字型正交电感对应的结果。 他的谐振峰小于 150kHz。  可以看到在 150kHz的时候 两个通道之间有 23dB 的衰减。  这是大型…

ThingsBoard - APP图片更改为彩色(失败)

问题描述 在手机APP中,登录窗口的LOGO图片没有彩色。问题分析 原始资源图片是彩色的,这肯定是代码中做了处理。已知该图片文件名为thingsboard_big_logo.svg。 //\flutter_thingsboard_app\lib\constants\assets_path.dart abstract class ThingsboardIm…

EI会议推荐!早鸟价!2026年先进电子与自动化技术国际学术会议(AEAT 2026)

✔AEAT2026 已上线长春理工大学电子信息工程学院官网 01 重要信息 会议官网:https://www.yanfajia.com/action/p/JLKRKQRB 会议时间:2026年4月24-26日 会议地点:中国长春 截稿日期:2026年2月27日(一轮截稿&#x…

用Nginx日志风格复刻《黑客帝国》代码雨:终端里的赛博朋克特效

前言:《黑客帝国》的绿色数字雨是赛博朋克经典符号,也是不少人对“代码之美”的初印象。出于对这个经典画面的喜爱,我决定复刻一款数字雨脚本。 网上现存版本多有痛点:单系统适配、易闪烁乱码、依赖第三方库。因此我用Python内置库…

Thinkphp-Laravel微信小程序积分商城购物系跑腿配送系统_09ok4

目录摘要内容项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理摘要内容 Thinkphp-Laravel微信小程序积分商城购物跑腿配送系统(项目代号09ok4)是一套基于PHP框架开发的综合性电商解决方案,整合了会员积分、商品交…

网安校招不踩坑!3 类岗位薪资拆解(10-50 万)+ 技能要求,应届生精准匹配指南

网络安全校招:3 类入门岗位薪资 技能要求,清晰对标 2025 年网络安全人才缺口已突破 150 万,北京、深圳等城市企业甚至开出 “应届生年薪 30 万 ” 的高薪抢人。但对高校应届生而言,“岗位类型繁杂、技能要求模糊” 往往成为求职路…

MR2A08A-4Mb 8位I/O并行接口MRAM

在需要高速读写与数据永久保存的工业、汽车及高可靠性系统中,存储器的选择至关重要。MR2A08A-4Mb磁阻随机存取存储器(MRAM)凭借其SRAM兼容的性能、真正的非易失特性以及无限的读写耐久性,成为替代传统Flash、SRAM或电池备份SRAM&a…

部署CA证书

目录 CA证书 PKI概念 PKI PKI体系能够实现的功能 PKI协议 X.509 对称加密 非对称加密 部署CA证书实验 实验准备:安装AD域 一,添加角色和功能向导 1,“服务器角色”里面,选择“Active Directory证书服务” 2&#xff…

Thinkphp-Laravel电子设备商品商城采购系统的研究与设计

目录摘要项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理摘要 随着电子商务的快速发展,电子设备商品商城的采购系统成为企业提升运营效率的关键工具。本研究基于ThinkPHP和Laravel框架,设计并实现了一套高效、安全的电子设…

【收藏】1536维vs512维:低维嵌入模型如何实现RAG性能翻倍?颠覆认知的技术选型实践

本文分享了MyClone平台将OpenAI的1536维嵌入模型替换为512维Voyage 3.5 Lite的实践。尽管维度降低,但通过Matryoshka Representation Learning等技术创新,实现了存储成本减少66%、检索延迟降低50%、速度提升2倍的效果,同时保持了甚至提升了检…

从脚本小子到高手!黑客自学 5 本必读书,覆盖基础 / 实战 / 社会工程,附电子书

经常会有粉丝朋友私信我,想学黑客技术有什么书籍推荐,今天就给大家安利一波。 想自学黑客,看这五本书就够了 想要自学黑客却没人教怎么办,看完这五本书,你也能成为黑客大佬💪 ✅第一本《黑客攻防:从入门到…

空心正交电感两路线圈信号极值偏移方向

简 介: 摘要:实验研究了空心正交电感测量交变磁场时出现的左右不对称现象。通过对比顺时针和逆时针旋转测量结果,发现两组线圈信号极值存在固定方向的偏移,且该偏移与旋转方向、磁场方位及传感器位置均无关。测试包括改变电磁门方…

2026企业AI Agent规模化落地:四大核心趋势详解,收藏这份从0到1的实战指南

2026年将成企业级AI Agent落地关键拐点,企业从探索转向规模化应用。MCP构建统一连接层,GraphRAG实现精准知识响应,AgentDevOps保障可控可靠,RaaS让价值可衡量。在营销、招聘等场景已形成可复用落地样本,通过连接协议、…

网安工程师狂喜!8 款必备黑客工具 + 安装包,一次全分享,收藏即封神!

网络安全工程师在维护和保护信息系统的安全性方面扮演着至关重要的角色。为了有效地完成这一任务,他们需要掌握并使用多种工具。本文将详细介绍八款网络安全工程师必备的工具,包括Snort、Wireshark、Nmap、Metasploit、Nessus、OpenVAS、Firewall和Proxy…

收藏!AI、ML、DL和NLP的区别与联系,一篇彻底搞懂

文章系统解析了人工智能(AI)、机器学习(ML)、深度学习(DL)和自然语言处理(NLP)的层级关系与区别。ML作为最广泛的概念,是从数据中学习模式的方法;DL是ML的子集,基于多层神经网络实现自动特征学习;NLP则是将ML/DL应用于语言任务的应…

动态加载库:dlopen详解-deepseek

功能:dlopen 用于在运行时打开动态链接库,并返回一个句柄给调用进程。 基本语法:void* dlopen(const char* filename, int flag);,其中 filename 是库文件的路径,flag 是打开模式(如 RTLD_NOW 或 RTLD_LAZ…

安川代码移植:基于瑞萨芯片且无PCB的主板原理图探索

安川代码移植的主板原理图 无pcb 采用瑞萨芯片在工业自动化领域,安川的技术一直有着广泛的应用。今天咱来聊聊安川代码移植到基于瑞萨芯片且无PCB设计的主板原理图相关的事儿。 瑞萨芯片的优势 瑞萨芯片在这类应用中有不少亮点。它以高性能、低功耗著称,…

收藏必看!RAG与CAG全面对比:如何选择最适合你的LLM知识整合方案

本文深入对比了大语言模型两种知识整合技术:检索增强生成(RAG)与缓存增强生成(CAG)。RAG通过实时检索外部数据确保知识时效性,适合动态更新场景;CAG预加载信息实现快速响应,适合稳定知识需求。文章详细分析了二者的技术原理、优劣…

跑步即工程:精确掌控你的身体

告别“玄学跑步”:一个ICT老兵的量化生活实验 跑者的数字双生(Digital Twin of a Runner)你是否有过这样的瞬间? 早上兴致勃勃地换上跑鞋,想来个“轻松”的5公里 。结果刚跑出小区大门没多久,心率就飙到了1…