C# halcon 工业产品尺寸测量

news2024/9/21 12:34:52

产品检测

这段代码是一个基于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筛选1
        HTuple 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.coloradmin.cn/o/1354294.html

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

相关文章

设计模式_结构型模式_装饰器模式

装饰器模式和代理模式很像。 代理模式是已经知道代理谁了&#xff0c;所以只是对委托类的访问权限进行限制&#xff0c;因此用户只需要访问相应的代理类就可以。装饰器模式并不知道要装饰谁&#xff0c;所以需要传入具体的被装饰对象进行功能的添加 目的&#xff1a; 增加现有…

关于设计模式的一点总结

一、GoF 23种设计模式 1.分类 GoF 23种设计模式可分为几类&#xff1a;创建型、结构型和行为型。如下表 分类设计模式创建型单例模式、工厂方法模式、抽象工厂模式、原型模式、建造者模式结构型代理模式、适配器模式、装饰者模式、桥接模式、组合模式、门面模式、享元模式行…

玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 首次运行DevEco Studio

接前一篇文章&#xff1a;玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— DevEco Studio下载与安装 上一篇文章详细说明了Dev Eco Stdio的下载即安装过程&#xff0c;本回讲一下首次运行DevEco Studio的过程。 笔者电脑的操作系统是Windows 11。点击“开始菜单”&#xff0c;在弹…

金融服务公司如何通过人工智能实现任务转型

金融服务行业正在使用人工智能和机器学习提升各项业务流程的速度和准确性。利用人工智能和机器学习技术&#xff0c;金融服务公司可以大幅度降低风险&#xff0c;防止欺诈&#xff0c;优化投资策略&#xff0c;提高运营效率&#xff0c;并提供更为个性化的客户服务。 金融行业为…

(vue)增加行,对应行删除

(vue)增加行&#xff0c;对应行删除 效果&#xff1a; 代码&#xff1a; <div v-for"(ele,i) of algorithmList" :key"i"><el-form-item label"模型类型"><el-selectv-model"ele.algorithmId"placeholder"选择模…

Java LinkedList解密

一、LinkedList最底层的原理 LinkedList其实底层是链表&#xff1a; 当初始化的时候&#xff0c;会将链表这个节点的值、prev指针和next指针初始化。 二、LinkedList初始化 无参构造并没有做什么。有参构造会先调用无参构造&#xff0c;然后调用addAll方法将链表的节点都初始化…

GaussDB数据库使用COPY命令导数

目录 一、前言 二、GaussDB数据库使用COPY命令导数语法 1、语法COPY FROM 2、语法COPY TO 3、特别说明及参数示意 三、GaussDB数据库使用COPY命令导数示例 1、操作步骤 2、准备工作&#xff08;示例&#xff09; 3、把一个表的数据拷贝到一个文件&#xff08;示例&…

Web应用开发:介绍

Web应用开发&#xff0c;介绍一下 文心一言&#xff08;文心大模型3.5&#xff09; Web应用开发是一种使用Web技术创建和部署应用程序的过程。Web应用通常是指通过网络浏览器访问的应用程序&#xff0c;它们可以提供各种功能&#xff0c;如在线银行、在线购物、社交媒体平台等…

2020年认证杯SPSSPRO杯数学建模D题(第一阶段)让电脑桌面飞起来全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 D题 让电脑桌面飞起来 原题再现&#xff1a; 对于一些必须每天使用电脑工作的白领来说&#xff0c;电脑桌面有着非常特殊的意义&#xff0c;通常一些频繁使用或者比较重要的图标会一直保留在桌面上&#xff0c;但是随着时间的推移&#xff0c;…

优雅地展示20w单细胞热图|非Doheatmap 超大数据集 细胞数太多

单细胞超大数据集的热图怎么画&#xff1f;昨天刚做完展示20万单细胞的热图要这么画吗&#xff1f; 今天就有人发消息问我为啥他画出来的热图有问题。 问题起源 昨天分享完 20万单细胞的热图要这么画吗&#xff1f;&#xff0c;就有人问为啥他的数据会出错。我们先来看下他的…

【Vue2+3入门到实战】(21)认识Vue3、使用create-vue搭建Vue3项目、熟悉项目和关键文件

目录 一、认识Vue31. Vue2 选项式 API vs Vue3 组合式API2. Vue3的优势 二、 使用create-vue搭建Vue3项目1. 认识create-vue2. 使用create-vue创建项目 三、 熟悉项目和关键文件四、总结 一、认识Vue3 1. Vue2 选项式 API vs Vue3 组合式API <script> export default {…

Django Web 开发实战-实现用户管理系统(部门管理、用户管理、注册登录、文件上传)

简介 基于Django Python Web框架 MySQL Bootstrap 开发的用户管理系统。支持增删改查、模糊搜索、分页。 功能介绍 部门管理---》已完成 用户管理---》已完成 认证&#xff08;注册/登录&#xff09;---》开发中 数据统计---》待开发 文件上传---》待开发 效果图 部门…

《绝地求生》改名卡快速获得方法 绝地求生改名卡怎么获得

《绝地求生》改名卡是很多小伙伴所在意的物品&#xff0c;购买通行证后需要提升一定的等级才能入手&#xff0c;而怎么升级最快最划算呢&#xff1f;今天闲游盒带来“米奇”分享的《绝地求生》改名卡快速获得方法&#xff0c;赶紧来试试吧。 吃鸡刚刚迎来了更新&#xff0c;通行…

CSDN规则详解(三)

文章目录 每日一句正能量前言企业博客如何开通企业博客分类专栏付费专栏开通规则博客搬家后记 每日一句正能量 只有经历过风雨的人生&#xff0c;才能看到彩虹的美丽&#xff1b;只有付出努力的人&#xff0c;才能品味到成功的滋味&#xff1b;只有懂得感恩的人&#xff0c;才能…

QProgressDialog用法及结合QThread用法,四种线程使用

1 QProgressDialog概述 QProgressDialog类提供耗时操作的进度条。 进度对话框用于向用户指示操作将花费多长时间&#xff0c;并演示应用程序没有冻结。此外&#xff0c;QPorgressDialog还可以给用户一个中止操作的机会。 进度对话框的一个常见问题是很难知道何时使用它们;操作…

HTTP 错误 401.3 - Unauthorized 由于Web服务器上此资源的访问控制列表(ACL)配置或加密设置。

用IIS 发布网站&#xff0c;不能访问且出现错误&#xff1a; HTTP 错误 401.3 - Unauthorized 由于Web服务器上此资源的访问控制列表(ACL)配置或加密设置。您无权查看此目录或页面 解决办法&#xff1a; 1.打开IIS界面&#xff0c;选中发布的网站&#xff0c;右键—>编辑…

【C语言】Linux socket 编程

一、Socket 通信过程 在 Linux 系统中&#xff0c;socket 是一种特殊的文件描述符&#xff0c;用于在网络中的不同主机间或者同一台主机中的不同进程间进行双向通信。它是通信链路的端点&#xff0c;可以看作是网络通信的接口。Socket 通信过程主要分为以下几个步骤&#xff1a…

canvas绘制直角梯形(向右)

查看专栏目录 canvas示例教程100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

PTA QQ帐户的申请与登陆

QQ帐户的申请与登陆 分数 25 全屏浏览题目 作者 DS课程组 单位 浙江大学 实现QQ新帐户申请和老帐户登陆的简化版功能。最大挑战是&#xff1a;据说现在的QQ号码已经有10位数了。 输入格式: 输入首先给出一个正整数N&#xff08;≤105&#xff09;&#xff0c;随后给出N行…

微服务-Gateway

案例搭建 官网地址 父Pom <com.alibaba.cloud.version>2.2.8.RELEASE</com.alibaba.cloud.version> <com.cloud.version>Hoxton.SR12</com.cloud.version> <com.dubbo.version>2.2.7.RELEASE</com.dubbo.version> <dependencyManagem…