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