internal override void SettingsUpdated() { base.SettingsUpdated(); var firstNotSecond = ResponseValues.Select(c => c.Y).Except(Parent.SettingContainer.Settings.CalibrationSettings.PhotometricCalibrationSettings.ResponseValues).ToList(); var secondNotFirst = Parent.SettingContainer.Settings.CalibrationSettings.PhotometricCalibrationSettings.ResponseValues.Except(ResponseValues.Select(c => c.Y)).ToList(); bool changed = firstNotSecond.Any() || secondNotFirst.Any(); if (changed) { List <double> l = Parent.SettingContainer.Settings.CalibrationSettings.PhotometricCalibrationSettings.ResponseValues.ToList(); ResponseValues.Clear(); ResponseValues.AddRange(l.Select((c, i) => new DataPoint(i, c))); } Vignette = new CvImageContainer(); try { if (!string.IsNullOrEmpty(Parent.SettingContainer.Settings.CalibrationSettings.PhotometricCalibrationSettings.VignetteFileBase64)) { byte[] data = Convert.FromBase64String(Parent.SettingContainer.Settings.CalibrationSettings.PhotometricCalibrationSettings.VignetteFileBase64); Mat temp = new Mat(); CvInvoke.Imdecode(data, Emgu.CV.CvEnum.ImreadModes.Grayscale, temp); Vignette.CvImage = temp; } } catch (Exception) { } }
public PrintCharucoBoardDialogModel(Action <PrintCharucoBoardDialogModel> createHandel, Action <PrintCharucoBoardDialogModel> closeHandel) { Image = new CvImageContainer(); _CloseCommand = new RelayCommand <object>( async(object o) => { await Task.Factory.StartNew(() => { closeHandel(this); }); }); _CreateCommand = new RelayCommand <object>( async(object o) => { await Task.Factory.StartNew(() => { createHandel(this); }); }); }
private Task DoLoadFromFile(object o) { return(Task.Factory.StartNew(() => { Parent.SyncContext.Post(c => { CustomDialog customDialog = new CustomDialog() { Title = "Select calibration file" }; var dataContext = new ReplaySelectDialogModel(obj => { Parent.SyncContext.Post(d => { Task.Factory.StartNew(async() => { ReplaySelectDialogModel replaySelectDialogModel = obj as ReplaySelectDialogModel; if (replaySelectDialogModel.SelectedFile != null) { MetroDialogSettings settings = new MetroDialogSettings() { AnimateShow = false, AnimateHide = false }; var controller = await Parent.DialogCoordinator.ShowProgressAsync(Parent, "Please wait...", "Loading calibration images!", settings: Parent.MetroDialogSettings); controller.SetCancelable(false); controller.SetIndeterminate(); string file = null; string outputPath = null; Parent.SyncContext.Send(async d2 => { file = replaySelectDialogModel.SelectedFile.FullPath; outputPath = Path.Combine(Path.GetTempPath(), "firefly", Guid.NewGuid().ToString()); }, null); RawDataReader reader = new RawDataReader(file, RawReaderMode.Camera0); reader.Open(); MemoryImageExporter exporter = new MemoryImageExporter(); exporter.AddFromReader(reader, delegate(double percent) { double value = percent; value = value > 1 ? 1 : value; controller.SetProgress(value); }); reader.Close(); Parent.SyncContext.Post(d2 => { int i = 0; int count = exporter.Images.Count; foreach (Mat m in exporter.Images) { //double value = 0.5 + i / count * 0.5; //value = value > 1 ? 1 : value; //controller.SetProgress(value); if (i++ % 20 == 0) { int squaresX = Parent.SettingContainer.Settings.CalibrationSettings.ChArucoCalibrationSettings.SquaresX; int squaresY = Parent.SettingContainer.Settings.CalibrationSettings.ChArucoCalibrationSettings.SquaresY; float squareLength = Parent.SettingContainer.Settings.CalibrationSettings.ChArucoCalibrationSettings.SquareLength; float markerLength = Parent.SettingContainer.Settings.CalibrationSettings.ChArucoCalibrationSettings.MarkerLength; PredefinedDictionaryName dictionary = Parent.SettingContainer.Settings.CalibrationSettings.ChArucoCalibrationSettings.Dictionary; ChArUcoImageContainer cauic = new ChArUcoImageContainer(squaresX, squaresY, squareLength, markerLength, dictionary); CvImageContainer container = new CvImageContainer(); container.CvImage = m; cauic.OriginalImage = container; Images.Add(cauic); } } controller.CloseAsync(); }, null); } }, TaskCreationOptions.LongRunning); Parent.DialogCoordinator.HideMetroDialogAsync(Parent, customDialog); }, null); }); Parent.ReplayViewModel.Refresh(); dataContext.FilesForReplay.AddRange(Parent.ReplayViewModel.FilesForReplay.Where(x => !x.Item1.IsRemote)); customDialog.Content = new ReplaySelectDialog { DataContext = dataContext }; Parent.DialogCoordinator.ShowMetroDialogAsync(Parent, customDialog); }, null); })); }
internal override void SettingsUpdated() { base.SettingsUpdated(); bool changed = false; changed |= Parent.SettingContainer.Settings.CalibrationSettings.IntrinsicCalibrationSettings.Fx != Fx; changed |= Parent.SettingContainer.Settings.CalibrationSettings.IntrinsicCalibrationSettings.Fy != Fy; changed |= Parent.SettingContainer.Settings.CalibrationSettings.IntrinsicCalibrationSettings.Cx != Cx; changed |= Parent.SettingContainer.Settings.CalibrationSettings.IntrinsicCalibrationSettings.Cy != Cy; changed |= Parent.SettingContainer.Settings.CalibrationSettings.IntrinsicCalibrationSettings.Alpha != Alpha; var firstNotSecond = _DistCoeffs.Except(Parent.SettingContainer.Settings.CalibrationSettings.IntrinsicCalibrationSettings.DistCoeffs).ToList(); var secondNotFirst = Parent.SettingContainer.Settings.CalibrationSettings.IntrinsicCalibrationSettings.DistCoeffs.Except(_DistCoeffs).ToList(); changed |= firstNotSecond.Any() || secondNotFirst.Any(); if (changed) { Fx = Parent.SettingContainer.Settings.CalibrationSettings.IntrinsicCalibrationSettings.Fx; Fy = Parent.SettingContainer.Settings.CalibrationSettings.IntrinsicCalibrationSettings.Fy; Cx = Parent.SettingContainer.Settings.CalibrationSettings.IntrinsicCalibrationSettings.Cx; Cy = Parent.SettingContainer.Settings.CalibrationSettings.IntrinsicCalibrationSettings.Cy; Alpha = Parent.SettingContainer.Settings.CalibrationSettings.IntrinsicCalibrationSettings.Alpha; _DistCoeffs = Parent.SettingContainer.Settings.CalibrationSettings.IntrinsicCalibrationSettings.DistCoeffs.ToList(); if (_DistCoeffs.Count == 4) { K1 = _DistCoeffs[0]; K2 = _DistCoeffs[1]; K3 = _DistCoeffs[2]; K4 = _DistCoeffs[3]; } Mat board = ChArUcoCalibration.DrawBoard(5, 5, 0.04f, 0.02f, new System.Drawing.Size(Parent.CameraViewModel.ImageWidth, Parent.CameraViewModel.ImageHeight), 10, PredefinedDictionaryName.Dict6X6_250); Mat boardDist = board.Clone(); Mat cameraMatrix = new Mat(3, 3, Emgu.CV.CvEnum.DepthType.Cv64F, 1); Mat distCoeffs = new Mat(1, Parent.CameraViewModel.FishEyeCalibration ? 4 : _DistCoeffs.Count, Emgu.CV.CvEnum.DepthType.Cv64F, 1); cameraMatrix.SetValue(0, 0, Fx); cameraMatrix.SetValue(1, 1, Fy); cameraMatrix.SetValue(0, 1, Fx * Alpha); cameraMatrix.SetValue(0, 2, Cx); cameraMatrix.SetValue(1, 2, Cy); cameraMatrix.SetValue(2, 2, 1.0f); Mat newK = new Mat(3, 3, Emgu.CV.CvEnum.DepthType.Cv64F, 1); for (int i = 0; i < distCoeffs.Cols && (Parent.CameraViewModel.FishEyeCalibration ? i < 4 : true); i++) { distCoeffs.SetValue(0, i, _DistCoeffs[i]); } if (Parent.CameraViewModel.FishEyeCalibration) { Fisheye.EstimateNewCameraMatrixForUndistorRectify(cameraMatrix, distCoeffs, new System.Drawing.Size(Parent.CameraViewModel.ImageWidth, Parent.CameraViewModel.ImageHeight), Mat.Eye(3, 3, Emgu.CV.CvEnum.DepthType.Cv64F, 1), newK, 0, new System.Drawing.Size(Parent.CameraViewModel.ImageWidth, Parent.CameraViewModel.ImageHeight), 0.3); Mat map1 = new Mat(); Mat map2 = new Mat(); Fisheye.InitUndistorRectifyMap(cameraMatrix, distCoeffs, Mat.Eye(3, 3, Emgu.CV.CvEnum.DepthType.Cv64F, 1), newK, new System.Drawing.Size(Parent.CameraViewModel.ImageWidth, Parent.CameraViewModel.ImageHeight), Emgu.CV.CvEnum.DepthType.Cv32F, map1, map2); CvInvoke.Remap(board, boardDist, map1, map2, Emgu.CV.CvEnum.Inter.Linear, Emgu.CV.CvEnum.BorderType.Constant); } else { CvInvoke.Undistort(board, boardDist, cameraMatrix, distCoeffs); } Parent.SyncContext.Post(c => { ChAruCoBoard = new CvImageContainer(); ChAruCoBoard.CvImage = boardDist; }, null); } }
public void Fired(IOProxy proxy, List <AbstractProxyEventData> eventData) { CameraEventData cameraEventData = (CameraEventData)eventData.FirstOrDefault(c => c is CameraEventData); if (cameraEventData != null) { Task.Factory.StartNew(() => { Mat mat = cameraEventData.Image; bool undistort = false; Parent.SyncContext.Send(o => { undistort = Undistort; if (GammaCorretion) { Mat result = new Mat(ImageWidth, ImageHeight, DepthType.Cv32F, 1); int i = 0; Mat lut = new Mat(1, 256, DepthType.Cv32F, 1); foreach (double val in Parent.SettingContainer.Settings.CalibrationSettings.PhotometricCalibrationSettings.ResponseValues) { lut.SetValue(0, i++, (byte)val); } CvInvoke.LUT(mat, lut, result); result.ConvertTo(mat, DepthType.Cv8U); } if (VignetteCorretion) { Mat invVignette = new Mat(ImageWidth, ImageHeight, DepthType.Cv32F, 1); Mat result = new Mat(ImageWidth, ImageHeight, DepthType.Cv32F, 1); CvInvoke.Divide(Mat.Ones(ImageWidth, ImageHeight, DepthType.Cv32F, 1), Parent.CalibrationViewModel.PhotometricCalibrationViewModel.Vignette.CvImage, invVignette, 255, DepthType.Cv32F); CvInvoke.Multiply(mat, invVignette, result, 1, DepthType.Cv32F); result.ConvertTo(mat, DepthType.Cv8U); } } , null); if (undistort) { Mat matUndist = new Mat(ImageWidth, ImageHeight, DepthType.Cv8U, 1); if (FishEyeCalibration) { Mat map1 = new Mat(); Mat map2 = new Mat(); Fisheye.InitUndistorRectifyMap(OrginalCameraMatrix, DistortionCoefficients, Mat.Eye(3, 3, DepthType.Cv64F, 1), CenteredCameraMatrix, new System.Drawing.Size(ImageWidth, ImageHeight), DepthType.Cv32F, map1, map2); CvInvoke.Remap(mat, matUndist, map1, map2, Inter.Linear, BorderType.Constant); } else { CvInvoke.Undistort(mat, matUndist, CenteredCameraMatrix, DistortionCoefficients); } mat = matUndist; } _FPSCounter.CountFrame(); Parent.SyncContext.Post(o => { ExposureTime = (eventData[0] as CameraEventData).ExposureTime; Image = new CvImageContainer(); Image.CvImage = mat; } , null); }); } }