internal void SetIsTracked(bool isMeasured, NotMeasuredReasons reason) { foreach (ITrackedObject obj in m_ObjectGroup) { TrackedObjectLight trackedObject = (TrackedObjectLight)obj; trackedObject.SetIsTracked(isMeasured, reason); } }
public override void NextFrame(int frameNo, IAstroImage astroImage) { IsTrackedSuccessfully = false; // For each of the non manualy positioned Tracked objects do a PSF fit in the area of its previous location for (int i = 0; i < m_TrackedObjectGroups.Count; i++) { TrackedObjectGroup objectGroup = m_TrackedObjectGroups[i]; objectGroup.NextFrame(); if (objectGroup.TrackLater) { // Group position will be determined after the rest of the stars are found } else { if (objectGroup.IsSingleObject) { TrackedObjectLight trackedObject = (TrackedObjectLight)objectGroup.SingleObject; uint[,] pixels = astroImage.GetPixelsArea(objectGroup.SingleObjectLastCenter.X, objectGroup.SingleObjectLastCenter.Y, 17); var fit = new PSFFit(objectGroup.SingleObjectLastCenter.X, objectGroup.SingleObjectLastCenter.Y); fit.FittingMethod = PSFFittingMethod.NonLinearFit; fit.Fit(pixels); if (fit.IsSolved) { if (fit.Certainty < GUIDING_STAR_MIN_CERTAINTY) { trackedObject.SetIsTracked(false, NotMeasuredReasons.ObjectCertaintyTooSmall); } else if (fit.FWHM < STELLAR_OBJECT_MIN_FWHM || fit.FWHM > STELLAR_OBJECT_MAX_FWHM) { trackedObject.SetIsTracked(false, NotMeasuredReasons.FWHMOutOfRange); } else if (TangraConfig.Settings.Tracking.CheckElongation && fit.ElongationPercentage > STELLAR_OBJECT_MAX_ELONGATION) { trackedObject.SetIsTracked(false, NotMeasuredReasons.ObjectTooElongated); } else { trackedObject.SetTrackedObjectMatch(fit); trackedObject.SetIsTracked(true, NotMeasuredReasons.TrackedSuccessfully); } } } else { string dbg = ""; int areaCenterX = (objectGroup.LastCenterObject1.X + objectGroup.LastCenterObject2.X) / 2; int areaCenterY = (objectGroup.LastCenterObject1.Y + objectGroup.LastCenterObject2.Y) / 2; uint[,] pixels = astroImage.GetPixelsArea(areaCenterX, areaCenterY, 35); var doubleFit = new DoublePSFFit(areaCenterX, areaCenterY); int x1 = objectGroup.LastCenterObject1.X - areaCenterX + 17; int y1 = objectGroup.LastCenterObject1.Y - areaCenterY + 17; int x2 = objectGroup.LastCenterObject2.X - areaCenterX + 17; int y2 = objectGroup.LastCenterObject2.Y - areaCenterY + 17; if (TangraConfig.Settings.Photometry.PsfFittingMethod == TangraConfig.PsfFittingMethod.LinearFitOfAveragedModel) { doubleFit.FittingMethod = PSFFittingMethod.LinearFitOfAveragedModel; } doubleFit.Fit(pixels, x1, y1, x2, y2); if (doubleFit.IsSolved) { PSFFit fit1 = doubleFit.GetGaussian1(); PSFFit fit2 = doubleFit.GetGaussian2(); TrackedObjectLight trackedObject1; TrackedObjectLight trackedObject2; bool groupIdentified = objectGroup.IdentifyObjects(fit1, fit2, GUIDING_STAR_MIN_CERTAINTY, out trackedObject1, out trackedObject2); if (!groupIdentified) { dbg += "Ni-"; objectGroup.SetIsTracked(false, NotMeasuredReasons.PSFFittingFailed); //Bitmap bmp = new Bitmap(100, 200); //using (Graphics g = Graphics.FromImage(bmp)) //{ // doubleFit.DrawInternalPoints(g, new Rectangle(0, 0, 100, 200), 5, 5, Brushes.Lime, Brushes.Yellow, 8); // g.Save(); //} //bmp.Save(@"D:\Hristo\mutual_double_fit.bmp"); m_FailedGroupFits++; } else { PSFFit[] fits = new PSFFit[] { fit1, fit2 }; TrackedObjectLight[] trackedObjects = new TrackedObjectLight[] { trackedObject1, trackedObject2 }; int tooSmallCertainties = 0; int errors = 0; for (int j = 0; j < 2; j++) { PSFFit fit = fits[j]; TrackedObjectLight trackedObject = trackedObjects[j]; if (fit.Certainty < GUIDING_STAR_MIN_CERTAINTY) { tooSmallCertainties++; trackedObject.SetIsTracked(true, NotMeasuredReasons.TrackedSuccessfully); dbg += "TsGs-"; } else if (fit.FWHM < STELLAR_OBJECT_MIN_FWHM || fit.FWHM > STELLAR_OBJECT_MAX_FWHM) { trackedObject.SetIsTracked(false, NotMeasuredReasons.FWHMOutOfRange); dbg += "Fw-"; errors++; } else if (TangraConfig.Settings.Tracking.CheckElongation && fit.ElongationPercentage > STELLAR_OBJECT_MAX_ELONGATION) { trackedObject.SetIsTracked(false, NotMeasuredReasons.ObjectTooElongated); dbg += "Elo-"; errors++; } else { trackedObject.SetIsTracked(true, NotMeasuredReasons.TrackedSuccessfully); dbg += "Ts-"; } } if (tooSmallCertainties == 2) { trackedObjects[0].SetIsTracked(false, NotMeasuredReasons.ObjectCertaintyTooSmall); trackedObjects[1].SetIsTracked(false, NotMeasuredReasons.ObjectCertaintyTooSmall); errors++; m_FailedGroupFits++; dbg += "Uncer-"; } if (errors == 0) { if (objectGroup.CheckIdentifiedObjects(fits[0].XCenter, fits[1].XCenter, fits[0].YCenter, fits[1].YCenter)) { trackedObjects[0].SetTrackedObjectMatch(fits[0]); trackedObjects[1].SetTrackedObjectMatch(fits[1]); m_FailedGroupFits = 0; dbg += "Id-"; double dist = ImagePixel.ComputeDistance(fits[0].XCenter, fits[1].XCenter, fits[0].YCenter, fits[1].YCenter); if (dist < 2) { Trace.WriteLine("TOO CLOSE"); } if (dist > 16) { Trace.WriteLine("TOO FAR"); } } else { dbg += "NoId-"; } } } } else { dbg += "NoSlv-"; } objectGroup.ValidatePosition(); Trace.WriteLine(dbg); } } } bool atLeastOneGroupLocated = false; for (int i = 0; i < m_TrackedObjectGroups.Count; i++) { TrackedObjectGroup trackedGroup = m_TrackedObjectGroups[i]; if (!trackedGroup.IsSingleObject && trackedGroup.LastCenterObject1 != null && trackedGroup.LastCenterObject2 != null) { Trace.WriteLine(string.Format("({0}, {1}, {2}) ({3},{4},{5}) [{6},{7}]", trackedGroup.LastCenterObject1.XDouble, trackedGroup.LastCenterObject1.YDouble, trackedGroup.LastCenterObject1.Brightness, trackedGroup.LastCenterObject2.XDouble, trackedGroup.LastCenterObject2.YDouble, trackedGroup.LastCenterObject2.Brightness, trackedGroup.LastCenterObject1.XDouble - trackedGroup.LastCenterObject2.XDouble, trackedGroup.LastCenterObject1.YDouble - trackedGroup.LastCenterObject2.YDouble)); } bool containsFullyDisappearingTarget = trackedGroup.ContainsOcultedStar && m_IsFullDisappearance; if (!containsFullyDisappearingTarget && trackedGroup.IsLocated) { atLeastOneGroupLocated = true; } if (!containsFullyDisappearingTarget) { continue; } int numReferences = 0; double x_double; double y_double; if (trackedGroup.IsSingleObject && m_IsFullDisappearance) { // This is the case for single fully disappearing targets double totalX = 0; double totalY = 0; numReferences = 0; for (int j = 0; j < m_TrackedObjectGroups.Count; j++) { TrackedObjectGroup referenceGroup = (TrackedObjectGroup)m_TrackedObjectGroups[j]; if (referenceGroup.IsLocated) { totalX += (trackedGroup.BrigherOriginalObject.ApertureStartingX - referenceGroup.BrigherOriginalObject.ApertureStartingX) + referenceGroup.BrigherObjectLastCenter.XDouble; totalY += (trackedGroup.BrigherOriginalObject.ApertureStartingY - referenceGroup.BrigherOriginalObject.ApertureStartingY) + referenceGroup.BrigherObjectLastCenter.YDouble; numReferences++; atLeastOneGroupLocated = true; } } x_double = totalX / numReferences; y_double = totalY / numReferences; } else { // The fully disappearing target is in a group. The other target would have been located. We use the last known position of the other targets numReferences = 1; x_double = trackedGroup.NonOccultedObjectLastCenter.XDouble; y_double = trackedGroup.NonOccultedObjectLastCenter.YDouble; } if (numReferences == 0) { trackedGroup.SetIsTracked(false, NotMeasuredReasons.FitSuspectAsNoGuidingStarsAreLocated); } else { int x = (int)(Math.Round(x_double)); int y = (int)(Math.Round(y_double)); uint[,] pixels = astroImage.GetPixelsArea(x, y, 35); if (trackedGroup.IsSingleObject) { PSFFit fit = new PSFFit(x, y); fit.Fit(pixels); if (fit.IsSolved && fit.Certainty > STELLAR_OBJECT_MIN_CERTAINTY) { trackedGroup.SingleObject.SetIsTracked(true, NotMeasuredReasons.TrackedSuccessfully); trackedGroup.SingleObject.SetTrackedObjectMatch(fit); } else if (m_IsFullDisappearance) { trackedGroup.SingleObject.SetIsTracked(false, NotMeasuredReasons.FullyDisappearingStarMarkedTrackedWithoutBeingFound); } else { trackedGroup.SingleObject.SetIsTracked(false, NotMeasuredReasons.ObjectCertaintyTooSmall); } } else { string dbg = ""; DoublePSFFit doubleFit = new DoublePSFFit(x, y); int x1 = trackedGroup.LastCenterObject1.X - x + 17; int y1 = trackedGroup.LastCenterObject1.Y - y + 17; int x2 = trackedGroup.LastCenterObject2.X - x + 17; int y2 = trackedGroup.LastCenterObject2.Y - y + 17; if (TangraConfig.Settings.Photometry.PsfFittingMethod == TangraConfig.PsfFittingMethod.LinearFitOfAveragedModel) { doubleFit.FittingMethod = PSFFittingMethod.LinearFitOfAveragedModel; } doubleFit.Fit(pixels, x1, y1, x2, y2); if (doubleFit.IsSolved) { PSFFit fit1 = doubleFit.GetGaussian1(); PSFFit fit2 = doubleFit.GetGaussian2(); IImagePixel center1 = null; IImagePixel center2 = null; TrackedObjectLight trackedObject1; TrackedObjectLight trackedObject2; bool resortToBrightness = false; bool groupIdentified = trackedGroup.IdentifyObjects(fit1, fit2, GUIDING_STAR_MIN_CERTAINTY, out trackedObject1, out trackedObject2); if (!groupIdentified && m_IsFullDisappearance) { dbg += "ReBr::"; groupIdentified = trackedGroup.IdentifyBrightObject(fit1, fit2, STELLAR_OBJECT_MIN_CERTAINTY, out trackedObject1, out trackedObject2, out center1, out center2); resortToBrightness = true; } if (!groupIdentified) { trackedGroup.SetIsTracked(false, NotMeasuredReasons.PSFFittingFailed); dbg += "PsF::"; } else { PSFFit[] fits = new PSFFit[] { fit1, fit2 }; IImagePixel[] centers = new IImagePixel[] { center1, center2 }; TrackedObjectLight[] trackedObjects = new TrackedObjectLight[] { trackedObject1, trackedObject2 }; bool objectCheckSuccessful = resortToBrightness ? trackedGroup.CheckIdentifiedObjects(center1.XDouble, center2.XDouble, center1.YDouble, center2.YDouble) : trackedGroup.CheckIdentifiedObjects(fits[0].XCenter, fits[1].XCenter, fits[0].YCenter, fits[1].YCenter); if (objectCheckSuccessful) { dbg += "ChS::"; bool atLeastOneOK = (fit1.IsSolved && fit1.Certainty > GUIDING_STAR_MIN_CERTAINTY) || (fit2.IsSolved && fit2.Certainty > GUIDING_STAR_MIN_CERTAINTY); double dist = ImagePixel.ComputeDistance(fit1.XCenter, fit2.XCenter, fit1.YCenter, fit2.YCenter); if (!atLeastOneOK || ((dist < 2 || dist > 16) && !resortToBrightness)) { trackedGroup.SetIsTracked(false, NotMeasuredReasons.PSFFittingFailed); } int cntOk = 0; for (int j = 0; j < 2; j++) { PSFFit fit = fits[j]; IImagePixel center = centers[j]; TrackedObjectLight trackedObject = trackedObjects[j]; if (fit.IsSolved && fit.Certainty > STELLAR_OBJECT_MIN_CERTAINTY) { if (resortToBrightness && trackedObject.IsOccultedStar) { trackedObject.SetIsTracked(true, NotMeasuredReasons.FullyDisappearingStarMarkedTrackedWithoutBeingFound, center, fit.Certainty); dbg += "OccDi::"; } else { trackedObject.SetTrackedObjectMatch(fit); trackedObject.SetIsTracked(true, NotMeasuredReasons.TrackedSuccessfully); dbg += "TrSuc::"; } cntOk++; } else if (m_IsFullDisappearance && trackedObject.IsOccultedStar) { trackedObject.SetIsTracked(false, NotMeasuredReasons.FullyDisappearingStarMarkedTrackedWithoutBeingFound, resortToBrightness ? center : null, 1); dbg += "BadCerSuc::"; } else { trackedObject.SetIsTracked(false, NotMeasuredReasons.ObjectCertaintyTooSmall, resortToBrightness ? center : null, resortToBrightness ? fit.Certainty : (double?)null); dbg += "BadCerNOSuc::"; } } if (cntOk == 2) { m_FailedGroupFits = 0; } } else { trackedObjects[0].SetIsTracked(false, NotMeasuredReasons.FailedToLocateAfterDistanceCheck); trackedObjects[1].SetIsTracked(false, NotMeasuredReasons.FailedToLocateAfterDistanceCheck); m_FailedGroupFits++; dbg += "ChU::"; } } } else { m_FailedGroupFits++; dbg += "NoFi::"; } trackedGroup.ValidatePosition(); Trace.WriteLine(dbg); } } } IsTrackedSuccessfully = atLeastOneGroupLocated; if (IsTrackedSuccessfully) { RefinedAverageFWHM = m_TrackedObjects.Cast <TrackedObjectLight>().Average(x => x.RefinedFWHM); } if (m_FailedGroupFits > 10) { Trace.WriteLine("ERR~10+"); } }
public override void NextFrame(int frameNo, IAstroImage astroImage) { IsTrackedSuccessfully = false; // For each of the non manualy positioned Tracked objects do a PSF fit in the area of its previous location for (int i = 0; i < m_TrackedObjects.Count; i++) { TrackedObjectLight trackedObject = (TrackedObjectLight)m_TrackedObjects[i]; trackedObject.NextFrame(); if (trackedObject.OriginalObject.IsFixedAperture || (trackedObject.OriginalObject.IsOcultedStar() && m_IsFullDisappearance)) { // Star position will be determined after the rest of the stars are found } else { uint[,] pixels = astroImage.GetPixelsArea(trackedObject.Center.X, trackedObject.Center.Y, 17); var fit = new PSFFit(trackedObject.Center.X, trackedObject.Center.Y); fit.FittingMethod = TangraConfig.Settings.Tracking.CheckElongation ? PSFFittingMethod.NonLinearAsymetricFit : PSFFittingMethod.NonLinearFit; fit.Fit(pixels); if (fit.IsSolved) { if (fit.Certainty < GUIDING_STAR_MIN_CERTAINTY) { trackedObject.SetIsTracked(false, NotMeasuredReasons.ObjectCertaintyTooSmall); } else if (fit.FWHM < STELLAR_OBJECT_MIN_FWHM || fit.FWHM > STELLAR_OBJECT_MAX_FWHM) { trackedObject.SetIsTracked(false, NotMeasuredReasons.FWHMOutOfRange); } else if (TangraConfig.Settings.Tracking.CheckElongation && fit.ElongationPercentage > STELLAR_OBJECT_MAX_ELONGATION) { trackedObject.SetIsTracked(false, NotMeasuredReasons.ObjectTooElongated); } else { trackedObject.SetTrackedObjectMatch(fit); trackedObject.SetIsTracked(true, NotMeasuredReasons.TrackedSuccessfully); } } } } bool atLeastOneObjectLocated = false; for (int i = 0; i < m_TrackedObjects.Count; i++) { TrackedObjectLight trackedObject = (TrackedObjectLight)m_TrackedObjects[i]; bool needsRelativePositioning = trackedObject.OriginalObject.IsFixedAperture || (trackedObject.OriginalObject.IsOcultedStar() && m_IsFullDisappearance); if (!needsRelativePositioning && trackedObject.IsLocated) { atLeastOneObjectLocated = true; } if (!needsRelativePositioning) { continue; } double totalX = 0; double totalY = 0; int numReferences = 0; for (int j = 0; j < m_TrackedObjects.Count; j++) { TrackedObjectLight referenceObject = (TrackedObjectLight)m_TrackedObjects[j]; if (referenceObject.IsLocated) { totalX += (trackedObject.OriginalObject.ApertureStartingX - referenceObject.OriginalObject.ApertureStartingX) + referenceObject.Center.XDouble; totalY += (trackedObject.OriginalObject.ApertureStartingY - referenceObject.OriginalObject.ApertureStartingY) + referenceObject.Center.YDouble; numReferences++; atLeastOneObjectLocated = true; } } if (numReferences == 0) { trackedObject.SetIsTracked(false, NotMeasuredReasons.FitSuspectAsNoGuidingStarsAreLocated); } else { double x_double = totalX / numReferences; double y_double = totalY / numReferences; if (trackedObject.OriginalObject.IsFixedAperture) { trackedObject.SetIsTracked(true, NotMeasuredReasons.FixedObject, new ImagePixel(x_double, y_double), 1); } else if (trackedObject.OriginalObject.IsOcultedStar()) { int x = (int)(Math.Round(totalX / numReferences)); int y = (int)(Math.Round(totalY / numReferences)); int matrixSize = (int)(Math.Round(trackedObject.OriginalObject.ApertureInPixels * 1.5)); if (matrixSize % 2 == 0) { matrixSize++; } if (matrixSize > 17) { matrixSize = 17; } uint[,] pixels = astroImage.GetPixelsArea(x, y, matrixSize); PSFFit fit = new PSFFit(x, y); fit.Fit(pixels); if (fit.IsSolved && fit.Certainty > STELLAR_OBJECT_MIN_CERTAINTY) { trackedObject.SetIsTracked(true, NotMeasuredReasons.TrackedSuccessfully); trackedObject.SetTrackedObjectMatch(fit); } else if (m_IsFullDisappearance) { trackedObject.SetIsTracked(false, NotMeasuredReasons.FullyDisappearingStarMarkedTrackedWithoutBeingFound); } else { trackedObject.SetIsTracked(false, NotMeasuredReasons.ObjectCertaintyTooSmall); } } } } IsTrackedSuccessfully = atLeastOneObjectLocated; }