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(); }