public IObservable <IplImage> Generate <TSource>(IObservable <TSource> source) { return(Observable.Defer(() => { var flipBuffer = default(IplImage); return source.CombineEither( ShaderManager.WindowSource, (input, window) => { IplImage temp; PixelType pixelType; PixelFormat pixelFormat; var rect = RegionOfInterest.GetValueOrDefault(new Rect(0, 0, window.Width, window.Height)); var result = new IplImage(new Size(rect.Width, rect.Height), IplDepth.U8, 3); rect.Y = window.Height - (rect.Y + rect.Height); TextureHelper.PackPixelStore(result, out pixelFormat, out pixelType); GL.ReadPixels(rect.X, rect.Y, rect.Width, rect.Height, pixelFormat, pixelType, result.ImageData); if (flipBuffer == null || flipBuffer.Size != result.Size) { flipBuffer = new IplImage(result.Size, result.Depth, result.Channels); } CV.Flip(result, flipBuffer, FlipMode.Vertical); temp = result; result = flipBuffer; flipBuffer = temp; return result; }); })); }
public override IObservable <IplImage> Process(IObservable <Texture> source) { return(Observable.Defer(() => { var flipBuffer = default(IplImage); return source.Select(texture => { int width, height; PixelType pixelType; PixelFormat pixelFormat; GL.BindTexture(TextureTarget.Texture2D, texture.Id); GL.GetTexLevelParameter(TextureTarget.Texture2D, 0, GetTextureParameter.TextureWidth, out width); GL.GetTexLevelParameter(TextureTarget.Texture2D, 0, GetTextureParameter.TextureHeight, out height); var result = new IplImage(new Size(width, height), Depth, Channels); TextureHelper.PackPixelStore(result, out pixelFormat, out pixelType); GL.GetTexImage(TextureTarget.Texture2D, 0, pixelFormat, pixelType, result.ImageData); var flipMode = FlipMode; if (flipMode.HasValue) { IplImage temp; if (flipBuffer == null) { flipBuffer = new IplImage(result.Size, result.Depth, result.Channels); } CV.Flip(result, flipBuffer, flipMode.Value); temp = result; result = flipBuffer; flipBuffer = temp; } return result; }); })); }