/// <summary>
        /// 取得校正片校正資訊
        /// </summary>
        /// <param name="calibrationPlateDescriptionFile">校正片描述檔案</param>
        /// <param name="image">校正片影像</param>
        /// <param name="plateParam">校正片擷取參數</param>
        /// <param name="startCamerParam">鏡頭參數</param>
        /// <returns>校正片校正資訊模型</returns>
        public CalibrationPlateMarkViewModel GetCalibrationPlateMarkViewModel(string calibrationPlateDescriptionFile
            , HImage image
            , CalibrationPlateParam plateParam
            , HTuple startCamerParam)
        {
            var model = new CalibrationPlateMarkViewModel();
            try
            {
                //找到校正板的區域
                var calibRegion = image.FindCaltab(calibrationPlateDescriptionFile
                                , plateParam.GaussianFilterSize
                                , plateParam.MarkThreshold
                                , plateParam.MinMarkDiam);

                //取得校正片 Mark 的位置和角度
                HTuple markCenterCols;
                HPose estimatedStartPose;
                HTuple markCenterRows = image.FindMarksAndPose(calibRegion
                                                        , calibrationPlateDescriptionFile
                                                        , startCamerParam
                                                        , plateParam.StartThresh
                                                        , plateParam.DeltaThresh
                                                        , plateParam.MinThresh
                                                        , plateParam.Alpha
                                                        , plateParam.MinContourLength
                                                        , plateParam.MaxDiameterMarks
                                                        , out markCenterCols
                                                        , out estimatedStartPose);

                model.MarkCenterRows = new HTuple(markCenterRows);
                model.MarkCenterCols = new HTuple(markCenterCols);
                model.EstimatedMarkPose = new HTuple(estimatedStartPose);
                model.Valid = true;
                model.ErrorMessage = String.Empty;
            }
            catch (HOperatorException ex)
            {
                model.ErrorMessage = ex.Message;
                model.Valid = false;
            }
            return model;
        }
예제 #2
0
        /// <summary>
        /// Determine s(or updates) the basic information for this
        /// calibration image, which are the values for the region
        /// plate, the center marks, and the estimated pose.
        /// The flag <c>mPlateStatus</c> describes the evaluation
        /// of the computation process.
        /// If desired the quality assessment can be recalculated
        /// as well.
        /// </summary>
        /// <param name="updateQuality">
        /// Triggers the recalculation of the quality assessment for
        /// this calibration image
        /// </param>
        public void UpdateCaltab(bool updateQuality)
        {
            HTuple worldX, worldY;
            HTuple unit = new HTuple("m");

            bool failed            = false;
            QualityProcedures proc = new QualityProcedures();
            string            descrFile;
            HTuple            startCamp;

            mErrorMessage = "";


            mCaltabRegion.Dispose();
            mMarkCenter.Dispose();
            mEstimatedWCS.Dispose();

            //reset this variable
            mMarkCenterRows = new HTuple();

            mPlateStatus = CalibrationAssistant.PS_NOT_FOUND;

            descrFile = mAssistant.getDesrcFile();

            try
            {
                mCaltabRegion = mImage.FindCaltab(descrFile,
                                                  (int)mAssistant.mFilterSize,
                                                  (int)mAssistant.mMarkThresh,
                                                  (int)mAssistant.mMinMarkDiam);

                mPlateStatus = CalibrationAssistant.PS_MARKS_FAILED;

                //-- Quality issue measurements --
                if (updateQuality)
                {
                    mQualityIssuesList.Clear();
                    failed = mAssistant.testQualityIssues(this);
                }

                startCamp       = mAssistant.getCameraParams(this);
                mMarkCenterRows = mImage.FindMarksAndPose(mCaltabRegion,
                                                          descrFile,
                                                          startCamp,
                                                          (int)mAssistant.mInitThresh,
                                                          (int)mAssistant.mThreshDecr,
                                                          (int)mAssistant.mMinThresh,
                                                          mAssistant.mSmoothing,
                                                          mAssistant.mMinContLength,
                                                          mAssistant.mMaxMarkDiam,
                                                          out mMarkCenterCols,
                                                          out mEstimatedPose);


                mMarkCenter.GenCrossContourXld(mMarkCenterRows,
                                               mMarkCenterCols,
                                               new HTuple(6.0),
                                               0.785398);

                if (failed)
                {
                    mAssistant.addQualityIssue(this, CalibrationAssistant.QUALITY_ISSUE_FAILURE, 0.0);
                }


                HOperatorSet.ImagePointsToWorldPlane(startCamp, mEstimatedPose,
                                                     mMarkCenterRows, mMarkCenterCols,
                                                     unit, out worldX, out worldY);
                mEstimatedPlateSize = HMisc.DistancePp(worldY[0].D, worldX[0].D,
                                                       worldY[1].D, worldX[1].D);
                mEstimatedPlateSize *= 10.0;
                proc.get_3d_coord_system(mImage, out mEstimatedWCS,
                                         startCamp, mEstimatedPose,
                                         new HTuple(mEstimatedPlateSize / 2.0));

                mPlateStatus = mQualityIssuesList.Count > 0 ? CalibrationAssistant.PS_QUALITY_ISSUES:CalibrationAssistant.PS_OK; // "Quality Issues found": "OK";
                mCanCalib    = 0;
            }
            catch (HOperatorException e)
            {
                this.mErrorMessage = e.Message;
                mCanCalib          = 1;

                /* if exception was raised due to lack of memory,
                 * forward the error to the calling method */
                if (e.Message.IndexOf("not enough") != -1)
                {
                    throw(e);
                }
            }
        }