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. **界面布局:** 界面布局方面可以进一步优化,使界面更加美观和易于使用。
总体而言,这段代码是一个功能完善的图像处理应用程序,通过一些改进可以进一步提高代码的质量和可维护性。

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

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

相关文章

Python爬虫中的协程

协程 基本概念 协程&#xff1a;当程序执行的某一个任务遇到了IO操作时&#xff08;处于阻塞状态&#xff09;&#xff0c;不让CPU切换走&#xff08;就是不让CPU去执行其他程序&#xff09;&#xff0c;而是选择性的切换到其他任务上&#xff0c;让CPU执行新的任务&#xff…

使用sdf文件+urdf文件模拟机器人示例(不用把urdf转sdf)

gazebo版本&#xff1a;harmonic&#xff1b; <launch> <group> <let name"robot_description" value"$(command xacro $(find-pkg-share gazebo_pkg)/urdf/total.xacro)"/> <node pkg"rviz2" exec"rviz2" name…

vue本地打包预览

1、项目打包 npm run build2、安装serve npm install -g serve3、在项目的 dist 文件运行命令行 serve 4、运行如下在浏览器打开即可

赛诺菲将出席数字化人才峰会2024

2024第四届中国数字化人才国际峰会将于3月12日-13日在上海举办&#xff0c;会议线上线下同步举行&#xff0c;会场提供同声传译 (中英文相互翻译)。 本次峰会将汇集120国内外知名企业的人才管理与技术专家高管&#xff0c;从人才管理&#xff0c;技术变革&#xff0c;企业战略…

树与二叉树笔记整理

摘自小红书 ## 树与二叉树 ## 排序总结

Hive详解、配置、数据结构、Hive CLI

一、Hive 认识 1. Hive 应用 问题&#xff1a;公司的经营状况&#xff1f; 主题一&#xff1a;财务现金流指标1.1&#xff1a;净现金流入/流出量指标1.2&#xff1a;现金转换周期预算执行状况指标2.1&#xff1a;预算内成本控制指标2.2&#xff1a;预算与实际支出的差异 主题…

如何自动生成 API 接口文档 - 一份详细指南

本篇文章详细教你如何使用 Apifox 的 IDEA 插件实现自动生成接口代码。好处简单总结有以下几点&#xff1a; 自动生成接口文档&#xff1a; 不用手写&#xff0c;一键点击就可以自动生成文档&#xff0c;当有更新时&#xff0c;点击一下就可以自动同步接口文档&#xff1b;代码…

如何正确使用docker搭建靶场--pikachu

在Linux中搭建靶场——pikachu 1.开启docker systemctl start docker 2.查看docker状态 systemctl status docker 3.查看docker存在那些镜像 docker images 4.拉取镜像&#xff0c;这里是以pikachu为例因此需要一个php5的版本 &#xff08;1&#xff09;打开代理&#xff…

【力扣题解】P236-二叉树的最近公共祖先-Java题解

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P236-二叉树的最近公共祖先-Java题解&#x1f30f;题目描述&#x1f4a1;题解&#x…

sqlserver根据分组的内容分别查询出匹配的一条信息

需求场景&#xff1a; 我写了条分组语句&#xff0c; select name from car_machine_command group by name 然后该表有很多条相关的数据&#xff0c;我只想拿各个分组的一条数据看看即可 解决&#xff1a;可以使用窗口函数&#xff08;Window Function&#xff09;和 ROW_NU…

Qt6.5类库详解:QComboBox

哈喽大家好&#xff0c;欢迎关注公众号(20YC编程)&#xff0c;有免费C视频课程哦&#xff01; -今日内容- 1. QComboBox介绍 QComboBox是一个下拉列表框组件类&#xff0c;它提供了一个下拉列表供用户选择&#xff0c;也可以直接当作一个QLineEdit用作输入。 QComboBox除了显…

process.cwd() 与 __dirname 的区别

Node.js 中的 __dirname 和 process.cwd() 都是用于获取文件系统路径的全局变量和方法&#xff0c;但它们有不同的含义和用途。 一、process.cwd() process.cwd() 是一个方法&#xff0c;用于获取 Node.js 进程的当前工作目录。它返回的是 Node.js 进程启动时所在的工作目录的…