読者です 読者をやめる 読者になる 読者になる

キャプチャしたIplImageをWriteableBitmapに変換すると反転する問題

Bitmapの方を片づけて一息ついてしまいましたが、当然この問題はWriteableBitmapでも起こるわけで。WriteableBitmapの方には反転する良いメソッドが見当たらなかったので、こちらはcvFlipで解決させました。


研究のプログラムはWPFで作っているので、個人的にはWPFとの変換に力を入れています。ほかのラッパーでWPFと連携できるものは見当たらなかったので、そこだけは自慢できるところかもしれません。が、ほか大多数の利用者にとってはどうでもいいのかな。


AVIをキャプチャし、WPFのウィンドウ上で再生するサンプル

using System;
using KwsmLab.OpenCvSharp;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Threading;

namespace Sample {
    static class Program {
        static void Main(string[] args){

            CvCapture capture = new CvCapture(@"ほげほげ.avi");
            int w = capture.FrameWidth;
            int h = capture.FrameHeight;

            WriteableBitmap wb = new WriteableBitmap(w, h, 96, 96, PixelFormats.Bgr24, null);
            Image image = new Image() {
                Source = wb
            };

            Window window = new Window() {
                Title = "AVI Capture on WPF", 
                Width = w, Height = h,
                Content = image
            };

            DispatcherTimer dt = new DispatcherTimer(DispatcherPriority.Background);
            dt.Interval = TimeSpan.FromMilliseconds(1000 / capture.Fps);
            dt.Tick += delegate {
                WriteableBitmapConverter.ToWriteableBitmap(capture.QueryFrame(), wb);
            };
            dt.Start();

            Application app = new Application();
            app.Run(window);
        }
    }
}

IplImage.ToBitmapやToWriteableBitmapは便利ですが、毎回インスタンスを生成するのでメモリ効率は悪いです。メモリ使用率のグラフを見ると、ガンガン食いつぶしていって極限まで来るとGC、の繰り返しでのこぎりの刃のようになります。

上記の例のようにBitmapConverter・WriteableBitmapConverterを利用し既存のインスタンスに変換結果を入れるようにすると多少はましになります。(でもFlipがあるのでやっぱりだんだん増えてはいく)

エッセンシャル WPF:Windows Presentation Foundation (Programmer’s SLECTION―Microsoft .net Development Series)

エッセンシャル WPF:Windows Presentation Foundation (Programmer’s SLECTION―Microsoft .net Development Series)