C#圆形卡尺测量程序基于halcon

废话不多说上源码

觉得帖子有用给点个赞哈在这里插入图片描述

先来个效果图
在这里插入图片描述

下边的是源码,自己新建一个文件粘贴进去,包含到您现在的项目 中。这串源码后边是使用方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HalconDotNet;public class CircleMeasure{/// <summary>/// 检测形态信息/// </summary>public Metrology_INFO m_MetrologyInfo;//圆形测量参数对象public Circle_INFO m_CircleInfo;//圆形测量基准圆形参数对象public Circle_INFO m_OutCircleInfo;//圆形测量完成参数对象#region 卡尺圆形测量参数信息/// <summary>/// 圆信息/// </summary>public struct Circle_INFO{public double Row_center, Column_center, Radius, StartPhi, EndPhi;public string PointOrder;}/// <summary>/// 测量信息/// </summary>public struct Metrology_INFO{public double Length1, Length2, Threshold, MeasureDis;public HTuple ParamName, ParamValue;public int PointsOrder;}#endregion/// <圆形测量参数对象>/// /// </summary>/// <param name="_length1"></长/2>/// <param name="_length2"></宽/2>/// <param name="_threshold"></阈值>/// <param name="_measureDis"></间隔>/// <param name="_paraName"></参数名>/// <param name="_paraValue"></参数值>/// <param name="_pointsOrder"></点顺序>public void MetrologyINFOSet(double _length1, double _length2, double _threshold, double _measureDis, HTuple _paraName, HTuple _paraValue, int _pointsOrder){m_MetrologyInfo.Length1 = _length1;                        // 长/2m_MetrologyInfo.Length2 = _length2;                        // 宽/2m_MetrologyInfo.Threshold = _threshold;                    // 阈值m_MetrologyInfo.MeasureDis = _measureDis;                  //间隔m_MetrologyInfo.ParamName = _paraName;                     //参数名m_MetrologyInfo.ParamValue = _paraValue;                   //参数值m_MetrologyInfo.PointsOrder = _pointsOrder;                //点顺序 0位默认,1 顺时针,2 逆时针}/// <圆形测量基准圆形参数对象参数设置>/// /// </summary>/// <中心Y坐标="m_Row_center"></中心Y坐标>/// <中心X坐标="m_Column_center"></中心X坐标>/// <半径="m_Radius"></半径>/// <param name="m_StartPhi"></开始角度>/// <param name="m_EndPhi"></结束角度>/// <param name="m_PointOrder"></点顺序>public void CircleINFOSet(double m_Row_center, double m_Column_center, double m_Radius, double m_StartPhi, double m_EndPhi, string m_PointOrder){m_CircleInfo.Row_center = m_Row_center;m_CircleInfo.Column_center = m_Column_center;m_CircleInfo.Radius = m_Radius;m_CircleInfo.StartPhi = m_StartPhi;m_CircleInfo.EndPhi = m_EndPhi;m_CircleInfo.PointOrder = m_PointOrder;//点顺序 0位默认,1 顺时针,2 逆时针}/// <summary>/// 检测圆/// </summary>/// <param name="inImage">输入图像</param>/// <param name="inCircle">输入圆</param>/// <param name="inMetrology">输入形态学</param>/// <param name="outCircle">输出圆</param>/// <param name="outR">输出行坐标</param>/// <param name="outC">输出列坐标</param>/// <param name="outMeasureXLD">输出检测轮廓</param>public void MeasureCircle(HImage inImage, Circle_INFO inCircle, Metrology_INFO inMetrology, out Circle_INFO outCircle, out HTuple outR, out HTuple outC, out HXLDCont outMeasureXLD){HMetrologyModel hMetrologyModel = new HMetrologyModel();try{outCircle = new Circle_INFO();HTuple CircleResult = new HTuple();HTuple CircleInfo = new HTuple();CircleInfo.Append(new HTuple(new double[] { inCircle.Row_center, inCircle.Column_center, inCircle.Radius }));hMetrologyModel.AddMetrologyObjectGeneric(new HTuple("circle"), CircleInfo, new HTuple(inMetrology.Length1),new HTuple(inMetrology.Length2), new HTuple(1), new HTuple(inMetrology.Threshold), inMetrology.ParamName, inMetrology.ParamValue);hMetrologyModel.ApplyMetrologyModel(inImage);outMeasureXLD = hMetrologyModel.GetMetrologyObjectMeasures("all", "all", out outR, out outC);CircleResult = hMetrologyModel.GetMetrologyObjectResult(new HTuple("all"), new HTuple("all"), new HTuple("result_type"), new HTuple("all_param"));if (CircleResult.TupleLength() >= 3){outCircle.Row_center = CircleResult[0].D;outCircle.Column_center = CircleResult[1].D;outCircle.Radius = CircleResult[2].D;}hMetrologyModel.Dispose();}catch (Exception ex){outCircle = new Circle_INFO();outR = new HTuple();outC = new HTuple();outMeasureXLD = new HXLDCont();hMetrologyModel.Dispose();//异常写入日志文件// MessageBox.Show(ex.Message);}}/// <summary>/// 根据位置变换圆/// </summary>/// <param name="homMat">变换关系</param>/// <param name="circle">圆</param>public static void AffineCircle(HHomMat2D homMat, ref Circle_INFO circle){double row, col, phi;homMat.AffineTransPixel(circle.Row_center, circle.Column_center, out row, out col);phi = ((HTuple)homMat[0]).TupleAcos().D;circle.Row_center = row;circle.Column_center = col;circle.StartPhi += phi;circle.EndPhi += phi;}}

接下来介绍使用方法

//new个CircleMeasure的对象出来
public CircleMeasure mCircleMeasure = new CircleMeasure();
//卡尺圆形测量数据初始化try
{mCircleMeasure.CircleINFOSet(0, 0, 50, 0, 2 * 3.14, "positive");mCircleMeasure.MetrologyINFOSet(20,20,30,5,"measure_distance",1,0);
}catch { }开始进行测量//定义各个需要的变量HTuple outR = null, outC = null;HTuple hv_Row = null, hv_Column = null, hv_Radius = null;HTuple hv_Row11 = null, hv_Column11 = null, hv_Row12 = null, hv_Column12 = null, hv_Angle1 = null, hv_Angle2 = null;HXLDCont m_MeasureXLD = new HXLDCont();//LeftUpCamImageDisplay是halcon显示图像窗口控件名称LeftUpCamImageDisplay.HalconWindow.SetColor("red");LeftUpCamImageDisplay.HalconWindow.SetDraw("margin");//[DrawCircleMod介绍](https://blog.csdn.net/cashmood/article/details/99756580)HOperatorSet.DrawCircleMod(LeftUpCamImageDisplay.HalconWindow,1296 ,972 ,140 ,out hv_Row, out hv_Column, out hv_Radius);//设置测量参数mCircleMeasure.CircleINFOSet(hv_Row, hv_Column, hv_Radius, hv_Angle1, hv_Angle2, "positive");mCircleMeasure.MetrologyINFOSet(hv_Radius / 5, hv_Radius / 50, 30, 5, new HTuple(("measure_distance")),(new HTuple(10)), 0);mCircleMeasure.MeasureCircle(LeftUpCamCurrentImg, mCircleMeasure.m_CircleInfo, mCircleMeasure.m_MetrologyInfo, out mCircleMeasure.m_OutCircleInfo, out outR, out outC, out m_MeasureXLD);//显示测量结果LeftUpCamImageDisplay.HalconWindow.DispObj(LeftUpCamCurrentImg);LeftUpCamImageDisplay.HalconWindow.SetColor("blue");LeftUpCamImageDisplay.HalconWindow.SetDraw("margin");m_MeasureXLD.DispObj(LeftUpCamImageDisplay.HalconWindow);LeftUpCamImageDisplay.HalconWindow.SetTposition(50, 10);LeftUpCamImageDisplay.HalconWindow.WriteString("  CenterRow:" + mCircleMeasure.m_OutCircleInfo.Row_center.ToString() + "     CenterCol:" + mCircleMeasure.m_OutCircleInfo.Column_center.ToString() + "   Radius::" + mCircleMeasure.m_OutCircleInfo.Radius.ToString());m_MeasureXLD.Dispose();

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

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

相关文章

MySQL松散索引扫描与紧凑索引扫描

什么是松散索引&#xff1f; 答&#xff1a;实际上就是当MySQL 完全利用索引扫描来实现GROUP BY 的时候&#xff0c;并不需要扫描所有满足条件的索引键即可完成操作得出结果。 要利用到松散索引扫描实现GROUP BY&#xff0c;需要至少满足以下几个条件&#xff1a;◆ GROUP BY 条…

算法马拉松24

算法马拉松24 A 小C的多边形 题意&#xff1a;n1个点的多边形。给外圈的边标记上1~n&#xff0c;里圈的边也标记上1~n&#xff0c;使得对于一个外圈相邻点与中间点构成的三角形的边权之和都相等。\(n \le 10^6\) 题解&#xff1a;显然每个三角形权值和为\(\frac{3(n1)}{2}\) 一…

HUD2795 线段树(单点更新)

题目中给出的h和w范围均大&#xff0c;其实n的最大范围才200000&#xff0c;所以我们建立的线段树大小为min(h,n),线段树的每一个节点包含一个变量c&#xff0c;记录当前区间内还剩下的可以put on的最大长度。插入一个数时&#xff0c;如果该数大于该区间最大值&#xff0c;则返…

科维PLC运行时系统ProConOS embedded CLR 2.2 特定应用

ProConOS embedded CLR是新型的开放式标准化PLC运行时系统&#xff0c;符合IEC 61131标准&#xff0c;可执行不同的自动化任务&#xff08;PLC、PAC、运动控制、CNC、机器人和传感器&#xff09;。   通过采用国际标准的微软中间语言&#xff08;依据IEC/ISO 23271标准为MSIL…

linux下vi命令大全

进入vi的命令 vi filename :打开或新建文件&#xff0c;并将光标置于第一行首 vi n filename &#xff1a;打开文件&#xff0c;并将光标置于第n行首 vi filename &#xff1a;打开文件&#xff0c;并将光标置于最后一行首 vi /pattern filename&#xff1a;打开文件&…

set()与get()详细解答(C#)

这几天在搬砖时候用到了set()与get()&#xff0c;同事问了我一些问题&#xff0c;我打算在博客中总结一下。 觉得帮助到了您&#xff0c;帮我点个赞哦。 属性访问器 其实说白了就是操作一个属性&#xff0c;更通俗一点说就是对一个变量的取值与赋值。 先来看get() get 访问…

IM应用中如何计算富文本的高度

背景 在开发IM的项目过程中&#xff0c;经常会有出现一些需要计算DOM高度&#xff0c;然后超出若干行隐藏等需求。很多时候&#xff0c;需要计算高度的DOM元素都是动态生成的&#xff0c;我们无法在数据渲染前获取到它的高度。 如果没有任何交互&#xff0c;我们可以通过CSS来实…

G代码 机器人的CNC实现

&#xfeff;  控制铣削工作台和工件的NC程序&#xff0c;通过CAD软件创建&#xff0c;这些NC程序与特定的机器类型相关。 NC程序在笛卡尔坐标系中动作的描述&#xff0c;对于需要确保一个明确的变换轴位置的关节型的机器人来说&#xff0c;缺少附加的状态和旋转信息。传…

IScroll5中文API整理,用法与参考

IScroll是移动页面上被使用的一款仿系统滚动插件。IScroll5相对于之前的IScroll4改进了许多&#xff0c;使得大家可以更方便的定制所需的功能了。 做项目的时候正好用到了这个插件&#xff0c;自己做了一下总结&#xff0c;发在这里方便大家学习IScroll5。 官网&#xff1a;htt…

Linux 安装USB摄像头

sudo apt-get updatesudo apt-get install fswebcamsudo apt-get install mplayersudo apt-get install alsamixer安装完毕ls /dev查找设备是否有video0这个设备sudo mplayer tv:// 可以看到摄像内容转载于:https://www.cnblogs.com/smartkeke/p/6820426.html

struct x264_t 维护着CODEC的诸多重要信息

//x264_t结构体维护着CODEC的诸多重要信息struct x264_t{/* encoder parameters ( 编码器参数 )*/x264_param_t param;x264_t *thread[X264_SLICE_MAX];/* bitstream output ( 字节流输出 ) */struct{int i_nal;x264_nal_t nal[X264_NAL_MAX];int i_bitstr…

如何判断一条曲线是否自己相交?

今天看到群里有人在问这个问题&#xff0c;想了一个解决办法。 我们首先作假设&#xff0c;如果一条曲线有交点&#xff0c;那么它就是相交的对吧。可能大家想的都是这样&#xff0c;就开始找各种方法去识别交点。 我们换个角度想一下&#xff1a;是不是我们判断这条曲线是否带…

XML 与网络的数据传输

&#xfeff;&#xfeff;XML 与网络的数据传输

hdu 5813 Elegant Construction

水题 题意&#xff1a;有n个城市&#xff0c;给你每个城市能到达城市的数量&#xff0c;要你构图&#xff0c;输出有向边&#xff0c;要求无环&#xff0c;输出任意的解 例&#xff1a; Sample Input 332 1 021 143 1 1 0Sample OutputCase #1: Yes21 22 3Case #2: NoCase #3: …

Redis实战笔记

Redis 数据库 一、 概要 1. 特点 用于抽象数据类型的 DSL内存存储基础数据结构 API编码风格避免代码复杂两层 API以优化为乐2. 数据类型 键值对&#xff08;字符串->字符串&#xff09;哈希列表&#xff08;链表&#xff09;集合&#xff1a;差并交有序集合 列表 集合位图…

内存申请与一级二级指针

1.如果是函数内进行内存申请&#xff0c;很简单&#xff0c;标准用法就可以了&#xff1a; test(){int *array;array(int *)malloc(sizeof(int)*10);//申请10*4 bytes&#xff0c;即10个单位的int内存单元}注意&#xff0c;malloc使用简单&#xff0c;但是注意参数和返回值&…

halcon相机标定及图像矫正(代码)

侵删 1 halcon相机标定和图像矫正 对于相机采集的图片&#xff0c;会由于相机本身和透镜的影响产生形变&#xff0c;通常需要对相机进行标定&#xff0c;获取相机的内参或内外参&#xff0c;然后矫正其畸变。相机畸变主要分为径向畸变和切向畸变&#xff0c;其中径向畸变是由透…

找寻一个邮箱

import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern;public class zhengze {public static void main(String[] args) { //1.创建一个正则表达式对象Pattern pPattern.compile("[0-9]{6}"); //2.获得匹配器 String s…

先弄个XML解析器代码抄一抄 慢慢研究 O(∩_∩)O哈哈~

&#xfeff;&#xfeff;出处&#xff1a;http://bbs.csdn.net/topics/390229172 已经自我放逐好几年了.打算去上班得了.在最后的自由日子里,做点有意义的事吧... 先来下载地址 http://www.kuaipan.cn/file/id_12470514853353274.htm 已经在很多正式,非正式的场合…

紫书 例题8-10 UVa 714 (二分答案)

这道题让最大值最小&#xff0c; 显然是二分答案当题目求的是最大值最小&#xff0c; 最小值最大&#xff0c; 这个时候就要想到二分答案为什么可以二分答案呢&#xff0c; 因为这个时候解是单调性的&#xff0c; 如果简单粗暴一点就全部枚举一遍&#xff0c; 验证答案。但是因…