public void Show(object value)
 {
     using (var inputImage = (IplImage)value)
     {
         visualizerImage = IplImageHelper.EnsureImageFormat(visualizerImage, inputImage.Size, inputImage.Depth, inputImage.Channels);
         CV.Copy(inputImage, visualizerImage);
     }
     value = null;
 }
        public void Update(IplImage image)
        {
            if (image == null)
            {
                throw new ArgumentNullException("image");
            }
            if (image.Depth != IplDepth.U8)
            {
                double min, max;
                Point  minLoc, maxLoc;
                normalizedImage = IplImageHelper.EnsureImageFormat(normalizedImage, image.Size, IplDepth.U8, image.Channels);
                using (var buffer = image.Reshape(1, 0))
                {
                    CV.MinMaxLoc(buffer, out min, out max, out minLoc, out maxLoc);
                }

                var range = max - min;
                var scale = range > 0 ? 255.0 / range : 0;
                var shift = range > 0 ? -min : 0;
                CV.ConvertScale(image, normalizedImage, scale, shift * scale);
                image = normalizedImage;
            }

            if (!nonPowerOfTwo || image.Width > maxTextureSize || image.Height > maxTextureSize)
            {
                var textureWidth  = Math.Min(maxTextureSize, NearestPowerOfTwo(image.Width));
                var textureHeight = Math.Min(maxTextureSize, NearestPowerOfTwo(image.Height));
                textureImage = IplImageHelper.EnsureImageFormat(textureImage, new Size(textureWidth, textureHeight), image.Depth, image.Channels);
                CV.Resize(image, textureImage, SubPixelInterpolation.Linear);
                image = textureImage;
            }

            OpenTK.Graphics.OpenGL.PixelFormat pixelFormat;
            switch (image.Channels)
            {
            case 1: pixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Luminance; break;

            case 2: pixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Rg; break;

            case 3: pixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Bgr; break;

            case 4: pixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Bgra; break;

            default: throw new ArgumentException("Image has an unsupported number of channels.", "image");
            }

            GL.BindTexture(TextureTarget.Texture2D, texture);
            GL.PixelStore(PixelStoreParameter.UnpackRowLength, image.WidthStep / image.Channels);
            GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, image.Width, image.Height, 0, pixelFormat, PixelType.UnsignedByte, image.ImageData);
        }