WinFormsでデスクトップアプリケーションにOpenCVを組み込む場合、UIに表示する部分はBitmapオブジェクト、OpenCVのフィルターでつかうMatの2つのオブジェクトを使うことになります。相互に変換する必要があるので方法を調べてみました。
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()することでリソースの解放を促した方が良さそうです。
コメント