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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue v-html中内容图片过大自适应处理

之前图片如下&#xff0c;图片已经超出了页面的展示范围 对v-html增加样式处理 <div class"body padding-l scroll " v-html"docData.content"> </div><style scoped>.body >>> img {max-width: 100% ;} </style>…

[书生·浦语大模型实战营]——书生·浦语大模型全链路开源体系

大模型成为发展通用人工智能的重要途径 书生浦语大模型开源历程 书生浦语模型性能 从模型到应用 应用例子&#xff1a;智能客服/个人助手/行业应用 实现流程&#xff1a; 开源开放体系&#xff1a; 1.数据——书生万卷 价值观对齐这个挺有意思嗷&#xff01; 2.预训练工具…

redis复习笔记02(小滴课堂)

分布式缓存Redis6常见核心配置讲解 查看配置文件&#xff1a; 创建配置文件&#xff1a; 配置完我们去验证一下&#xff1a; 启动成功就没有问题了。 可以看到redis日志。 然后我们就可以连接我们的redis了&#xff1a; 设置了密码就需要密码登录了。 如果登录了错误的密码也无…

搜索Agent方案

为啥需要整体方案&#xff0c;直接调用搜索接口取Top1返回不成嘛&#xff1f;要是果真如此Simple&Naive&#xff0c;New Bing岂不是很容易复刻->.-> 我们先来看个例子&#xff0c;前一阵火爆全网的常温超导技术&#xff0c;如果想回答LK99哪些板块会涨&#xff0c;你…

勒索检测能力升级,亚信安全发布《勒索家族和勒索事件监控报告》

评论员简评 近期(12.08-12.14)共发生勒索事件119起&#xff0c;相较之前呈现持平趋势。 与上周相比&#xff0c;本周仍然流行的勒索家族为lockbit3和8base。在涉及的勒索家族中&#xff0c;活跃程度Top5的勒索家族分别是&#xff1a;lockbit3、siegedsec、dragonforce、8base和…

视频监控可视化云平台EasyCVR智能视频技术优势分析

TSINGSEE青犀视频安防视频管理系统EasyCVR视频智能融合共享平台&#xff0c;是一个支持Windows/Linux(CentOS ubuntu)/国产化系统的视频管理平台。平台可以支持多协议接入&#xff0c;通过视频应用引擎将多种格式的视频数据转换为统一的视频流数据&#xff0c;支持无插件H5直播…

k8s的pod基础

pod:pod是k8s中最小的资源管理组件。 pod也是最小化运行容器化的应用的资源管理对象。 pod是一个抽象的概念&#xff0c;可以理解为一个或者多个容器化应用的集合。 在一个pod当中运行一个容器是最常用的方式。在一个pod当中同时运行多个容器&#xff0c;在一个pod当中可以同…

聊聊分布式会话及实现方案

鲁大猿&#xff0c;寻找精品资料&#xff0c;帮你构建Java全栈知识体系 http://www.jiagoujishu.cn 基础概念 Session Cookie 会话方案比较简单&#xff0c;这里我在网上找了点资料&#xff0c;再回顾下基础吧。 为什么要产生Session http协议本身是无状态的&#xff0c;客户…

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

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

八大算法排序@冒泡排序(C语言版本)

冒泡排序 概念 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单直观的排序算法&#xff0c;它重复地遍历待排序序列&#xff0c;一次比较两个相邻的元素&#xff0c;如果它们的顺序错误就将它们交换过来。通过多次的遍历&#xff0c;使得最大的元素逐渐移动到待排序序…

Windows—常用DOS命令

解释&#xff1a;DOS命令即面向磁盘的操作命令 进入DOS页面&#xff1a;快捷键“winR”&#xff0c;输入cmd help命令 help 【命令名】可查看其他命令的解释&#xff0c;直接输入help也可以查看部分命令 另外&#xff0c;如果输入help显示help不是内部或外部命令&#xff0c;…

ACCESS从零入门教程

最近&#xff0c;在公司实习自学了一款简单的access数据库软件&#xff0c;下面是自己的一些学习心得过程&#xff0c;供大家参考。 一、access导入数据 两种方法&#xff1a; 1、直接复制&#xff0c;crtl-c/v即可 2、若数据量较大&#xff0c;可以从access内部进行导入&am…

c++语言基础18-开房门

题目描述 假设你手里有一串钥匙&#xff0c;这串钥匙上每把钥匙都有一个编号&#xff0c;对应着一个房门的编号。现给你一个房门编号&#xff0c;你需要判断是否能够打开该房门。 输入描述 测试数据共有多组。 第一行为一个整数 s&#xff0c;表示共有多少组测试数据。 每组第一…

c# OpenCvSharp透视矫正参数调整器

透视矫正不够智能化&#xff0c;每次都要进行局部参数调整&#xff0c;不便于程序使用&#xff0c;程序流程还是那几个步骤&#xff1b; 1、读取图像、灰度化 2、高斯滤波 3、二值化 4、边缘检测 灰度化图 上个图看看经过调整透视矫正边缘检测结果我还是挺满意的 发现一个…

基于springboot智慧食堂管理系统源码和论文

随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化&#xff0c;网络化和电子化。网上管理&#xff0c;它将是直接管理“智慧食堂”系统的最新形式。本论文是以构建“智慧食堂”系统为目标&#xff0c;使用java技术制作&…

Java Synchronized 和 ReentrantLock

目录 介绍 synchronized synchronized 修饰实例方法 修饰静态类方法 synchronized 修饰代码块 实现细节 ReentrantLock ReentrantLock 基本使用 公平锁实现 读写锁&#xff08;ReentrantReadWriteLock&#xff09; 1. 创建读写锁对象&#xff1a; 2. 通过读写锁对象…

IDS 和 IPS:了解异同

IDS 和 IPS 是至关重要的网络安全技术&#xff0c;经常被混淆或互换使用。那么&#xff0c;IDS 和 IPS 之间有什么区别&#xff0c;哪一种是最适合您组织需求的选择呢&#xff1f; 什么是IDS&#xff08;入侵检测系统&#xff09;&#xff1f; 入侵检测系统 (IDS) 是一种网络…

【管理篇 / 登录】❀ 06. macOS下使用USB配置线登录 ❀ FortiGate 防火墙

【简介】飞塔防火墙上都会配有CONSOLE接口&#xff0c;包装里都会配置一根USB配置线&#xff0c;通过这个接口和这根线&#xff0c;我们可以用命令的方式登录飞塔防火墙进行操作。随着苹果电脑的普及&#xff0c;我们来学习一下&#xff0c;如果在MAC OS中用配置线登录飞塔防火…

【零基础入门TypeScript】判断条件和循环

目录 定环 无限循环 示例&#xff1a;while 与 do..while 中断语句 句法 流程图 例子 继续语句 句法 流程图 例子 输出 无限循环 语法&#xff1a;使用 for 循环的无限循环 示例&#xff1a;使用 for 循环的无限循环 语法&#xff1a;使用 while 循环进行无限循…

pytorch06:权重初始化

目录 一、梯度消失和梯度爆炸1.1相关概念1.2 代码实现1.3 实验结果1.4 方差计算1.5 标准差计算1.6 控制网络层输出标准差为11.7 带有激活函数的权重初始化 二、Xavier方法与Kaiming方法2.1 Xavier初始化2.2 Kaiming初始化2.3 常见的初始化方法 三、nn.init.calculate_gain 一、…