C#Halcon差异分类模型

news/2025/2/6 7:03:31/

缺陷检测抛开blob分析,尺寸判定与深度学习之外还有一种常用的方式,个人称之为差异分类模型,简称差分模型

个人对其应用过程为:

准备阶段:图像预处理,创建模型,查找模型定位,创建差分模型

应用阶段:查找模型定位,差分模型分类

Demo效果(由于限制5M动图,图像压缩的有些失真,下面进行详细介绍时会以单图呈现)

一,图像预处理

1,加载图像

2,绘制目标区域大致ROI

鉴于图像情况个人建议可以采用

create_drawing_object_rectangle2  ||  draw_rectangle2   ||   draw_rectangle2_mod

进行封装

3,锁定抠出目标区域

二值化提取区域然后进行区域膨胀(这一步主要是扣取模板图像,个人采用 threshold 算子提取,shape_trans生成多边形,dilation_circle进行区域膨胀)

二,创建create_shape_model用以定位

num_levels        # 金字塔的层数
angle_start        # 模板旋转的起始角度
angle_extent     # 模板旋转角度范围
angle_step        # 旋转角度的步长
optimization      # 模板优化和模板创建方法
metric               # 匹配方法设置
contrast            # 设置对比度
min_contrast    # 设置最小对比度

三,验证find_shape_model定位效果

四,创建差分模型

1,选择图像文件夹路径

FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();

2,创建差分模型(CreateVariationModel参数最好是开放,小编Demo案例直接写死)

 private void btn_create_variation_model_Click(object sender, EventArgs e){try{hv_VarModelID.Dispose();HOperatorSet.CreateVariationModel(imageWidth, imageHeight, "byte", "standard",out hv_VarModelID);laTicps2.ForeColor = Color.Green;laTicps2.Text = "创建差异模型成功";}catch{laTicps2.ForeColor = Color.Red;laTicps2.Text = "创建差异模型失败";}}

3,训练差分模型(养成良好的内存管理习惯很重要)

 private void btn_train_variation_model_Click(object sender, EventArgs e){try{DirectoryInfo TheFolder = new DirectoryInfo(fileName);//文件路径for (int i = 0; i < TheFolder.GetFiles().Length; i++)//遍历文件夹{if (TheFolder.GetFiles()[i].Length > 0 && (TheFolder.GetFiles()[i].Extension == ".png" || TheFolder.GetFiles()[i].Extension == ".bmp"))//或者jpg,png 文件大小要大于0且是图片文件{Application.DoEvents();HOperatorSet.ReadImage(out HIMage, fileName + "\\" + tifNames[i]);FitImage(HIMage, hWC);HTuple angle_start2, angle_extent2, MinScore, matchNum, MaxOverlap, SubPixel, numLeave, greediness;angle_start2 = (new HTuple(Convert.ToDouble(tbx_angle_start2.Text))).TupleRad();angle_extent2 = (new HTuple(Convert.ToDouble(tbx_angle_extent2.Text))).TupleRad();MinScore = Convert.ToDouble(tbx_MinScore.Text);matchNum = Convert.ToDouble(tbx_matchNum.Text);MaxOverlap = Convert.ToDouble(tbx_MaxOverlap.Text);SubPixel = cbx_SubPixel.Text;numLeave = Convert.ToDouble(tbx_numLeave.Text);greediness = Convert.ToDouble(tbx_greediness.Text);HTuple hv_Column = new HTuple(), hv_Angle = new HTuple();HTuple hv_Score = new HTuple(), hv_Row = new HTuple();hv_Row.Dispose(); hv_Column.Dispose(); hv_Angle.Dispose(); hv_Score.Dispose();HOperatorSet.FindShapeModel(HIMage, hv_ModelID, angle_start2, angle_extent2, MinScore, matchNum, MaxOverlap, SubPixel, numLeave, greediness, out hv_Row, out hv_Column, out hv_Angle, out hv_Score);HTuple hv_HomMat2D = new HTuple();HObject ho_TraingImage = null, ho_ImageAffineTrans = null;HOperatorSet.GenEmptyObj(out ho_ImageAffineTrans);HOperatorSet.GenEmptyObj(out ho_TraingImage);//创建一个矩阵将当前图像变换到模板位置hv_HomMat2D.Dispose();HOperatorSet.VectorAngleToRigid(hv_Row, hv_Column, hv_Angle, hv_SRow, hv_SColumn,0, out hv_HomMat2D);//把当前图像变换到参照位置ho_ImageAffineTrans.Dispose();HOperatorSet.AffineTransImage(HIMage, out ho_ImageAffineTrans, hv_HomMat2D,"constant", "false");//把训练模型图像锁定出来ho_TraingImage.Dispose();HOperatorSet.ReduceDomain(ho_ImageAffineTrans, ho_RegionDilation, out ho_TraingImage);//训练模板HOperatorSet.TrainVariationModel(ho_TraingImage, hv_VarModelID);//操作提示laTicps.Text = "当前正在训练" + (i + 1) + "/" + (TheFolder.GetFiles().Length) + "张图像";Thread.Sleep(1000);}}laTicps2.ForeColor = Color.Green;laTicps2.Text = "训练模型成功";}catch{laTicps2.ForeColor = Color.Red;laTicps2.Text = "训练模型失败";}}

4,确定最终差分模型

PrepareVariationModel

5,查看差分模型效果区域图像

五,应用验证

private void btn_getResult_Click(object sender, EventArgs e)
{HTuple angle_start2, angle_extent2, MinScore, matchNum, MaxOverlap, SubPixel, numLeave, greediness;angle_start2 = (new HTuple(Convert.ToDouble(tbx_angle_start2.Text))).TupleRad();angle_extent2 = (new HTuple(Convert.ToDouble(tbx_angle_extent2.Text))).TupleRad();MinScore = Convert.ToDouble(tbx_MinScore.Text);matchNum = Convert.ToDouble(tbx_matchNum.Text);MaxOverlap = Convert.ToDouble(tbx_MaxOverlap.Text);SubPixel = cbx_SubPixel.Text;numLeave = Convert.ToDouble(tbx_numLeave.Text);greediness = Convert.ToDouble(tbx_greediness.Text);HTuple hv_Column = new HTuple(), hv_Angle = new HTuple();HTuple hv_Score = new HTuple(), hv_Row = new HTuple();hv_Row.Dispose(); hv_Column.Dispose(); hv_Angle.Dispose(); hv_Score.Dispose();HOperatorSet.FindShapeModel(HIMage, hv_ModelID, angle_start2, angle_extent2, MinScore, matchNum, MaxOverlap, SubPixel, numLeave, greediness, out hv_Row, out hv_Column, out hv_Angle, out hv_Score);//创建一个矩阵将当前图像变换到模板位置HTuple hv_HomMat2D = new HTuple();HTuple hv_Number = new HTuple();HObject ho_ImageAffineTrans = null, ho_CheckImage = null;HObject ho_CheckRegion = null, ho_ConnectedRegions = null, ho_SelectedRegions = null;HOperatorSet.GenEmptyObj(out ho_ImageAffineTrans);HOperatorSet.GenEmptyObj(out ho_CheckImage);HOperatorSet.GenEmptyObj(out ho_CheckRegion);HOperatorSet.GenEmptyObj(out ho_ConnectedRegions);HOperatorSet.GenEmptyObj(out ho_SelectedRegions);hv_HomMat2D.Dispose();HOperatorSet.VectorAngleToRigid(hv_Row, hv_Column, hv_Angle, hv_SRow, hv_SColumn,0, out hv_HomMat2D);//把当前图像变换到参照位置ho_ImageAffineTrans.Dispose();HOperatorSet.AffineTransImage(HIMage, out ho_ImageAffineTrans, hv_HomMat2D,"constant", "false");//把训练模型图像锁定出来ho_CheckImage.Dispose();HOperatorSet.ReduceDomain(ho_ImageAffineTrans, ho_RegionDilation, out ho_CheckImage);//获取模板图像与差异化图像的差分区域ho_CheckRegion.Dispose();HOperatorSet.CompareVariationModel(ho_CheckImage, out ho_CheckRegion, hv_VarModelID);//联通区域断开ho_ConnectedRegions.Dispose();HOperatorSet.Connection(ho_CheckRegion, out ho_ConnectedRegions);//根据要求筛选区域ho_SelectedRegions.Dispose();HOperatorSet.SelectShape(ho_ConnectedRegions, out ho_SelectedRegions, "area","and", 100, 99999);//判断及输出缺陷区域hv_Number.Dispose();HOperatorSet.CountObj(ho_SelectedRegions, out hv_Number);HOperatorSet.DispObj(ho_ImageAffineTrans, HW);HObject ho_ModelContours;HOperatorSet.GenEmptyObj(out ho_ModelContours);ho_ModelContours.Dispose();HOperatorSet.GetShapeModelContours(out ho_ModelContours, hv_ModelID, 1);HOperatorSet.VectorAngleToRigid(0, 0, 0, hv_SRow, hv_SColumn,0, out HTuple homMat2D);HOperatorSet.AffineTransContourXld(ho_ModelContours, out HObject ho_ModelContours1, homMat2D);HW.SetColor("green");HW.DispObj(ho_ModelContours1);if (hv_Number>0){HW.SetDraw("fill");HW.SetLineWidth(2);HW.SetColor("red");//显示ROIHOperatorSet.DispObj(ho_SelectedRegions, HW);ticps3.ForeColor = Color.Red;ticps3.Text = "NG";}else{ticps3.ForeColor = Color.Green;ticps3.Text = "OK";}}


http://www.ppmy.cn/news/1569733.html

相关文章

CSS的媒体查询语法

CSS的媒体查询语法 常见的媒体类型常见的特性示例 CSS的媒体查询语法可以根据不同的设备特性&#xff08;如屏幕尺寸、分辨率等&#xff09;应用不同的样式。基本语法如下&#xff1a; media 媒体类型 and (特性: 值) {/* 样式规则 */ }常见的媒体类型 screen&#xff1a;用于…

如何用hooks实现redux?

使用 Hooks 实现 Redux 的功能可以通过 useReducer 和 useContext 来实现。下面是一个简单的示例,演示如何用 Hooks 创建一个基本的 Redux-like 状态管理。 1. 创建 Redux Store 首先,创建一个 reducer 函数来管理状态变化。 // reducer.js const initialState = {count: 0…

重生之我在异世界学编程之C语言:深入指针篇(上)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文&#xff08;1&#xff09;内置数…

C# Winform制作一个登录系统

using System; using System.Collections; 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 登录 {p…

PyDeequ库在AWS EMR启动集群中数据质量检查功能的配置方法和实现代码

PyDeequ是一个基于Apache Spark的Python API&#xff0c;专门用于定义和执行“数据单元测试”&#xff0c;从而在大规模数据集中测量数据质量。 PyDeequ框架在PySpark代码中提供了全面的数据质量检查功能&#xff0c;能够帮助用户&有效地监控和提升大规模数据集的数据质量。…

[JavaWeb]搜索表单区域

一.注意事项 设置外边距:margin:(参数可省去部分)上 下 左 右 二.源代码 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <title>Tlias智能学习辅助系统</title> <style> /* 导航栏样…

华为防火墙初级命令配置

需求&#xff1a; 1.VLAN2属于办公区VLAN3属于生产区 2.办公区pc在工作日时间&#xff08;周一到周五&#xff0c;早八到晚六&#xff09;可以正常访问OAserver&#xff0c;其他时间不容许 3.办公区pc可以在任意时间访问webserver 4.生产区pc可以在任意时刻访问OAserver&#x…

DeepSeek大模型介绍、本地化部署与使用!【AI大模型】

一、DeepSeek 是什么&#xff1f; 1.技术定位 专注大模型与AGI研究&#xff0c;开发高性能基座模型&#xff08;如 DeepSeek LLM 系列&#xff09;&#xff0c;支持长文本、多模态、代码生成等复杂任务。 提供开源模型&#xff08;如 DeepSeek-MoE、DeepSeek-V2&#xff09;…