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,(第一次连接的时候会提示是否信任此电脑࿰…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
