廢話不多說上源碼
覺得帖子有用給點個贊哈
先來個效果圖
下邊的是源碼,自己新建一個文件粘貼進去,包含到您現在的項目 中。這串源碼后邊是使用方法。
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();