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