public AutoFitPoint(ROI roi, MeasureAssistant mAssist)
     : base(roi, mAssist)
 {
     mResult      = new EdgeResult();
     mResultWorld = new EdgeResult();
     if (mMeasAssist.IsCalibrationValid)
     {
         _cameraOut = HMisc.ChangeRadialDistortionCamPar("adaptive", mMeasAssist.CameraIn, 0.0);
     }
     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
            {
                HObject imageReduced;
                HOperatorSet.GenEmptyObj(out imageReduced);
                //«Ø ROI
                var     roiModel = mRoi.getModelData();
                var     row      = roiModel[0];
                var     column   = roiModel[1];
                var     phi      = roiModel[2];
                var     length1  = roiModel[3];
                var     length2  = roiModel[4];
                HRegion region   = new HRegion();
                region.GenRectangle2(row.D, column.D, phi.D, length1.D, length2.D);

                if (mMeasAssist.ApplyCalibration && mMeasAssist.IsCalibrationValid)
                {
                    HTuple cameraOut    = HMisc.ChangeRadialDistortionCamPar("adaptive", mMeasAssist.CameraIn, 0.0);
                    var    rectifyImage = mMeasAssist.mImage.ChangeRadialDistortionImage(region, mMeasAssist.CameraIn, cameraOut);
                    measurePos(rectifyImage);
                }
                else
                {
                    HOperatorSet.ReduceDomain(mMeasAssist.mImage, region, out imageReduced);
                    measurePos(new HImage(imageReduced));
                }
                mResultWorld = new EdgeResult(mResult);
            }
            catch (HOperatorException e)
            {
                mEdgeXLD.Dispose();
                mMeasAssist.exceptionText = e.Message;
                mResultWorld = new EdgeResult();
                return;
            }
            UpdateXLD();
        }
        /// <summary>
        /// 更新量測結果.
        /// 量測演算法放這裡
        /// </summary>
        public override void UpdateResults()
        {
            if (mMeasAssist.mImage == null)
            {
                return;
            }


            #region 初始化數值
            if (!String.IsNullOrEmpty(mMeasAssist.FitCircleAlgo))
            {
                _Algorithm = new HTuple(mMeasAssist.FitCircleAlgo);
            }

            //init result
            mResult = new CircleResult();

            // Local iconic variables
            HObject ho_MeasureROI, ho_ImageReduced;
            HObject ho_Border, tmp_Border;

            // Initialize local and output iconic variables
            HOperatorSet.GenEmptyObj(out ho_MeasureROI);
            HOperatorSet.GenEmptyObj(out ho_ImageReduced);
            HOperatorSet.GenEmptyObj(out ho_Border);
            HOperatorSet.GenEmptyObj(out tmp_Border);
            #endregion

            try
            {
                //******* Create ROI ********
                ho_MeasureROI.Dispose();
                HOperatorSet.GenCircle(out ho_MeasureROI, mROICoord[0], mROICoord[1], mROICoord[2]);
                HRegion region = new HRegion();
                region.GenCircle(mROICoord[0].D, mROICoord[1].D, mROICoord[2].D);

                //****** Area Center, 取得目標區域的 pixels 數 ***********
                HTuple area, areaRow, areaColumn;
                double areaPixels = 0.0;
                HOperatorSet.AreaCenter(region, out area, out areaRow, out areaColumn);
                areaPixels = area.D;

                //****** 取得影像 ******
                var himage = mMeasAssist.getImage();

                //******* Extract ROI Image *****
                ho_ImageReduced.Dispose();
                HOperatorSet.ReduceDomain(himage, ho_MeasureROI, out ho_ImageReduced);

                //******* Filter ****************
                var subpixThreadhold = mMeasAssist.SubpixThreadhold;
                HOperatorSet.GenEmptyObj(out ho_Border);
                HOperatorSet.ThresholdSubPix(ho_ImageReduced, out ho_Border, subpixThreadhold);

                if (mMeasAssist.ApplyCalibration && mMeasAssist.IsCalibrationValid)
                {
                    if (_cameraOut.TupleLength() == 0)
                    {
                        _cameraOut = HMisc.ChangeRadialDistortionCamPar("adaptive", mMeasAssist.CameraIn, 0.0);
                    }
                    //var rectifyImage = himage.ChangeRadialDistortionImage(region, mMeasAssist.CameraIn, cameraOut);
                    HObject calibrationBorder;
                    HOperatorSet.GenEmptyObj(out calibrationBorder);
                    HOperatorSet.ChangeRadialDistortionContoursXld(ho_Border, out calibrationBorder, mMeasAssist.CameraIn, _cameraOut);
                    mResult = fitCircle(calibrationBorder, areaPixels);
                }
                else
                {
                    mResult = fitCircle(ho_Border, areaPixels);
                }
            }
            catch (HOperatorException ex)
            {
                Hanbo.Log.LogManager.Error(ex);
                mResultWorld = new CircleResult();
                mResult      = new CircleResult();
            }
            finally
            {
                ho_MeasureROI.Dispose();
                ho_ImageReduced.Dispose();
                ho_Border.Dispose();
            }
            UpdateXLD();
        }