Beispiel #1
0
 /// <summary>
 /// Show all calibration marks on screen
 /// </summary>
 private void ShowAllCalibrationMarks()
 {
     foreach (KeyValuePair <eCallibrationMark, CircleF> mark in ImagingData.CalibrationMarks)
     {
         CalibrationUtils.ShowCalibrationMark(mark.Value, mark.Key);
     }
 }
Beispiel #2
0
        /// <summary>
        /// Sort marks and fill the property
        /// CallibrationMarks
        /// </summary>
        /// <param name="unsortedMarks">Unsorted calibration marks list</param>
        private void SortCalibrationMarks(List <CircleF> unsortedMarks)
        {
            if (unsortedMarks.Count != 4)
            {
                throw new NotSupportedException("To find diagonal mark pairs exactly 4 marks must be detected!");
            }

            Dictionary <CircleF, CircleF> diagonalPairs = CalibrationUtils.FindDiagonalMarkPairs(unsortedMarks);

            //In each pair find left point, right, bottom and top and set corresponding marks
            foreach (CircleF key in diagonalPairs.Keys)
            {
                CircleF buttom = (key.Center.Y > diagonalPairs[key].Center.Y) ? key : diagonalPairs[key];
                CircleF top    = (key.Center.Y < diagonalPairs[key].Center.Y) ? key : diagonalPairs[key];
                CircleF left   = (key.Center.X < diagonalPairs[key].Center.X) ? key : diagonalPairs[key];
                CircleF right  = (key.Center.X > diagonalPairs[key].Center.X) ? key : diagonalPairs[key];

                if (buttom.Equals(left))
                {
                    ImagingData.CalibrationMarks.Add(eCallibrationMark.BL, left);
                }
                if (top.Equals(left))
                {
                    ImagingData.CalibrationMarks.Add(eCallibrationMark.TL, left);
                }
                if (top.Equals(right))
                {
                    ImagingData.CalibrationMarks.Add(eCallibrationMark.TR, right);
                }
                if (buttom.Equals(right))
                {
                    ImagingData.CalibrationMarks.Add(eCallibrationMark.BR, right);
                }
            }
        }
Beispiel #3
0
        /// <summary>
        /// First Calibration Phase
        /// Performing:
        /// 1. Find and Sort Calibration marks
        /// 2. Calculate and set transformation matrix based on calibration marks
        /// 3. Calculate Ball radius and possible error
        /// </summary>
        /// <param name="frame"></param>
        private void Begin(IFrame frame)
        {
            //ignore first frames
            if (_skippedFrames < FRAMES_TO_SKIP)
            {
                _skippedFrames++;
            }
            else
            {
                try
                {
                    _skippedFrames = 0;

                    Log.Print("***** Starting calibration Phase I... *****", eCategory.Info, LogTag.IMAGE);
                    Image <Gray, byte> image = frame.Image.Clone();

                    //Remove Noise from picture
                    image = CalibrationUtils.PrepareFrame(image);
                    ComputerVisionMonitors[eComputerVisionMonitor.MonitorA].ShowFrame(image);

                    //Find Calibration Marks
                    List <CircleF> circles = FindCalibrationMarks(image);
                    CalibrationUtils.VerifyMarksFound(circles);

                    //Sort Calibration Marks and set value to property
                    SortCalibrationMarks(circles);

                    ShowAllCalibrationMarks();
                    StringBuilder str = new StringBuilder("4 calibration Marks found and sorted: \n\t\t\t\t");
                    foreach (var mark in ImagingData.CalibrationMarks)
                    {
                        str.Append(String.Format("{0}:[{1}x{2}] ", mark.Key, mark.Value.Center.X, mark.Value.Center.Y));
                    }
                    Log.Print(str.ToString(), eCategory.Info, LogTag.IMAGE);

                    CalibrationUtils.SetTransformationMatrix(AXE_X_LENGTH, AXE_Y_LENGTH, ImagingData.CalibrationMarks);
                    Log.Print("Homography matrix calculated.", eCategory.Info, LogTag.IMAGE);

                    //Calculate Ball Radius and Error
                    int    ballRadius;
                    double ballError;
                    CalibrationUtils.CalculateBallRadiusAndError((float)BALL_RADIUS_MM, out ballRadius, out ballError);

                    ImagingData.BallRadius      = ballRadius;
                    ImagingData.BallRadiusError = ballError;

                    Log.Print(String.Format("Expected ball radius is {0} +/- {1}",
                                            ImagingData.BallRadius, ImagingData.BallRadiusError), eCategory.Info, LogTag.IMAGE);

                    CurrentState = eCalibrationState.Performing;
                    Log.Print("***** Finished calibration Phase I *****", eCategory.Info, LogTag.IMAGE);
                }
                catch (CalibrationException ex)
                {
                    Log.Print(String.Format("Calibration failed in first phase. Will retry after [{0}] frames. Reason: {1}",
                                            FRAMES_TO_SKIP, ex.Message), eCategory.Warn, LogTag.IMAGE);
                }
            }
        }
Beispiel #4
0
        public V0100.Objects.Calibration Add(V0100.Objects.Calibration calibration)
        {
            // Get the device that authenticated.
            DeviceEntity device = GetDevice();

            // Device must be active.
            if (device.DeviceState != DeviceState.Active)
            {
                throw new WebFaultException <string>(V0100.Constants.StatusSubcode.DEVICE_STATE_INVALID, HttpStatusCode.NotAcceptable);
            }

            // If the calibration specifies a different device, switch to that one.
            // This allows uploading a calibration for a previously-attached scanner.
            if (!string.IsNullOrEmpty(calibration.DeviceGuid) && calibration.DeviceGuid != device.UniqueIdentifier)
            {
                // Get device. It must exist.
                device = DeviceUtils.GetByUid(calibration.DeviceGuid);
                if (device == null)
                {
                    throw new WebFaultException <string>(V0100.Constants.StatusSubcode.DEVICE_NOT_FOUND, HttpStatusCode.PreconditionFailed);
                }
            }

            // Get the calibration if it exists.
            CalibrationEntity calibrationEntity = CalibrationUtils.GetByUid(calibration.Guid);

            if (calibrationEntity == null)
            {
                // Not found. Creating a new one. Be sure the image set exists.
                ImageSetEntity imageSet = ImageSetUtils.GetByUid(calibration.ImageSetGuid);
                if (imageSet == null)
                {
                    throw new WebFaultException <string>(V0100.Constants.StatusSubcode.IMAGE_SET_NOT_FOUND, HttpStatusCode.PreconditionFailed);
                }

                // Create new calibration.
                calibration.CalibrationId = CalibrationUtils.Create(device.DeviceId, calibration.Guid, calibration.Timestamp, calibration.PerformedBy, imageSet.ImageSetId);
            }
            else
            {
                // Calibration already exists. Device IDs must match.
                if (calibrationEntity.DeviceId != device.DeviceId)
                {
                    throw new WebFaultException <string>(V0100.Constants.StatusSubcode.CALIBRATION_INVALID, HttpStatusCode.Conflict);
                }

                // Get existing ID.
                calibration.CalibrationId = calibrationEntity.CalibrationId;
            }

            // Return it with the ID provided.
            return(calibration);
        }
Beispiel #5
0
        /// <summary>
        /// Second Calibration Phase
        /// Performing:
        /// 1. Find Calibration Marks to verify image is fine
        /// 2. Update Table Image Processing Coverage
        /// 3. Recalculate Homography matrices
        /// </summary>
        /// <param name="frame"></param>
        private void Finalize(IFrame frame)
        {
            //ignore first frames
            if (_skippedFrames < FRAMES_TO_SKIP)
            {
                _skippedFrames++;
            }
            else
            {
                try
                {
                    _skippedFrames = 0;

                    Log.Print("***** Starting calibration Phase II... *****", eCategory.Info, LogTag.IMAGE);
                    Image <Gray, byte> image = frame.Image.Clone();

                    //Remove Noise from picture
                    image = CalibrationUtils.PrepareFrame(image);
                    ComputerVisionMonitors[eComputerVisionMonitor.MonitorA].ShowFrame(image);

                    //Find Calibration Marks
                    List <CircleF> circles = FindCalibrationMarks(image);
                    CalibrationUtils.VerifyMarksFound(circles);

                    //Update coverage
                    ImagingData.CalibrationMarks = CalibrationUtils.UpdateCoverage(ImagingData.CalibrationMarks);
                    Log.Print("Coverage and marks updated.", eCategory.Info, LogTag.IMAGE);

                    //Show table border marks
                    Marks.DrawTableBorders(ImagingData.CalibrationMarks);

                    //Recalculate Homography Matrix
                    CalibrationUtils.SetTransformationMatrix(AXE_X_LENGTH, AXE_Y_LENGTH, ImagingData.CalibrationMarks);
                    Log.Print("Homography matrix re-calculated.", eCategory.Info, LogTag.IMAGE);

                    CurrentState = eCalibrationState.Finished;
                    Log.Print("***** Finished calibration Phase II *****", eCategory.Info, LogTag.IMAGE);
                }
                catch (CalibrationException ex)
                {
                    Log.Print(String.Format("Calibration failed in second phase. Will retry after [{0}] frames. Reason: {1}",
                                            FRAMES_TO_SKIP, ex.Message), eCategory.Warn, LogTag.IMAGE);
                }
            }
        }
        public long Add(V0100.Objects.Treatment treatment)
        {
            DeviceEntity device = GetDevice();

            if (device.DeviceState != DeviceState.Active)
            {
                throw new WebFaultException <string>(V0100.Constants.StatusSubcode.DEVICE_STATE_INVALID, HttpStatusCode.NotAcceptable);
            }

            if (TreatmentUtils.GetByUid(treatment.Guid) != null)
            {
                throw new WebFaultException <string>(V0100.Constants.StatusSubcode.TREATMENT_INVALID, HttpStatusCode.Conflict);
            }

            PatientEntity patient = PatientUtils.GetByUid(treatment.PatientGuid);

            if (patient == null)
            {
                throw new WebFaultException <string>(V0100.Constants.StatusSubcode.PATIENT_NOT_FOUND, HttpStatusCode.PreconditionFailed);
            }

            CalibrationEntity calibration = CalibrationUtils.GetByUid(treatment.CalibrationGuid);

            if (calibration == null)
            {
                throw new WebFaultException <string>(V0100.Constants.StatusSubcode.CALIBRATION_NOT_FOUND, HttpStatusCode.PreconditionFailed);
            }

            ImageSetEntity energizedImageSet = ImageSetUtils.GetByUid(treatment.EnergizedImageSetGuid);

            if (energizedImageSet == null)
            {
                throw new WebFaultException <string>(V0100.Constants.StatusSubcode.IMAGE_SET_NOT_FOUND, HttpStatusCode.PreconditionFailed);
            }

            ImageSetEntity fingerImageSet = null;

            if (treatment.FingerImageSetGuid != null)
            {
                fingerImageSet = ImageSetUtils.GetByUid(treatment.FingerImageSetGuid);
                if (fingerImageSet == null)
                {
                    throw new WebFaultException <string>(V0100.Constants.StatusSubcode.IMAGE_SET_NOT_FOUND, HttpStatusCode.PreconditionFailed);
                }
            }

            // TODO: Refactor this into the utilities class.
            // Need to consider if it is worth it. The utilities classes exist to make support for
            // multiple versions easier. Unlike the other data layer objects, this is more complicated
            // and will need to be refactored differently.

            TreatmentEntity treatmentEntity = new TreatmentEntity
            {
                UniqueIdentifier       = treatment.Guid,
                PatientId              = patient.PatientId,
                CalibrationId          = calibration.CalibrationId,
                TreatmentType          = (TreatmentType)Enum.Parse(typeof(TreatmentType), treatment.TreatmentType.ToString()),
                TreatmentTime          = treatment.TreatmentTime,
                PerformedBy            = treatment.PerformedBy,
                EnergizedImageSetId    = energizedImageSet.ImageSetId,
                FingerImageSetId       = fingerImageSet != null ? fingerImageSet.ImageSetId : (long?)null,
                SoftwareVersion        = treatment.SoftwareVersion,
                FirmwareVersion        = treatment.FirmwareVersion,
                AnalysisTime           = treatment.AnalysisTime,
                PatientPrescanQuestion = new PatientPrescanQuestionEntity
                {
                    AlcoholQuestion  = treatment.AlcoholQuestion,
                    WheatQuestion    = treatment.WheatQuestion,
                    CaffeineQuestion = treatment.CaffeineQuestion
                }
            };

            foreach (V0100.Objects.NBAnalysisResult result in treatment.NBAnalysisResults)
            {
                NBAnalysisResultEntity resultEntity = treatmentEntity.NBAnalysisResults.AddNew();
                resultEntity.OrganSystemId         = (short)ConvertAnalysisGroup(result.NBAnalysisGroup);
                resultEntity.ResultScoreFiltered   = result.ResultScoreFiltered;
                resultEntity.ResultScoreUnfiltered = result.ResultScoreUnfiltered;
                resultEntity.ProbabilityFiltered   = result.ProbabilityFiltered;
                resultEntity.ProbabilityUnfiltered = result.ProbabilityUnfiltered;
            }

            foreach (V0100.Objects.AnalysisResult result in treatment.AnalysisResults)
            {
                AnalysisResultEntity resultEntity = treatmentEntity.AnalysisResults.AddNew();
                resultEntity.AnalysisTime       = result.AnalysisTime;
                resultEntity.IsFiltered         = result.IsFiltered;
                resultEntity.FingerDesc         = result.FingerDescription;
                resultEntity.FingerType         = result.FingerType;
                resultEntity.SectorNumber       = result.SectorNumber;
                resultEntity.StartAngle         = result.StartAngle;
                resultEntity.EndAngle           = result.EndAngle;
                resultEntity.SectorArea         = result.SectorArea;
                resultEntity.IntegralArea       = result.IntegralArea;
                resultEntity.NormalizedArea     = result.NormalizedArea;
                resultEntity.AverageIntensity   = result.AverageIntensity;
                resultEntity.Entropy            = result.Entropy;
                resultEntity.FormCoefficient    = result.FormCoefficient;
                resultEntity.FractalCoefficient = result.FractalCoefficient;
                resultEntity.JsInteger          = result.JsInteger;
                resultEntity.CenterX            = result.CenterX;
                resultEntity.CenterY            = result.CenterY;
                resultEntity.RadiusMin          = result.RadiusMin;
                resultEntity.RadiusMax          = result.RadiusMax;
                resultEntity.AngleOfRotation    = result.AngleOfRotation;
                resultEntity.Form2            = result.Form2;
                resultEntity.NoiseLevel       = result.NoiseLevel;
                resultEntity.BreakCoefficient = result.BreakCoefficient;
                resultEntity.SoftwareVersion  = result.SoftwareVersion;
                resultEntity.AI1           = result.AI1;
                resultEntity.AI2           = result.AI2;
                resultEntity.AI3           = result.AI3;
                resultEntity.AI4           = result.AI4;
                resultEntity.Form11        = result.Form11;
                resultEntity.Form12        = result.Form12;
                resultEntity.Form13        = result.Form13;
                resultEntity.Form14        = result.Form14;
                resultEntity.RingThickness = result.RingThickness;
                resultEntity.RingIntensity = result.RingIntensity;
                resultEntity.Form2Prime    = result.Form2Prime;
                resultEntity.UserName      = result.UserName;
            }

            foreach (V0100.Objects.Severity severity in treatment.Severities)
            {
                SeverityEntity severityEntity = treatmentEntity.Severities.AddNew();
                severityEntity.OrganId       = severity.OrganId;
                severityEntity.PhysicalRight = severity.PhysicalRight;
                severityEntity.PhysicalLeft  = severity.PhysicalLeft;
                severityEntity.MentalRight   = severity.MentalRight;
                severityEntity.MentalLeft    = severity.MentalLeft;
            }

            foreach (V0100.Objects.CalculationDebug calculationDebug in treatment.CalculationDebugs)
            {
                CalculationDebugDataEntity calculationDebugDataEntity = treatmentEntity.CalculationDebugDatas.AddNew();
                calculationDebugDataEntity.FingerSector     = calculationDebug.FingerSector;
                calculationDebugDataEntity.IsFiltered       = calculationDebug.IsFiltered;
                calculationDebugDataEntity.OrganComponent   = (OrganComponent)Enum.Parse(typeof(OrganComponent), calculationDebug.OrganComponent, true);
                calculationDebugDataEntity.Area             = calculationDebug.Area;
                calculationDebugDataEntity.AverageIntensity = calculationDebug.AverageIntensity;
                calculationDebugDataEntity.BreakCoefficient = calculationDebug.BreakCoefficient;
                calculationDebugDataEntity.Entropy          = calculationDebug.Entropy;
                calculationDebugDataEntity.NS              = calculationDebug.NS;
                calculationDebugDataEntity.Fractal         = calculationDebug.Fractal;
                calculationDebugDataEntity.Form            = calculationDebug.Form;
                calculationDebugDataEntity.Form2           = calculationDebug.Form2;
                calculationDebugDataEntity.AI1             = calculationDebug.AI1;
                calculationDebugDataEntity.AI2             = calculationDebug.AI2;
                calculationDebugDataEntity.AI3             = calculationDebug.AI3;
                calculationDebugDataEntity.AI4             = calculationDebug.AI4;
                calculationDebugDataEntity.Form11          = calculationDebug.Form11;
                calculationDebugDataEntity.Form12          = calculationDebug.Form12;
                calculationDebugDataEntity.Form13          = calculationDebug.Form13;
                calculationDebugDataEntity.Form14          = calculationDebug.Form14;
                calculationDebugDataEntity.RingIntensity   = calculationDebug.RingIntensity;
                calculationDebugDataEntity.RingThickness   = calculationDebug.RingThickness;
                calculationDebugDataEntity.Form2Prime      = calculationDebug.Form2Prime;
                calculationDebugDataEntity.EPICBaseScore   = calculationDebug.EPICBaseScore;
                calculationDebugDataEntity.EPICBonusScore  = calculationDebug.EPICBonusScore;
                calculationDebugDataEntity.EPICScore       = calculationDebug.EPICScore;
                calculationDebugDataEntity.EPICScaledScore = calculationDebug.EPICScaledScore;
                calculationDebugDataEntity.EPICRank        = calculationDebug.EPICRank;
                calculationDebugDataEntity.LRRank          = calculationDebug.LRRank;
                calculationDebugDataEntity.LRScore         = calculationDebug.LRScore;
                calculationDebugDataEntity.LRScaledScore   = calculationDebug.LRScaledScore;
                calculationDebugDataEntity.SumZScore       = calculationDebug.SumZScore;
            }

            treatmentEntity.Save(true);

            return(treatmentEntity.TreatmentId);
        }