xcd
2020-03-29 9a6d8dd28192132ea38f537ad29c410bccfac3be
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
using System;
using HalconDotNet;
 
namespace HalconTools
{
 
    /// <summary>
    /// The class MeasurementPair describes edge pair measurement
    /// and inherits from the base class Measurement. Virtual methods 
    /// defined in the base class are customized here to apply
    /// HALCON operators for edge pair measurement.
    /// </summary>
    public class MeasurementPair : Measurement
    {
        /// <summary>
        /// Result container for the edge information returned
        /// by the HALCON measure operator.
        /// </summary>
        private PairResult mResult;
 
        /// <summary>
        /// Result container for the edge information converted
        /// into world coordinates. If calibration data is not available,
        /// the variable contains the same information as mResult.
        /// </summary>
        private PairResult mResultWorld;
 
        /// <summary>
        /// Creates a measurement object for the provided ROI instance.
        /// </summary>
        /// <param name="roi">ROI instance</param>
        /// <param name="mAssist">Reference to controller class</param>
        public MeasurementPair(ROI roi, MeasureAssistant mAssist)
            : base(roi, mAssist)
        {
            mResult = new PairResult();
            mResultWorld = new PairResult();
            UpdateMeasure();
        }
 
        /// <summary>
        /// Triggers an update of the measure results because of  
        /// changes in the parameter setup or a recreation of the measure 
        /// object caused by an update in the ROI model.
        /// </summary>
        public override void UpdateResults()
        {
            if (mHandle == null)
                return;
 
            mMeasAssist.exceptionText = "";
 
            try
            {
                mHandle.MeasurePairs(mMeasAssist.mImage,
                                     mMeasAssist.mSigma, mMeasAssist.mThresh,
                                     mMeasAssist.mTransition, mMeasAssist.mPosition,
                                     out mResult.rowEdgeFirst, out mResult.colEdgeFirst, out mResult.amplitudeFirst,
                                     out mResult.rowEdgeSecond, out mResult.colEdgeSecond, out mResult.amplitudeSecond,
                                     out mResult.intraDistance, out mResult.interDistance);
 
                if (mMeasAssist.mIsCalibValid && mMeasAssist.mTransWorldCoord)
                {
                    Rectify(mResult.rowEdgeFirst, mResult.colEdgeFirst, out mResultWorld.rowEdgeFirst, out mResultWorld.colEdgeFirst);
                    Rectify(mResult.rowEdgeSecond, mResult.colEdgeSecond, out mResultWorld.rowEdgeSecond, out mResultWorld.colEdgeSecond);
 
                    mResultWorld.intraDistance = Distance(mResult.rowEdgeFirst, mResult.colEdgeFirst,
                                                          mResult.rowEdgeSecond, mResult.colEdgeSecond, 0);
                    mResultWorld.interDistance = Distance(mResult.rowEdgeSecond, mResult.colEdgeSecond,
                                                          mResult.rowEdgeFirst, mResult.colEdgeFirst, 1);
 
                    mResultWorld.amplitudeFirst = mResult.amplitudeFirst;
                    mResultWorld.amplitudeSecond = mResult.amplitudeSecond;
                }
                else
                {
                    mResultWorld = new PairResult(mResult);
                }
            }
            catch (HOperatorException e)
            {
                mEdgeXLD.Dispose();
                mMeasAssist.exceptionText = e.Message;
                mResultWorld = new PairResult();
                return;
            }
            UpdateXLD();
        }
 
        /// <summary>Updates display object for measured edges.</summary>
        public override void UpdateXLD()
        {
            HXLDCont val;
            double width, phi, cRow, cCol, radius, extent;
 
            if (mHandle == null && ((int)mHandle.Handle < 0))
                return;
 
            mMeasAssist.exceptionText = "";
            width = mMeasAssist.mDispROIWidth ? mMeasAssist.mRoiWidth : mMeasAssist.mDispEdgeLength;
            mEdgeXLD.Dispose();
            mEdgeXLD.GenEmptyObj();
 
            try
            {
 
                if (mROIType == ROI.ROI_TYPE_LINE)
                {
                    phi = mMeasROI[2].D;
 
                    for (int i = 0; i < mResult.rowEdgeFirst.Length; i++)
                    {
                        val = DetermineEdgeLine(mResult.rowEdgeFirst[i].D, mResult.colEdgeFirst[i].D, phi, width);
                        mEdgeXLD = mEdgeXLD.ConcatObj(val);
                        val = DetermineEdgeLine(mResult.rowEdgeSecond[i].D, mResult.colEdgeSecond[i].D, phi, width);
                        mEdgeXLD = mEdgeXLD.ConcatObj(val);
                        val = DetermineLine(mResult.rowEdgeFirst[i].D, mResult.colEdgeFirst[i].D,
                                            mResult.rowEdgeSecond[i].D, mResult.colEdgeSecond[i].D);
                        mEdgeXLD = mEdgeXLD.ConcatObj(val);
                    }
                }
                else if (mROIType == ROI.ROI_TYPE_CIRCLEARC)
                {
                    cRow = mROICoord[0].D;
                    cCol = mROICoord[1].D;
                    radius = mROICoord[2].D;
                    extent = mROICoord[4].D;
 
                    for (int i = 0; i < mResult.rowEdgeFirst.Length; i++)
                    {
                        val = DetermineEdgeCircularArc(mResult.rowEdgeFirst[i].D,
                                                       mResult.colEdgeFirst[i].D,
                                                       cRow, cCol, radius, width);
                        mEdgeXLD = mEdgeXLD.ConcatObj(val);
                        val = DetermineEdgeCircularArc(mResult.rowEdgeSecond[i].D,
                                                       mResult.colEdgeSecond[i].D,
                                                       cRow, cCol, radius, width);
                        mEdgeXLD = mEdgeXLD.ConcatObj(val);
                        val = DeterminePairCircularArc(mResult.rowEdgeFirst[i].D, mResult.colEdgeFirst[i].D,
                                                        mResult.rowEdgeSecond[i].D, mResult.colEdgeSecond[i].D,
                                                        cRow, cCol, radius, width, (extent >= 0));
                        mEdgeXLD = mEdgeXLD.ConcatObj(val);
                    }
                }
            }
            catch (HOperatorException e)
            {
                mMeasAssist.exceptionText = e.Message;
            }
        }
 
        /// <summary>Returns measurement result.</summary>
        public override MeasureResult getMeasureResultData()
        {
            return mResultWorld;
        }
 
        /// <summary>Clears measurement result.</summary>
        public override void ClearResultData()
        {
            mResultWorld = new PairResult();
        }
 
    }//end of class
}//end of namespace