C#Halcon找线封装

       利用CreateMetrologyModel封装找线工具时,在后期实际应用调试时容易把检测极性搞混乱,造成检测偏差,基于此,此Demo增加画线后检测极性的指引,首先看一下效果

加载测试图片

d4eb66a6bc484cb3948a1f92b60831c8.png

画线

114504d9427649f9a650ea1704869154.png

确定后指引效果

b158feb806d744119881cf4636c18e91.png

找线效果

bdf95d037ab5428a87d8b765329195d4.png

修改显示

fa27f92450cb49b9a9015a0634867b6b.png

UI代码

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;
using ViewControl;
using HalconDotNet;
using System.Reflection.Emit;
using static System.Net.Mime.MediaTypeNames;
namespace DeepLearningTest1
{public partial class Form1 : Form{HalconView HW;public static MyDraw myDraw =new MyDraw();HObject HIMage = new HObject(), ho_Arrows=new HObject();HObject ho_Clip, ho_Cross, ho_Fit;Double R1, R2, C1, C2;bool DisDraw=false, DisClip=false, DisCross=false, DisFit=false;public Form1(){InitializeComponent();HW = new HalconView();HW.HWindowControl.BackColor = Color.White;splitContainer1.Panel1.Controls.Add(HW);HW.Dock = DockStyle.Fill;}       /// <summary>/// 加载图像/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button1_Click(object sender, EventArgs e){try{OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.Filter = "图片文件(*.bmp;*.jpg;*.gif;*.png;*.tiff;*.tif)|*.bmp;*.jpg;*.gif;*.png;*.tiff;*.tif";openFileDialog.RestoreDirectory = true;openFileDialog.FilterIndex = 1;if (openFileDialog.ShowDialog() == DialogResult.OK){label3.Text = openFileDialog.FileName;HOperatorSet.ReadImage(out HIMage, label3.Text);HW.DispImage(HIMage, true);}}catch (Exception ex){MessageBox.Show("加载图片失败  " + ex.ToString());}}/// <summary>/// 画线/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_DrawROI_Click(object sender, EventArgs e){try{if (!HIMage.IsInitialized()) { MessageBox.Show("图片为空"); return; }HSystem.SetSystem("clip_region", "false");HW.Focus();HW.DrawLine(out HObject Line,out HTuple r1, out HTuple c1, out HTuple r2, out HTuple c2);R1 = r1;R2 = r2;C1 = c1;C2 = c2;tBx_R1.Text = R1.ToString("f3");tBx_C1.Text = C1.ToString("f3");tBx_R2.Text = R2.ToString("f3");tBx_C2.Text = C2.ToString("f3");myDraw.myDrawCoordinateSystem(out ho_Arrows, r1, c1, r2, c2, Convert.ToInt32(tBx_perpendicular.Text), Convert.ToInt32(tBx_Arrow.Text));HW.HalconWindow.ClearWindow();HW.HalconWindow.SetColor("green");HW.DispObject(HIMage);HW.DispObject(ho_Arrows);}catch (Exception ex){MessageBox.Show("设置区域失败  " + ex.ToString());}}/// <summary>/// 找线/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_FindLine_Click(object sender, EventArgs e){HTuple hv_L1 = new HTuple(), hv_L2 = new HTuple(), hv_NumMatch = new HTuple();HTuple hv_Threshold = new HTuple(), hv_Select = new HTuple();HTuple hv_Type = new HTuple(), hv_MetrologyHandle = new HTuple();HTuple hv_Index = new HTuple(), hv_Row1 = new HTuple();HTuple hv_Column1 = new HTuple(), hv_Parameter = new HTuple();HOperatorSet.GenEmptyObj(out ho_Clip);HOperatorSet.GenEmptyObj(out ho_Cross);HOperatorSet.GenEmptyObj(out ho_Fit);hv_L1.Dispose();hv_L1 = Convert.ToInt32(tBx_L1.Text);hv_L2.Dispose();hv_L2 = Convert.ToInt32(tBx_L2.Text);hv_NumMatch.Dispose();hv_NumMatch = Convert.ToInt32(tBx_num.Text);hv_Threshold.Dispose();hv_Threshold = Convert.ToInt32(tBx_Thre.Text);hv_Select.Dispose();hv_Select = cBx_select.Text;hv_Type.Dispose();hv_Type = cBx_P.Text;hv_MetrologyHandle.Dispose();HOperatorSet.CreateMetrologyModel(out hv_MetrologyHandle);hv_Index.Dispose();HOperatorSet.AddMetrologyObjectLineMeasure(hv_MetrologyHandle, R1, C1,R2, C2, 1, 1, 1, 30, new HTuple(), new HTuple(), out hv_Index);HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, "all", "measure_length1",hv_L1);HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, "all", "measure_length2",hv_L2);HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, "all", "num_measures",hv_NumMatch);//边缘阈值HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, "all", "measure_threshold",hv_Threshold);//边缘选择HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, "all", "measure_select",hv_Select);//过度方式if ((int)(new HTuple(hv_Type.TupleEqual("由白到黑"))) != 0){HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, "all", "measure_transition","positive");}else if ((int)(new HTuple(hv_Type.TupleEqual("由黑到白"))) != 0){HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, "all", "measure_transition","negative");}else if ((int)(new HTuple(hv_Type.TupleEqual("全部"))) != 0){HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, "all", "measure_transition","all");}HOperatorSet.ApplyMetrologyModel(HIMage, hv_MetrologyHandle);try{//测量点ho_Clip.Dispose(); hv_Row1.Dispose(); hv_Column1.Dispose();HOperatorSet.GetMetrologyObjectMeasures(out ho_Clip, hv_MetrologyHandle,"all", "all", out hv_Row1, out hv_Column1);ho_Cross.Dispose();HOperatorSet.GenCrossContourXld(out ho_Cross, hv_Row1, hv_Column1, 6, 0.785398);//测量直线hv_Parameter.Dispose();HOperatorSet.GetMetrologyObjectResult(hv_MetrologyHandle, 0, "all", "result_type",(((new HTuple("row_begin")).TupleConcat("column_begin")).TupleConcat("row_end")).TupleConcat("column_end"), out hv_Parameter);using (HDevDisposeHelper dh = new HDevDisposeHelper()){ho_Fit.Dispose();HOperatorSet.GenContourPolygonXld(out ho_Fit, ((hv_Parameter.TupleSelect(0))).TupleConcat(hv_Parameter.TupleSelect(2)), ((hv_Parameter.TupleSelect(1))).TupleConcat(hv_Parameter.TupleSelect(3)));}HOperatorSet.ClearMetrologyModel(hv_MetrologyHandle);}catch (Exception){MessageBox.Show("找线失败");}}private void checkBox4_CheckedChanged(object sender, EventArgs e){if (checkBox4.Checked){DisFit = true;}else{DisFit = false;}}private void checkBox3_CheckedChanged(object sender, EventArgs e){if (checkBox3.Checked){DisCross = true;}else{DisCross = false;}}private void checkBox2_CheckedChanged(object sender, EventArgs e){if (checkBox2.Checked){DisClip = true;}else{DisClip = false;}}private void checkBox1_CheckedChanged(object sender, EventArgs e){if (checkBox1.Checked){DisDraw = true;}else{DisDraw = false;}}/// <summary>/// 显示结果/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_DisResult_Click(object sender, EventArgs e){if (DisDraw){HW.HalconWindow.SetColor("white");HW.DispObject(ho_Arrows);}if (DisClip){HW.HalconWindow.SetColor("blue");HW.DispObject(ho_Clip);}if (DisCross){HW.HalconWindow.SetColor("yellow");HW.DispObject(ho_Cross);}if (DisFit){HW.HalconWindow.SetColor("orange red");HW.DispObject(ho_Fit);}}}
}

 

 

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

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

相关文章

【linux系统之redis6】redis的基础命令使用及springboot连接redis

redis的基础命令很多&#xff0c;大部分我们都可以在官网上找到&#xff0c;真的用的时候可以去官网找&#xff0c;不用全部记住这些命令 redis通用的基础命令的使用 代码测试 string类型常见的命令 key值的结构&#xff0c;可以区分不同的需求不同的业务名字 hash类型 创建…

ISP各模块功能介绍

--------声明&#xff0c;本文为转载整理------- ISP各个模块功能介绍&#xff1a; 各模块前后效果对比&#xff1a; 黑电平补偿&#xff08;BLC&#xff09; 在理想情况下&#xff0c;没有光照射的像素点其响应值应为0。但是&#xff0c;由于杂质、受热等其它原因的影响&…

前缀和练习

【模版】前缀和 【模板】前缀和_牛客题霸_牛客网 思路 要想快速找出某一连续区间的和&#xff0c;我们就要使用前缀和算法。 其实本质是再创建一个dp数组&#xff0c;每进一次循环加上原数组的值&#xff08;dp代表arr的前n项和&#xff09;&#xff1a; vector<int>…

3. 【Vue实战--孢子记账--Web 版开发】--登录大模块

从这篇文章开始我们就进入到了孢子记账的前端开发&#xff0c;在本专栏中我默认大家的电脑上都已经配置好了开发环境。下面我们一起开始编写孢子记账的Web版吧。 一、功能 登录大模块功能包括注册、登录和找回密码功能&#xff0c;在本篇文章中我只会展示注册界面的实现&…

【2024年华为OD机试】 (A卷,100分)- 端口合并(Java JS PythonC/C++)

一、问题描述 题目描述 有 M 个端口组 (1 < M < 10)&#xff0c; 每个端口组是长度为 N 的整数数组 (1 < N < 100)&#xff0c; 如果端口组间存在 2 个及以上不同端口相同&#xff0c;则认为这 2 个端口组互相关联&#xff0c;可以合并。 输入描述 第一行输入端…

73.矩阵置零 python

矩阵置零 题目题目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a; 题解思路分析Python 实现代码代码解释提交结果 题目 题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例…

基于华为ENSP的OSPF状态机、工作过程、配置保姆级别详解(2)

本篇技术博文摘要 &#x1f31f; 基于华为enspOSPF状态机、OSPF工作过程、.OSPF基本配置等保姆级别具体详解步骤&#xff1b;精典图示举例说明、注意点及常见报错问题所对应的解决方法 引言 &#x1f4d8; 在这个快速发展的技术时代&#xff0c;与时俱进是每个IT人的必修课。我…

SOLID原则学习,接口隔离原则

文章目录 1. 定义2. 为什么要遵循接口隔离原则&#xff1f;3. 违反接口隔离原则的例子4. 遵循接口隔离原则的改进5. 总结 1. 定义 接口隔离原则&#xff08;Interface Segregation Principle, ISP&#xff09; 接口隔离原则是面向对象设计中的五大原则&#xff08;SOLID&#…

Jenkins-持续集成、交付、构建、部署、测试

Jenkins-持续集成、交付、构建、部署、测试 一: Jenkins 介绍1> Jenkins 概念2> Jenkins 目的3> Jenkins 特性4> Jenkins 作用 二&#xff1a;Jenkins 版本三&#xff1a;DevOps流程简述1> 持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff0…

从0到机器视觉工程师(六):配置OpenCV和Qt环境

CMake配置OpenCV CMakeLists.txt文件的编写 cmake_minimum_required(VERSION 3.20) project(test_opencv LANGUAGES CXX) #寻找Opencv库 FIND_PACKAGE(OpenCV REQUIRED) include_directories(test_opencv ${OpenCV_INCLUDE_DIRS}) add_executable(test_opencv main.cpp) TARGE…

CDA数据分析师一级经典错题知识点总结(3)

1、SEMMA 的基本思想是从样本数据开始&#xff0c;通过统计分析与可视化技术&#xff0c;发现并转换最有价值的预测变量&#xff0c;根据变量进行构建模型&#xff0c;并检验模型的可用性和准确性。【强调探索性】 2、CRISP-DM模型Cross Industry Standard Process of Data Mi…

【Uniapp-Vue3】v-for列表渲染的用法

如果我们想要重复渲染多个元素&#xff0c;就可以使用v-for进行渲染。 比如我们想要将元素渲染5次&#xff1a; 如果我们想要知道当前元素是渲染的第几个&#xff0c;可以在v-for的时候添加参数index&#xff0c;并在差值表达式中填入index&#xff1a; 则index会以0开始进行渲…

《新闻大厦抢先版》V0.18.105+Dlcs官方学习版

《新闻大厦抢先版》官方版https://pan.xunlei.com/s/VODaeUn3v-ZWVvvmUMfo5AqWA1?pwdnhpz# 建造并不断优化新闻大楼&#xff0c;保障员工权益并及时赶上周日的印刷交期&#xff01; 招募并管理不同职业以登上成功的阶梯&#xff1a;记者、摄像师、勤杂工&#xff0c;除此以外…

解锁3D模型转换:STL转OBJ全攻略

一、3D模型转换的基石&#xff1a;STL与OBJ格式概览 在3D模型的世界里&#xff0c;STL和OBJ格式犹如两大基石&#xff0c;支撑着模型创建、编辑、转换与应用的方方面面。了解它们的特性&#xff0c;是深入探究3D模型转换的关键第一步。 1.1 STL格式深度剖析 STL 全称为Stereo…

RK3568 Android 13 内置搜狗输入法小计

问&#xff1a;为什么写&#xff1f; 答&#xff1a;网上搜出来的都试过了&#xff0c;不行&#xff01;下面直接上代码和注意事项&#xff01; 首先到这个目录&#xff08;/RK3568/Rockchip_Android13_SDK_Release/device/rockchip/rk356x/tl3568_evm/preinstall&#xff09…

windows10下安装Microsoft SQL Server 2016

一、下载安装包 网站&#xff1a;MSDN, 我告诉你 - 做一个安静的工具站 选择需要的版本&#xff0c;点击详细信息&#xff0c;复制ed2k链接&#xff0c;打开eMule或迅雷&#xff0c;新建下载&#xff0c;粘贴链接&#xff0c;开始下载。 下载好的文件是一个.iso镜像文件。 二、…

探索图像编辑的无限可能——Adobe Photoshop全解析

文章目录 前言一、PS的历史二、PS的应用场景三、PS的功能及工具用法四、图层的概念五、调整与滤镜六、创建蒙版七、绘制形状与路径八、实战练习结语 前言 在当今数字化的世界里&#xff0c;视觉内容无处不在&#xff0c;而创建和编辑这些内容的能力已经成为许多行业的核心技能…

IDEA Maven构建时报错:无效的目标发行版17

报错分析 报错原因&#xff1a;Maven 构建时&#xff0c;Java 版本配置不匹配 我安装的JDK版本是1.8&#xff0c;但由于种种原因&#xff0c;Maven构建时指定了 Java 17 作为目标发行版&#xff0c;从而导致错误 解决方案 首先&#xff0c;java -version&#xff0c;查看环…

西电-神经网络基础与应用-复习笔记

此为24年秋研究生课程复习笔记 导论 神经网络的研究方法分为 连接主义&#xff0c;生理学派&#xff0c;模拟神经计算。高度的并行、分布性&#xff0c;很强的鲁棒和容错性。便于实现人脑的感知功能(音频图像的识别和处理)。符号主义&#xff0c;心理学派&#xff0c;基于符号…

Gitlab-Runner配置

原理 Gitlab-Runner是一个非常强大的CI/CD工具。它可以帮助我们自动化执行各种任务&#xff0c;如构建、测试和部署等。Gitlab-Runner和Gitlab通过API通信&#xff0c;接收作业并提交到执行队列&#xff0c;Gitlab-Runner从队列中获取作业&#xff0c;并允许在不同环境下进行作…