private IData Process(BaseImageData <TColor, TDepth> data) { var image = data.Image; if (IsRenderContent) { var name = GetType().Name; Image <TColor, TDepth> preProcessImage = null; try { //if (_preProcessRendering != null && _preProcessRendering.Status == DispatcherOperationStatus.Pending) // _preProcessRendering.Abort(); // the copy is required in order to not influence processing that happens later preProcessImage = PreProcess(image.Copy()); // draw debug information on image -> TODO might worth be worth it to bind that information to the data template directly DrawDebug(preProcessImage); _preProcessRendering = DispatcherHelper.RunAsync(() => { if (preProcessImage == null) { return; } if (preProcessImage is Image <Gray, float> ) { PreProcessImage = (preProcessImage as Image <Gray, float>).ToGradientBitmapSource(true, EmguExtensions.LowConfidence, EmguExtensions.Saturation); } else { PreProcessImage = preProcessImage.ToBitmapSource(); } preProcessImage.Dispose(); }); } catch (Exception) { if (preProcessImage != null) { preProcessImage.Dispose(); } } } try { try { var processedImage = ProcessAndView(image); if (processedImage == null) { return(null); } data.Image = processedImage; } catch (Exception e) { LogFormat("Exception occured in ProcessAndView:{0}{1}{2}", e.Message, Environment.NewLine, e.StackTrace); } } catch (Exception) { //DispatcherHelper.RunAsync(() => //{ // //if (!Messages.Any(m => Equals(e.Message, m))) // // Log(e.Message); //}); return(data); } if (IsRenderContent) { //if (_postProcessRendering != null && _postProcessRendering.Status == DispatcherOperationStatus.Pending) // _postProcessRendering.Abort(); var postProcessImage = data.Image.Copy(); _postProcessRendering = DispatcherHelper.RunAsync(() => { if (postProcessImage == null) { return; } PostProcessImage = postProcessImage.ToBitmapSource(); postProcessImage.Dispose(); }); } return(data); }
private IData Process(BaseImageData <TColor, TDepth> data) { var image = data.Image; if (IsRenderContent) { // draw debug information on image -> TODO might worth be worth it to bind that information to the data template directly var preProcessImage = image.Copy(); Task.Factory.StartNew(() => { if (preProcessImage == null) { return(null); } BitmapSource bitmap; if (preProcessImage is Image <Gray, float> ) { bitmap = (preProcessImage as Image <Gray, float>).ToGradientBitmapSource(true, EmguExtensions.LowConfidence, EmguExtensions.Saturation); } else { bitmap = preProcessImage.ToBitmapSource(true); } preProcessImage.Dispose(); return(bitmap); }).ContinueWith(s => PreProcessImage = s.Result); } try { try { var processedImage = ProcessAndView(image); if (processedImage == null) { return(null); } data.Image = processedImage; } catch (Exception e) { LogFormat("Exception occured in ProcessAndView:{0}{1}{2}", e.Message, Environment.NewLine, e.StackTrace); } } catch (Exception) { //DispatcherHelper.RunAsync(() => //{ // //if (!Messages.Any(m => Equals(e.Message, m))) // // Log(e.Message); //}); return(data); } if (_enableVideoWriter && _videoWriter != null) { WriteImage(data.Image.Copy()); } if (IsRenderContent) { var postProcessImage = data.Image.Copy(); Task.Factory.StartNew(() => { if (postProcessImage == null) { return(null); } BitmapSource bitmap; if (postProcessImage is Image <Gray, float> ) { bitmap = (postProcessImage as Image <Gray, float>).ToGradientBitmapSource(true, EmguExtensions.LowConfidence, EmguExtensions.Saturation); } else { bitmap = postProcessImage.ToBitmapSource(true); } postProcessImage.Dispose(); return(bitmap); }).ContinueWith(s => PostProcessImage = s.Result); } return(data); }