Halcon测量专栏-圆倒角

1.前言

1.1什么是圆倒角

圆角是用一段与角的两边相切的圆弧替换原来的角,圆角的大小用圆弧的半径表示。

1.2代码实现方式

针对圆角的特性,由2条直线构成的圆弧,所以圆弧上位于2相交直线的中间。所以先获得2条直线的坐标,获取到2条直线的交点,然后再绘制2条线段的内接圆,然后以交点为起始点,内切圆圆心为终点,做一条线段,在做线段的垂线,相切于圆角,以垂线做为起始点,内切圆圆心作为终点,做N条采样直线,将获取到的采样点拟合成圆即可。
在这里插入图片描述

2.程序

2.1C#和halcon程序

 #region // 计算圆倒角(1:计算2条直线的相切圆,2:求得直线交点到相切圆中心的角度,3:通过角度找出边缘拟合直线,并拟合边缘)
 public static bool RoundChamferR(HObject Image, bool FastSet, 
     HTuple BeginRow1, HTuple BeginCloumn1, HTuple EndRow1,HTuple EndCloumn1, 
     HTuple BeginRow2, HTuple BeginCloumn2, HTuple EndRow2,HTuple EndCloumn2,
     out HObject LineContours, out HTuple ResultRowBegin, out HTuple ResultColumnBegin, out HTuple ResultRowEnd, 
     out HTuple ResultCloumnEnd,
     out HObject LineContours2, out HTuple ResultRowBegin2, out HTuple ResultColumnBegin2, out HTuple ResultRowEnd2, 
     out HTuple ResultCloumnEnd2,
     out double R,out HObject Circle)
 {
     HOperatorSet.GenEmptyObj(out LineContours);
     HOperatorSet.GenEmptyObj(out LineContours2); 
     HOperatorSet.GenEmptyObj(out Circle);
     ResultRowBegin = -1;
     ResultRowEnd = -1;
     ResultColumnBegin = -1;
     ResultCloumnEnd = -1;
     ResultRowBegin2 = -1;
     ResultRowEnd2 = -1;
     ResultColumnBegin2 = -1;
     ResultCloumnEnd2 = -1;
     R = -1;
 <span class="token keyword">try</span>
 <span class="token punctuation">{<!-- --></span>
    
     <span class="token class-name"><span class="token keyword">bool</span></span> line1 <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">,</span> line2 <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
     <span class="token keyword">if</span> <span class="token punctuation">(</span>FastSet<span class="token punctuation">)</span>
     <span class="token punctuation">{<!-- --></span>
         line1 <span class="token operator">=</span> Module<span class="token punctuation">.</span><span class="token function">LineMeasure_</span><span class="token punctuation">(</span>Image<span class="token punctuation">,</span> BeginRow1<span class="token punctuation">,</span> BeginCloumn1<span class="token punctuation">,</span> EndRow1<span class="token punctuation">,</span>  EndCloumn1<span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">80</span><span class="token punctuation">,</span> <span class="token string">"uniform"</span><span class="token punctuation">,</span> <span class="token string">"first"</span><span class="token punctuation">,</span> <span class="token keyword">out</span> LineContours<span class="token punctuation">,</span>
                 <span class="token keyword">out</span> ResultRowBegin<span class="token punctuation">,</span> <span class="token keyword">out</span> ResultColumnBegin<span class="token punctuation">,</span> <span class="token keyword">out</span> ResultRowEnd<span class="token punctuation">,</span>  <span class="token keyword">out</span> ResultCloumnEnd<span class="token punctuation">)</span><span class="token punctuation">;</span>
         line2 <span class="token operator">=</span> Module<span class="token punctuation">.</span><span class="token function">LineMeasure_</span><span class="token punctuation">(</span>Image<span class="token punctuation">,</span> BeginRow2<span class="token punctuation">,</span> BeginCloumn2<span class="token punctuation">,</span> EndRow2<span class="token punctuation">,</span>  EndCloumn2<span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">80</span><span class="token punctuation">,</span> <span class="token string">"uniform"</span><span class="token punctuation">,</span> <span class="token string">"first"</span><span class="token punctuation">,</span> <span class="token keyword">out</span> LineContours2<span class="token punctuation">,</span>
                 <span class="token keyword">out</span> ResultRowBegin2<span class="token punctuation">,</span> <span class="token keyword">out</span> ResultColumnBegin2<span class="token punctuation">,</span> <span class="token keyword">out</span> ResultRowEnd2<span class="token punctuation">,</span>  <span class="token keyword">out</span> ResultCloumnEnd2<span class="token punctuation">)</span><span class="token punctuation">;</span>
     <span class="token punctuation">}</span>
     <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>line1 <span class="token operator">||</span> <span class="token operator">!</span>line2<span class="token punctuation">)</span>
     <span class="token punctuation">{<!-- --></span>
         <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
     <span class="token punctuation">}</span>
     
     HOperatorSet<span class="token punctuation">.</span><span class="token function">IntersectionLines</span><span class="token punctuation">(</span>BeginRow1<span class="token punctuation">,</span> BeginCloumn1<span class="token punctuation">,</span> EndRow1<span class="token punctuation">,</span> EndCloumn1<span class="token punctuation">,</span> BeginRow2<span class="token punctuation">,</span> BeginCloumn2<span class="token punctuation">,</span> EndRow2<span class="token punctuation">,</span> EndCloumn2<span class="token punctuation">,</span>
                 <span class="token keyword">out</span> <span class="token class-name">HTuple</span> row<span class="token punctuation">,</span> <span class="token keyword">out</span> <span class="token class-name">HTuple</span> column<span class="token punctuation">,</span> <span class="token keyword">out</span> <span class="token class-name">HTuple</span> isOverlapping<span class="token punctuation">)</span><span class="token punctuation">;</span>
     HOperatorSet<span class="token punctuation">.</span><span class="token function">LineOrientation</span><span class="token punctuation">(</span> ResultRowBegin<span class="token punctuation">,</span>  ResultColumnBegin<span class="token punctuation">,</span>  ResultRowEnd<span class="token punctuation">,</span>  ResultCloumnEnd<span class="token punctuation">,</span> <span class="token keyword">out</span> <span class="token class-name">HTuple</span> phi1<span class="token punctuation">)</span><span class="token punctuation">;</span>
     HOperatorSet<span class="token punctuation">.</span><span class="token function">LineOrientation</span><span class="token punctuation">(</span>ResultRowBegin2<span class="token punctuation">,</span>  ResultColumnBegin2<span class="token punctuation">,</span>  ResultRowEnd2<span class="token punctuation">,</span>  ResultCloumnEnd2<span class="token punctuation">,</span> <span class="token keyword">out</span> <span class="token class-name">HTuple</span> phi2<span class="token punctuation">)</span><span class="token punctuation">;</span>


     <span class="token class-name"><span class="token keyword">double</span></span> midX <span class="token operator">=</span> <span class="token punctuation">(</span>ResultColumnBegin <span class="token operator">+</span> ResultColumnBegin2<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">;</span>
     <span class="token class-name"><span class="token keyword">double</span></span> midY <span class="token operator">=</span> <span class="token punctuation">(</span>ResultRowBegin <span class="token operator">+</span> ResultRowBegin2<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">;</span>
     <span class="token comment">// 计算两条直线的垂直平分线的斜率</span>
     <span class="token class-name"><span class="token keyword">double</span></span> perpendicularSlope <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token operator">/</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>phi1 <span class="token operator">+</span> phi2<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

     <span class="token comment">// 计算垂直平分线的截距</span>
     <span class="token class-name"><span class="token keyword">double</span></span> intercept <span class="token operator">=</span> midY <span class="token operator">-</span> perpendicularSlope <span class="token operator">*</span> midX<span class="token punctuation">;</span>

     <span class="token comment">// 计算圆心坐标</span>
     <span class="token class-name"><span class="token keyword">double</span></span> circleCenterX <span class="token operator">=</span> <span class="token operator">-</span>perpendicularSlope <span class="token operator">*</span> intercept <span class="token operator">/</span> <span class="token punctuation">(</span>perpendicularSlope <span class="token operator">*</span> perpendicularSlope <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
     <span class="token class-name"><span class="token keyword">double</span></span> circleCenterY <span class="token operator">=</span> perpendicularSlope <span class="token operator">*</span> circleCenterX <span class="token operator">+</span> intercept<span class="token punctuation">;</span>
     HOperatorSet<span class="token punctuation">.</span><span class="token function">LineOrientation</span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> column<span class="token punctuation">,</span> circleCenterY<span class="token punctuation">,</span> circleCenterX<span class="token punctuation">,</span> <span class="token keyword">out</span> <span class="token class-name">HTuple</span> phi<span class="token punctuation">)</span><span class="token punctuation">;</span>
     HOperatorSet<span class="token punctuation">.</span><span class="token function">TupleSin</span><span class="token punctuation">(</span>phi<span class="token punctuation">,</span> <span class="token keyword">out</span> <span class="token class-name">HTuple</span> sin<span class="token punctuation">)</span><span class="token punctuation">;</span>
     HOperatorSet<span class="token punctuation">.</span><span class="token function">TupleCos</span><span class="token punctuation">(</span>phi<span class="token punctuation">,</span> <span class="token keyword">out</span> <span class="token class-name">HTuple</span> cos<span class="token punctuation">)</span><span class="token punctuation">;</span>
     <span class="token class-name">HTuple</span> TY <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> TX <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
     <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name"><span class="token keyword">int</span></span> i <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">22</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> <span class="token number">22</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
     <span class="token punctuation">{<!-- --></span>
         Module<span class="token punctuation">.</span><span class="token function">PointMeasure_</span><span class="token punctuation">(</span>Image<span class="token punctuation">,</span> row<span class="token operator">+</span>i<span class="token operator">*</span>cos<span class="token operator">*</span><span class="token number">3</span><span class="token punctuation">,</span> column<span class="token operator">+</span>i<span class="token operator">*</span>sin<span class="token operator">*</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>ResultRowBegin <span class="token operator">+</span> ResultRowBegin2<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>ResultColumnBegin <span class="token operator">+</span> ResultColumnBegin2<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">40</span><span class="token punctuation">,</span> <span class="token keyword">out</span> <span class="token class-name">HTuple</span> resultRow<span class="token punctuation">,</span> <span class="token keyword">out</span> <span class="token class-name">HTuple</span> resultColumn<span class="token punctuation">)</span><span class="token punctuation">;</span>
         HOperatorSet<span class="token punctuation">.</span><span class="token function">TupleLength</span><span class="token punctuation">(</span>resultRow<span class="token punctuation">,</span> <span class="token keyword">out</span> <span class="token class-name">HTuple</span> length<span class="token punctuation">)</span><span class="token punctuation">;</span>
         <span class="token keyword">if</span> <span class="token punctuation">(</span>length<span class="token operator">!=</span><span class="token number">1</span><span class="token punctuation">)</span>
         <span class="token punctuation">{<!-- --></span>
             <span class="token keyword">continue</span><span class="token punctuation">;</span>
         <span class="token punctuation">}</span>
         TY<span class="token punctuation">[</span>i<span class="token operator">+</span><span class="token number">22</span><span class="token punctuation">]</span> <span class="token operator">=</span> resultRow<span class="token punctuation">;</span>
         TX<span class="token punctuation">[</span>i<span class="token operator">+</span><span class="token number">22</span><span class="token punctuation">]</span> <span class="token operator">=</span> resultColumn<span class="token punctuation">;</span>
     <span class="token punctuation">}</span>
     HOperatorSet<span class="token punctuation">.</span><span class="token function">GenContourPolygonXld</span><span class="token punctuation">(</span><span class="token keyword">out</span> <span class="token class-name">HObject</span> contours<span class="token punctuation">,</span> TY<span class="token punctuation">,</span> TX<span class="token punctuation">)</span><span class="token punctuation">;</span>
     HOperatorSet<span class="token punctuation">.</span><span class="token function">FitCircleContourXld</span><span class="token punctuation">(</span>contours<span class="token punctuation">,</span> <span class="token string">"atukey"</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span>
         <span class="token keyword">out</span> <span class="token class-name">HTuple</span> SpinRow<span class="token punctuation">,</span> <span class="token keyword">out</span> <span class="token class-name">HTuple</span> SpinColumn<span class="token punctuation">,</span> <span class="token keyword">out</span> <span class="token class-name">HTuple</span> Radius<span class="token punctuation">,</span> <span class="token keyword">out</span> <span class="token class-name">HTuple</span> StartPhi<span class="token punctuation">,</span>
         <span class="token keyword">out</span> <span class="token class-name">HTuple</span> EndPhi<span class="token punctuation">,</span> <span class="token keyword">out</span> <span class="token class-name">HTuple</span> PointOrder<span class="token punctuation">)</span><span class="token punctuation">;</span>
     HOperatorSet<span class="token punctuation">.</span><span class="token function">GenCircleContourXld</span><span class="token punctuation">(</span><span class="token keyword">out</span> Circle<span class="token punctuation">,</span> SpinRow<span class="token punctuation">,</span> SpinColumn<span class="token punctuation">,</span> Radius<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> Math<span class="token punctuation">.</span>PI<span class="token operator">*</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token string">"positive"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
     R <span class="token operator">=</span> Radius<span class="token punctuation">;</span>
     <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span>

 <span class="token punctuation">}</span>
 <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span><span class="token punctuation">)</span>
 <span class="token punctuation">{<!-- --></span>
     <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
 <span class="token punctuation">}</span>

}

#endregion

#region // 直线查找
/// <summary>
/// 直线查找
/// </summary>
/// <param name="image">输入图像</param>
/// <param name="BeginRow">输入ROI的开始横坐标</param>
/// <param name="EndRow">输入ROI的结束横坐标</param>
/// <param name="BeginColumn">输入ROI开始列坐标</param>
/// <param name="EndColumn">输入ROI的结束列坐标</param>
/// <param name="MeasureHeight">输入测量矩形高度</param>
/// <param name="MeasureWide">输入测量矩形宽度</param>
/// <param name="Sigma">输入测量矩形的高斯滤波值</param>
/// <param name="Threshold">输入最小边缘对比度</param>
/// <param name="Measure_Set">选择拟合边1(“uniform”:最接近ROI轮廓的拟合边;“positive”:由亮到暗,“negative”:由暗到亮)</param>
/// <param name="Measure_Place">选择拟合边2(“first”:所有轮廓的第一条边,“last”:所有轮廓的最后一个边,“all”:最接近ROI轮廓的拟合边)</param>
/// <param name="LineContours">结果轮廓</param>
/// <param name="ResultRowBegin">结果轮廓开始横坐标</param>
/// <param name="ResultRowEnd">结果轮廓结束横坐标</param>
/// <param name="ResultColumnBegin">结果轮廓开始列坐标</param>
/// <param name="ResultCloumnEnd">结果轮廓结束列坐标</param>
/// <returns>拟合成功返回true,拟合失败返回false</returns>
static public bool LineMeasure_(HObject image, HTuple BeginRow, HTuple BeginColumn, HTuple EndRow, 
            HTuple EndColumn, HTuple MeasureHeight, HTuple MeasureWide, HTuple Sigma, HTuple Threshold,
            HTuple Measure_Set, HTuple Measure_Place, out HObject LineContours,
            out HTuple ResultRowBegin, out HTuple ResultColumnBegin, out HTuple ResultRowEnd, 
            out HTuple ResultCloumnEnd)
{
    HOperatorSet.GenEmptyObj(out LineContours);
    ResultRowBegin = null;
    ResultColumnBegin = null;
    ResultCloumnEnd = null;
    ResultRowEnd = null;
    try
    {
    HOperatorSet<span class="token punctuation">.</span><span class="token function">CreateMetrologyModel</span><span class="token punctuation">(</span><span class="token keyword">out</span> <span class="token class-name">HTuple</span> metrologyHandle<span class="token punctuation">)</span><span class="token punctuation">;</span>
    HOperatorSet<span class="token punctuation">.</span><span class="token function">AddMetrologyObjectLineMeasure</span><span class="token punctuation">(</span>metrologyHandle<span class="token punctuation">,</span> BeginRow<span class="token punctuation">,</span> BeginColumn<span class="token punctuation">,</span> EndRow<span class="token punctuation">,</span> EndColumn<span class="token punctuation">,</span>
            MeasureHeight<span class="token punctuation">,</span> MeasureWide<span class="token punctuation">,</span> Sigma<span class="token punctuation">,</span> Threshold<span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">out</span> <span class="token class-name">HTuple</span> index<span class="token punctuation">)</span><span class="token punctuation">;</span>

    HOperatorSet<span class="token punctuation">.</span><span class="token function">SetMetrologyObjectParam</span><span class="token punctuation">(</span>metrologyHandle<span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token string">"all"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token string">"measure_transition"</span><span class="token punctuation">)</span>
                             <span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">TupleConcat</span><span class="token punctuation">(</span><span class="token string">"measure_select"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span>Measure_Set<span class="token punctuation">)</span>
                             <span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">TupleConcat</span><span class="token punctuation">(</span>Measure_Place<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//HOperatorSet.SetMetrologyObjectParam(metrologyHandle, new HTuple("all"), new HTuple("min_score"), 0.1);</span>
    HOperatorSet<span class="token punctuation">.</span><span class="token function">ApplyMetrologyModel</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> metrologyHandle<span class="token punctuation">)</span><span class="token punctuation">;</span>
    HOperatorSet<span class="token punctuation">.</span><span class="token function">GetMetrologyObjectResultContour</span><span class="token punctuation">(</span><span class="token keyword">out</span> LineContours<span class="token punctuation">,</span> metrologyHandle<span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token string">"all"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token string">"all"</span><span class="token punctuation">)</span>
            <span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token number">1.5</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    HOperatorSet<span class="token punctuation">.</span><span class="token function">GetMetrologyObjectResult</span><span class="token punctuation">(</span>metrologyHandle<span class="token punctuation">,</span> index<span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token string">"all"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token string">"result_type"</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
                   <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token string">"row_begin"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">out</span> ResultRowBegin<span class="token punctuation">)</span><span class="token punctuation">;</span>
    HOperatorSet<span class="token punctuation">.</span><span class="token function">GetMetrologyObjectResult</span><span class="token punctuation">(</span>metrologyHandle<span class="token punctuation">,</span> index<span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token string">"all"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token string">"result_type"</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
                <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token string">"row_end"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">out</span> ResultRowEnd<span class="token punctuation">)</span><span class="token punctuation">;</span>
    HOperatorSet<span class="token punctuation">.</span><span class="token function">GetMetrologyObjectResult</span><span class="token punctuation">(</span>metrologyHandle<span class="token punctuation">,</span> index<span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token string">"all"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token string">"result_type"</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
                <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token string">"column_begin"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">out</span> ResultColumnBegin<span class="token punctuation">)</span><span class="token punctuation">;</span>
    HOperatorSet<span class="token punctuation">.</span><span class="token function">GetMetrologyObjectResult</span><span class="token punctuation">(</span>metrologyHandle<span class="token punctuation">,</span> index<span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token string">"all"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token string">"result_type"</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
                <span class="token keyword">new</span> <span class="token constructor-invocation class-name">HTuple</span><span class="token punctuation">(</span><span class="token string">"column_end"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">out</span> ResultCloumnEnd<span class="token punctuation">)</span><span class="token punctuation">;</span>
    HOperatorSet<span class="token punctuation">.</span><span class="token function">TupleLength</span><span class="token punctuation">(</span>ResultRowBegin<span class="token punctuation">,</span> <span class="token keyword">out</span> <span class="token class-name">HTuple</span> length<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>length <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span>
    <span class="token punctuation">{<!-- --></span>
        <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> ex<span class="token punctuation">)</span>
<span class="token punctuation">{<!-- --></span>
    <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}
#endregion

2.2程序讲解

2.2.1读取图像和绘制ROI,并找到直线
 bool line1 = false, line2 = false;
 if (FastSet)
 {
     line1 = Module.LineMeasure_(Image, BeginRow1, BeginCloumn1, EndRow1,  EndCloumn1, 10, 2, 1, 40, "uniform", "first", out LineContours,
             out ResultRowBegin, out ResultColumnBegin, out ResultRowEnd,  out ResultCloumnEnd);
     line2 = Module.LineMeasure_(Image, BeginRow2, BeginCloumn2, EndRow2,  EndCloumn2, 10, 2, 1, 40, "uniform", "first", out LineContours2,
             out ResultRowBegin2, out ResultColumnBegin2, out ResultRowEnd2,  out ResultCloumnEnd2);
 }
 if (!line1 || !line2)
 {
     return false;
 }

 
 

首先根据初始图像和直线ROI进行直线测量,找到我们所需要输出的直线。

2.2.2求取直线角度和交点
 
                HOperatorSet.IntersectionLines(BeginRow1, BeginCloumn1, EndRow1, EndCloumn1, BeginRow2, BeginCloumn2, EndRow2, EndCloumn2,
                            out HTuple row, out HTuple column, out HTuple isOverlapping);
                HOperatorSet.LineOrientation( ResultRowBegin,  ResultColumnBegin,  ResultRowEnd,  ResultCloumnEnd, out HTuple phi1);
                HOperatorSet.LineOrientation(ResultRowBegin2,  ResultColumnBegin2,  ResultRowEnd2,  ResultCloumnEnd2, out HTuple phi2);

 
 
2.2.3求2条直线的内切圆

由于只有2条直线,所以我们是绘制内切圆是默认以终点坐标为结束区域绘制


                double midX = (ResultColumnBegin + ResultColumnBegin2) / 2;
                double midY = (ResultRowBegin + ResultRowBegin2) / 2;
                // 计算两条直线的垂直平分线的斜率
                double perpendicularSlope = -1 / ((phi1 + phi2) / 2);
            <span class="token comment">// 计算垂直平分线的截距</span>
            <span class="token class-name"><span class="token keyword">double</span></span> intercept <span class="token operator">=</span> midY <span class="token operator">-</span> perpendicularSlope <span class="token operator">*</span> midX<span class="token punctuation">;</span>

            <span class="token comment">// 计算圆心坐标</span>
            <span class="token class-name"><span class="token keyword">double</span></span> circleCenterX <span class="token operator">=</span> <span class="token operator">-</span>perpendicularSlope <span class="token operator">*</span> intercept <span class="token operator">/</span> <span class="token punctuation">(</span>perpendicularSlope <span class="token operator">*</span> perpendicularSlope <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token class-name"><span class="token keyword">double</span></span> circleCenterY <span class="token operator">=</span> perpendicularSlope <span class="token operator">*</span> circleCenterX <span class="token operator">+</span> intercept<span class="token punctuation">;</span>
2.2.4生成垂直采样线,和采样拟合弧线
HOperatorSet.LineOrientation(row, column, circleCenterY, circleCenterX, out HTuple phi);
HOperatorSet.TupleSin(phi, out HTuple sin);
HOperatorSet.TupleCos(phi, out HTuple cos);
HTuple TY = new HTuple(), TX = new HTuple();
for (int i = -22; i < 22; i++)
{
    Module.PointMeasure_(Image, row+i*cos*3, column+i*sin*3, (ResultRowBegin + ResultRowBegin2) / 2, (ResultColumnBegin + ResultColumnBegin2) / 2, 1, 1, 40, out HTuple resultRow, out HTuple resultColumn);
    HOperatorSet.TupleLength(resultRow, out HTuple length);
    if (length!=1)
    {
        continue;
    }
    TY[i+22] = resultRow;
    TX[i+22] = resultColumn;
}
HOperatorSet.GenContourPolygonXld(out HObject contours, TY, TX);
HOperatorSet.FitCircleContourXld(contours, "atukey", -1, 0, 0, 3, 2,
    out HTuple SpinRow, out HTuple SpinColumn, out HTuple Radius, out HTuple StartPhi,
    out HTuple EndPhi, out HTuple PointOrder);
HOperatorSet.GenCircleContourXld(out Circle, SpinRow, SpinColumn, Radius, 0, Math.PI*2, new HTuple("positive"), 1);
R = Radius;

 
 

在这里插入图片描述

总结

圆倒角测量在很多机械设计上有使用到,与圆度测量一致,都具有测量难度大,费时,且精度不够的问题

转载自:https://blog.csdn.net/m0_51559565/article/details/136641644
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值