C# halcon 工业产品尺寸测量
产品检测
这段代码是一个基于HalconDotNet的Windows窗体应用程序,主要用于图像处理和测量。以下是对代码的一些总结:
1. **图像显示与加载:**
- 使用`HalconDotNet`库进行图像处理。
- 通过`OpenFileDialog`实现图像文件的选择和加载。
- 使用`HImage`对象存储和显示图像。
2. **图像处理方法:**
- 实现了图像的灰度化、二值化、连接区域等处理。
- 提供了一系列图像处理的参数,如二值化阈值、区域筛选参数等。
3. **测量功能:**
- 实现了对图像中物体宽度、高度的测量。
- 计算了内外圈直径,并显示在界面上。
- 提供了上下高度、左右宽度等测量按钮。
4. **界面交互:**
- 通过按钮触发不同的图像处理和测量操作。
- 提供了清除窗口和退出程序的功能。
5. **界面设计:**
- 使用Windows窗体(`Form`)设计应用程序界面。
- 包含了图像显示窗口(`HalconWindow`)和多个按钮用于触发不同操作。
6. **代码结构:**
- 使用了命名空间(`WindowsFormsApp1`)。
- 包含了一个`Form`类,其中定义了图像处理的方法和界面上的各个控件事件处理方法。
7. **需要改进的地方:**
- 部分注释是中文,但整体注释较少,可以进一步添加注释以提高代码可读性。
- 代码中使用了一些硬编码的路径,可以考虑使用相对路径或配置文件来管理。
总体而言,这是一个用于图像处理和测量的简单Windows应用程序,可以根据具体需求进一步扩展和优化。
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WindowsFormsApp1
{public partial class Form1 : Form{public Form1(){InitializeComponent();}public static HImage hImage = new HImage();public HRegion hRegion = new HRegion();public void HImageShow(HImage hImage, string filePath){hImage.ReadImage(filePath);hImage.GetImageSize(out HTuple width, out HTuple height);HOperatorSet.CountChannels(hImage, out HTuple channels);HOperatorSet.SetPart(hWindowControl1.HalconWindow, 0, 0, height + 1, width + 1);//hImage.DispImage(hWindowControl1.HalconWindow); //灰度图像hImage.DispObj(hWindowControl1.HalconWindow);}//二值化参数HTuple MinValue = 4;HTuple MaxValue = 88;//ROI筛选1HTuple feature1 = "area";string operation = "and";HTuple min1 = 150.0;HTuple max1 = 99999.0;// 照片位深int dpi = 72;public HRegion hImage1Process(HImage hImage){HImage grayImage = hImage.Rgb1ToGray();HRegion Region1 = grayImage.Threshold(MinValue, MaxValue);HRegion connectionRegion = Region1.Connection();HRegion selectRegion = connectionRegion.SelectShape(feature1, operation, min1, max1);HRegion regionUnion = selectRegion.Union1();HRegion closingRegion = regionUnion.ClosingCircle(7.5);HRegion opeingRegion = closingRegion.OpeningCircle(3.5);return opeingRegion;}//显示图片private void button1_Click(object sender, EventArgs e){OpenFileDialog openFileDialog2 = new OpenFileDialog();openFileDialog2.Multiselect = true; //该值确定是否可以选择多个文件//openFileDialog2.Title = "请选择文件";openFileDialog2.Filter = "(*.PNG)|*.PNG|(*.jpg)|*.jpg|(*.txt)|*.txt";//openFileDialog2.Filter = "文档(*.doc;*.docx)|*.doc;*.docx";string filePath = "";if (openFileDialog2.ShowDialog() == DialogResult.OK){if (openFileDialog2.FileName != ""){filePath = openFileDialog2.FileName;HImageShow(hImage, filePath);}}}//清除窗口private void button2_Click(object sender, EventArgs e){hWindowControl1.HalconWindow.ClearWindow();hImage.Dispose();}//退出程序private void button9_Click(object sender, EventArgs e){System.Environment.Exit(0);}//宽度计算public void objWidth(HImage hImage){hRegion = hImage1Process(hImage);hRegion.SmallestRectangle2(out HTuple row, out HTuple column, out HTuple Phi, out HTuple Length1, out HTuple Length2);hRegion.SmallestCircle(out HTuple Row, out HTuple Column, out HTuple Radius);HTuple MaxLength1 = Length1.TupleMax();textBox2.Text = (MaxLength1 / dpi * 25.4).ToString() + "mm\n";hWindowControl1.HalconWindow.SetDraw("margin");hRegion.GenRegionLine(row, column - Length1, row, column + Length1);hRegion.DispObj(hWindowControl1.HalconWindow);hRegion.Dispose();}//高度计算public void objHeigth(HImage hImage){hRegion = hImage1Process(hImage);hRegion.SmallestRectangle2(out HTuple row, out HTuple column, out HTuple Phi, out HTuple Length1, out HTuple Length2);hRegion.SmallestCircle(out HTuple Row, out HTuple Column, out HTuple Radius);double MaxLength2 = 0;HTuple MaxLength1 = Length1.TupleMax();textBox1.Text = (Length1[0] == MaxLength1[0]).ToString();for (int Index = 0; Index < Length1.Length; Index++){if (Length1[Index] - MaxLength1[Index] <= 0.000001){MaxLength2 = Length2[Index];}}textBox1.Text = (MaxLength2 / dpi * 25.4).ToString() + "mm\n";hWindowControl1.HalconWindow.SetDraw("margin");hRegion.GenRectangle2(row, column, Phi, Length1, Length2);hRegion.GenRegionLine(row - Length2, column, row + Length2, column);hRegion.DispObj(hWindowControl1.HalconWindow);hRegion.Dispose();}//上下高度private void button3_Click(object sender, EventArgs e){objHeigth(hImage);}//左右宽度private void button4_Click(object sender, EventArgs e){objWidth(hImage);}//内圈直径private void button5_Click(object sender, EventArgs e){objCicle1(hImage);}//内圈直径计算public void objCicle1(HImage hImage){hRegion = hImage1Process(hImage);hRegion.SmallestRectangle2(out HTuple row, out HTuple column, out HTuple Phi, out HTuple Length1, out HTuple Length2);hRegion.SmallestCircle(out HTuple Row, out HTuple Column, out HTuple Radius);hRegion.GenRectangle2(row, column, Phi, Length1, Length2);HImage grayImage = hImage.Rgb1ToGray();HImage ImageReduced = grayImage.ReduceDomain(hRegion);HRegion Regions = ImageReduced.Threshold(94.0, 119.0);HRegion Fillup = Regions.OpeningCircle(5.5).Connection().SelectShape("area", "and", 30000.0, 999999).FillUp();hWindowControl1.HalconWindow.SetDraw("margin");Fillup.SmallestCircle(out double row2, out double column2, out double radius2);hRegion.GenCircle(row2, column2, radius2);hRegion.DispObj(hWindowControl1.HalconWindow);textBox3.Text = (radius2 / dpi * 25.4).ToString() + "mm\n";}//外圈直径计算public void objCicle2(HImage hImage){hRegion = hImage1Process(hImage);hRegion.SmallestRectangle2(out HTuple row, out HTuple column, out HTuple Phi, out HTuple Length1, out HTuple Length2);hRegion.SmallestCircle(out HTuple Row, out HTuple Column, out HTuple Radius);hRegion.GenRectangle2(row, column, Phi, Length1, Length2);HImage grayImage = hImage.Rgb1ToGray();HImage ImageReduced = grayImage.ReduceDomain(hRegion);HRegion Regions = ImageReduced.Threshold(94.0, 119.0);HRegion Fillup = Regions.OpeningCircle(5.5).Connection().SelectShape("area", "and", 30000.0, 999999).FillUp();hWindowControl1.HalconWindow.SetDraw("margin");Fillup.SmallestCircle(out double row2, out double column2, out double radius2);double radius3 = Length2;hRegion.GenCircle(row2, column2, radius3);hRegion.DispObj(hWindowControl1.HalconWindow);textBox4.Text = (radius3 / dpi * 25.4).ToString() + "mm\n";}private void button6_Click(object sender, EventArgs e){objCicle2(hImage);}private void button7_Click(object sender, EventArgs e){hRegion = hImage1Process(hImage);hRegion.SmallestRectangle2(out HTuple row, out HTuple column, out HTuple Phi, out HTuple Length1, out HTuple Length2);hRegion.SmallestCircle(out HTuple Row, out HTuple Column, out HTuple Radius);double MaxLength2 = 0;double MaxRow = 0;double MaxColumn = 0;double MaxPhi = 0;HTuple MaxLength1 = Length1.TupleMax();textBox1.Text = (Length1[0] == MaxLength1[0]).ToString();for (int Index = 0; Index < Length1.Length; Index++){if (Length1[Index] - MaxLength1[Index] <= 0.000001){MaxLength2 = Length2[Index];MaxRow = Row[Index];MaxColumn = Column[Index];MaxPhi = Phi[Index];}}textBox5.Text = (MaxLength2 / dpi * 25.4).ToString() + "mm\n";hWindowControl1.HalconWindow.SetDraw("margin");hRegion.GenRectangle2(new HTuple(MaxRow), new HTuple(MaxColumn), new HTuple(MaxPhi), new HTuple(MaxLength1), new HTuple(MaxLength2));hRegion.DispObj(hWindowControl1.HalconWindow);hRegion.Dispose();}private void button8_Click(object sender, EventArgs e){hImage.ReadImage("C:\\Users\\1\\Desktop\\表盘imgaes\\1-1.png");hImage.GetImageSize(out HTuple width, out HTuple height);HOperatorSet.SetPart(hWindowControl1.HalconWindow, 0, 0, height + 1, width + 1);//hImage.DispImage(hWindowControl1.HalconWindow); //灰度图像hImage.DispObj(hWindowControl1.HalconWindow);}private void button10_Click(object sender, EventArgs e){hImage.ReadImage("C:\\Users\\1\\Desktop\\表盘imgaes\\1-2.png");hImage.GetImageSize(out HTuple width, out HTuple height);HOperatorSet.SetPart(hWindowControl1.HalconWindow, 0, 0, height + 1, width + 1);//hImage.DispImage(hWindowControl1.HalconWindow); //灰度图像hImage.DispObj(hWindowControl1.HalconWindow);}}
}
这段代码有一些优点和一些需要改进的地方。
**优点:**
1. **功能丰富:** 代码实现了图像处理和测量的多个功能,包括灰度化、二值化、区域连接、测量物体的宽度、高度等。
2. **界面交互:** 通过Windows窗体设计,提供了用户友好的界面,通过按钮触发不同的操作,易于使用。
3. **代码结构清晰:** 代码使用了命名空间和类的结构,提高了代码的组织性和可维护性。
4. **使用HalconDotNet库:** 利用HalconDotNet库进行图像处理,该库功能强大,适用于工业视觉和图像处理领域。
**需要改进的地方:**
1. **注释不足:** 部分注释是中文,但整体注释较少。可以添加更多注释,特别是对于复杂逻辑和算法的部分,以提高代码的可读性。
2. **硬编码路径:** 代码中使用了一些硬编码的路径,建议使用相对路径或配置文件来管理路径,提高代码的灵活性。
3. **异常处理:** 缺少对异常的处理,例如文件加载失败、图像处理失败等情况应该进行适当的异常处理。
4. **代码复用性:** 一些功能可能可以抽象成可复用的方法,提高代码的重用性。
5. **界面布局:** 界面布局方面可以进一步优化,使界面更加美观和易于使用。
总体而言,这段代码是一个功能完善的图像处理应用程序,通过一些改进可以进一步提高代码的质量和可维护性。
相关文章:
C# halcon 工业产品尺寸测量
产品检测 这段代码是一个基于HalconDotNet的Windows窗体应用程序,主要用于图像处理和测量。以下是对代码的一些总结: 1. **图像显示与加载:** - 使用HalconDotNet库进行图像处理。 - 通过OpenFileDialog实现图像文件的选择和加载。 …...
Vue中插槽的简单使用
插槽 分类:默认插槽、具名插槽、作用域插槽 默认插槽:让父组件可以向子组件指定位置插入html结构,也是一种组件通信的方式,适用于父组件(App)>子组件(MyFooter) 默认插槽的App组件 <template>&…...
华为OD机试真题-机器人仓库搬砖-2023年OD统一考试(C卷)
题目描述: 机器人搬砖,一共有N堆砖存放在N个不同的仓库中,第i堆砖中有bricks[i]块砖头,要求在8小时内搬完。机器人每小时能搬砖的数量取决于有多少能量格,机器人一个小时中只能在一个仓库中搬砖,机器人的能量格每小时补充一次且能量格只在这一个小时有效,为使得机器人损…...
三维模型数据的几何坐标变换的点云重建并行计算技术方法分析
三维模型数据的几何坐标变换的点云重建并行计算技术方法分析 倾斜摄影三维模型数据的几何坐标变换与点云重建并行计算技术的探讨主要涉及以下几个方面: 1、坐标系定义与转换:在进行坐标变换前,需要确定各个参考系的定义并实现坐标系之间的转…...
Android 横竖屏切换之窗体泄露leaked window DecorView XXXActivity
前言 遇到问题 Android 横竖屏切换之窗体泄露leaked window DecorView XXXActivity has leaked window DecorViewe6d2d3c[XXXActivity] that was originally added here 场景 在android 横竖屏切换时androidManifest 对应Activity可以设置 <activityandroid:name".XX…...
mysql之视图执行计划
一.视图 1.1视图简介 1.2 创建视图 1.3视图的修改 1.4视图的删除 1.5查看视图 二.连接查询案例 三.思维导图 一.视图 1.1视图简介 虚拟表,和普通表一样使用 MySQL中的视图(View)是一个虚拟表,其内容由查询定义。与实际表不…...
软件安装文档 | Docker (简洁)
如果之前安装过旧版本的Docker,可以使用下面命令卸载: yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine …...
PHP代码审计之实战审代码篇2
4. 仔细观察如下代码,思考代码有什么缺陷,可能由此引发什么样的问题? <?php require_once("/home/rconfig/classes/usersession.class.php"); require_once("/home/rconfig/classes/ADLog.class.php"); require_onc…...
05 Ciso模拟器连接腾讯云物联网开发平台
Ciso声明:本篇文章基于使用腾讯云物联网平台连接自定义esp8266物联网设备(腾讯连连控制开关实现) - CSDN App改编 一、总体概览 功能描述: 使用腾讯连连小程序进行控制, Alarm(警铃):开的时候ÿ…...
Nginx(二十) 获取真实客户端IP
客户端在访问互联网应用服务器时,与真实的应用服务器之间会因为有多层反向代理,而导致真实应用服务器获取的仅是最近一层的反向代理服务器 IP。为使 Nginx 后端的上游服务器可以获得真实客户端 IP,Nginx 提供了 ngx_http_realip_module 模块用…...
【攻防世界】Reverse—— IgniteMe writeup
main函数:首先检查前4个字符是否“EIS{”,如果是,则会进入check函数。如果check返回true,则会显示“Congratulations” int __cdecl main(int argc, const char **argv, const char **envp) {int result; // eaxsize_t i; // [es…...
m1芯片电脑上的paragon15如何安装激活 m1芯片电脑上ntfs for mac如何安装
Paragon NTFS软件在M1芯片电脑上安装之后,最后一步会让我们“允许加载第三方内核扩展”,具体如下图所示。 图1:允许加载第三方内核扩展 按照图中提示“单击此处“,然后打开安全与隐私。接下来依次点击小锁标志进行解锁,…...
【DevOps-01]】DevOps介绍
一、简要描述 DevOps:Development & Operations的缩写,也就是开发&运维 DevOps是一个不断提高效率并且持续不断工作的过程。 核心:简化Dev和Ops团队之间的流程,使整体软件开发过程更快速。 DevOps定义: DevOps 强调的是高效组织团队之间如何通过自动化的工具协作和…...
基于PHP的花店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的花店管理系统 一 介绍 此花店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。(附带参考设计文档) 技术栈:phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 …...
《PySpark大数据分析实战》-24.数据可视化图表介绍
📋 博主简介 💖 作者简介:大家好,我是wux_labs。😜 热衷于各种主流技术,热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员(PCTA)、TiDB数据库专家(PCTP…...
kafka 偏移量的类型与提交方式
kafka checkpoint 在流处理中,“checkpoint” 通常指的是将应用程序的状态保存到可靠的存储系统中,以便在发生故障或应用程序需要重启时能够从先前的状态中恢复。这包括保存处理过的事件、中间结果以及任何其他状态信息。“Checkpointing” 可以确保系统的一致性,并提供容错…...
TCP服务器的编写(下)
我们现在开始对我们的客户端开始封装 我们的客户端,创建完套接字,需不需要bind呢?? 当然是不需要的,你本身是一个客户端,其他人写的应用也可能是客户端,如果我们bind,一定意味着我们…...
Linux系统安全及应用
目录 一、系统安全的加固 1、账号安全的基本措施 1.1 将用户设置为无法登录 1.2 锁定长期不使用的账号 1.3 删除无用的账号 1.4 锁定账号文件passwd、shadow 2、密码安全控制 2.1 设置密码有效期 2.1.1 适用于新建用户 2.1.2 适用于已有用户 2.2 强制用户下次登录一…...
初识Web服务器
一、web服务器 1、什么是web服务器? web服务器就是web项目的容器,我们将开发好的web项目部署到web容器中,才能使用网络中的用户通过浏览器进行访问。 一张图带你了解web服务器有啥作用: 在我的电脑上有一个已经做好的项目&#…...
IOS - 手机安装包 ipa 常见几种方式
安装 ipa 包的方法有很多中,可以通过不同的软件安装,本文只列出了常用的几种,做个简单的归纳整理 1、iTunes 安装 数据线连接手机之后,会自动连接iTunes,(第一次连接的时候会提示是否信任此电脑࿰…...
60、resnet50 权值和参数加载
上一节我们将 resnet50 中需要下载的权值,以及每层卷积的参数,都下载并且保存到了 仓库 resnet50_weight 目录,在仓库的这个连接。 在将权值保存好之后,接下来就是要看如何使用这些权值,也就是如何加载。本节就介绍下我们实战过程中,如何加载这些权值。 加载权值 加载权…...
wordpress在界面将站点地址直接修改为https导致上不去问题的解决办法
wordpress在界面将站点地址直接修改为https导致上不去问题的解决办法 #修改数据库yz_options...
数字IC后端实现之快速获取innovus中drv violation的所有net list
在Innovus中place_opt_design和optDesign阶段,我们经常会看到如下所示的log提示信息,核心关键词是“ Reasons for remaining drv violations”。而且告诉我们总共有819条net存在drv violation,且无法被工具优化掉。 Reasons for remaining dr…...
【开源】基于JAVA语言的智能教学资源库系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 课程档案表3.2.2 课程资源表3.2.3 课程作业表3.2.4 课程评价表 四、系统展示五、核心代…...
数据库定义和操作语句的重要语法
数据库📊的10种语法 数据查询语句 select : 用于从数据库中检索数据。 select column1, column2,.... from table_name where condition; select distinct : 用于从数据库中检索唯一的数据值。 select DISTINCT column1, clumn2,... from table_name; 工作原理…...
计算机组成原理 CPU的功能和基本结构和指令执行过程
文章目录 CPU的功能和基本结构CPU的功能CPU的基本结构 指令执行过程指令周期概念指令执行方案指令数据流取周期数据流析指周期数据流执行周期数据流中断周期数据流 数据通路的功能和基本结构数据通路的功能数据通路的结构单总线 CPU的功能和基本结构 #mermaid-svg-0uHwjZOZh4kS…...
批量归一化:彻底改变深度学习架构
一、介绍 在深度学习的动态领域,批量归一化的引入标志着神经网络训练方法的关键转变。这项创新技术由 Sergey Ioffe 和 Christian Szegedy 在 2015 年提出,已成为现代神经网络架构的基石。它解决了训练深度网络的关键挑战,特别是处理臭名昭著…...
Spring05
一、Spring事务管理入门 1.1、创建数据库和表 创建一个Spring数据库,在Spring数据库中创建tb_account(账户表),并初始化数据。 1.2、编写Service层、Mapper层以及调用层 1.2.1、AccountServiceImpl实现了AccountService接口 1.2.2、Mapper层中的代码 1…...
MvvmToolkit的使用
背景:MvvmLight不更新了,用Toolkit代替 1、首先下载好社区版本的NuGet包 2、ViewModel中需要继承ObservableObject,查看ObservableObject可以看到里面有实现好InotifyPropertyChanged。 3、对于属性的set,可以简写成一行ÿ…...
分布式【一致性Hash算法简介】
一致性Hash是一种特殊的Hash算法,由于其均衡性、持久性的映射特点,被广泛的应用于负载均衡领域,如nginx和memcached都采用了一致性Hash来作为集群负载均衡的方案。 一致性Hash算法简介 在了解一致性Hash算法之前,先来讨论一下Ha…...
网站模板 百科/哪个公司要做网络推广
前不久,我们发布了《选择 .NET 的 n 个理由》。它提供了对平台的高层次概述,总结了各种组件和设计决策,并承诺对所涉及的领域发表更深入的文章。这是第一篇这样深入探讨 C# 和 .NET 中 async/await 的历史、背后的设计决策和实现细节的文章。…...
网站等比例缩放/seo推广具体做什么
2014年6月17日第一天到新公司上班,挺不习惯,中午时间太短,只有一个小时,中午没有睡觉,下午打不起精神。以后中午吃饭时间得好好调整了,还是得抽出时间午休哦。公司里的水是用自来水消毒的,喝不习…...
东莞网站建设 餐饮/深圳网站页面设计
深入浅出Smarty模板引擎工作机制,我们将对比使用smarty模板引擎和没使用smarty模板引擎的两种开发方式的区别,并动手开发一个自己的模板引擎,以便加深对smarty模板引擎工作机制的理解。 在没有使用Smarty模板引擎的情况下,我们都是…...
中国建设网银登录/昆明百度关键词优化
Elastricsearch学习 及 head插件 文章目录Elastricsearch学习 及 head插件一、Elastricsearch简单概念索引 index(库)类型 type(表)文档 document(一条记录)字段 Field(字段)映射 mapping二、安装安装elast…...
wix网站怎么做/营销型网站推广
介绍 假钞很容易成为小型和大型企业的问题。当这些钞票不是真的时,能够识别这些钞票是非常重要的。对于日常与现金打交道的商务人士和个人而言,此过程可能非常耗时。这就需要通过自动化来实现这一目标。 因此,我们认为有必要开发一种自动机…...
albedo wordpress/外贸网站建站和推广
原文地址:http://blog.csdn.net/zhangxs_3/article/details/4034811 与Queue不同的是,Topic实现的是发布/订阅模型,发布者发布的消息,可以被多个订阅者消费。现在我们建立两个订阅者,一个发布者,循环给这个…...