OpenCVSharpのMatオブジェクトをBitmapオブジェクトに変換

御車還シ コンピュータ
出典:国立国会図書館「NDLイメージバンク」

WinFormsでデスクトップアプリケーションを作成する場合、UIに表示する部分のBitmapオブジェクトとOpenCVのフィルター用にMatを用意する必要があり、相互に変換する必要があります。OpenCVのフィルター類は他言語の情報が参考になりますが、BitmapとMatの変換はWinForms固有の問題ですので、調べて試してみました。

OpenCVSharpの導入方法

ソース

// 
// MatをBitmapに変換
// 

using System;
using System.Windows.Forms;
using System.Drawing;

using OpenCvSharp;
using OpenCvSharp.Extensions;

// コンパイル
// csc MatToBmp.cs /r:OpenCvSharp.dll /r:OpenCvSharp.Extensions.dll

class Form1 : Form
{
    PictureBox picbox1;

    // コンストラクタ
    Form1()
    {
        picbox1 = new PictureBox {
            Dock = DockStyle.Fill,
            SizeMode = PictureBoxSizeMode.Zoom,
        };
        this.Controls.Add(picbox1);

        using (var mat = new Mat(@"H:\csharp\opencv\opencv_logo.png"))j
        {
            picbox1.Image = BitmapConverter.ToBitmap(mat);
        }
    }
    // エントリーポイント
    [STAThread]
    static void Main()
    {
        Application.Run(new Form1());
    }
}

実行


画像ファイルからMatオブジェクトを生成し、BitmapConverter.ToBitmap()でBitmapに変換してPictureboxのImageにセットして画像を表示しています。matオブジェクトはusingしていますので、bitmapへの変換作業が終了後Dispose()されていると思われます。
この方法を抑えておくとOpenCVSharpで加工をした結果のMatオブジェクトをPcitureBoxで表示させるようなシナリオで活用できます。
また、BitmapオブジェクトをMatオブジェクトへ変換する場合以下の様になります。

var mat = BitmapConverter.ToMat(bmp)

変換処理はオブジェクトの生成を伴い、画像の解像度などによっては多量のメモリを消費する場合があるので、なるべく少ない回数になるようにアプリケーションを設計する必要があります。また、利用しなくなったオブジェクトはなるべく早めにDispose()することでリソースの解放を促した方が良さそうです。

スポンサーリンク

コメント