SourceChord

C#とXAML好きなプログラマの備忘録。最近はWPF系の話題が中心です。

OpenCvSharp3を使ってみた

以前、C#からOpenCVを扱うためのラッパーライブラリのOpenCvSharpというライブラリを使ってみました↓
http://sourcechord.hatenablog.com/entry/2014/09/22/010344

OpenCV3.0に対応した、このライブラリの新バージョンOpenCvSharp3を使ってみたのでφ(..)メモメモ

変更点については、作者さんの↓の記事を参照

よく使うクラスなどに関わる、大きな変更点は以下のような点でしょうか。

  • IplImage型がなくなった
  • Cvクラス、CvWindowクラスなどがなくなった⇒Cv2クラス、Windowクラスを使う

今回のサンプル類一式は、以下の場所に置いてます。
https://github.com/sourcechord/OpenCvSharp3Sample

コンソールアプリ

とりあえず、GitHubのReadMeを見ながら、最低限のサンプルコードを動かしてみます。

    class Program
    {
        static void Main(string[] args)
        {
            var src = new Mat(@"Images/1.jpg");
            var dst = new Mat();

            Cv2.CvtColor(src, dst, ColorConversionCodes.BGRA2GRAY);

            using (new Window("dst image", dst))
            {
                Cv2.WaitKey();
            }
        }
    }

画像データは、IplImage型を使わずにMat型で扱うということを意識すれば、だいたい同じ感覚で書けそうですね。

f:id:minami_SC:20160811121338p:plain:w400

WPFとの連携

以前のサンプルと同じように、OpenCVSharpで加工した画像を、WPFのImageコントロールで表示してみます。

MatからWriteableBitmapへの変換

Mat型にもToWriteableBitmapという拡張メソッドが用意されていて、IplImageと同じようにWriteableBitmapに変換できます。

サンプルコード

ボタンを押すと、このように画像をグレースケールで表示します。
f:id:minami_SC:20160811121355p:plain:w400

MainWindow.xaml

<Window x:Class="WpfSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:local="clr-namespace:WpfSample"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        Title="MainWindow"
        Width="525"
        Height="350"
        mc:Ignorable="d">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Image x:Name="imgResult" Margin="10" />
        <Button Grid.Row="1"
                Width="75"
                Margin="10"
                HorizontalAlignment="Right"
                VerticalAlignment="Top"
                Click="Button_Click"
                Content="表示" />
    </Grid>
</Window>

MainWindow.xaml.cs

    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : System.Windows.Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var src = new Mat(@"Images/1.jpg");
            var dst = new Mat();
            Cv2.CvtColor(src, dst, ColorConversionCodes.BGRA2GRAY);
            imgResult.Source = dst.ToWriteableBitmap();
        }
    }

注意点
System.WindowsOpenCvSharp名前空間に、それぞれWindowという同名のクラスが定義されています。
そのため、usingでどちらの名前空間も読み込んでいる場合には、MainWindowの親クラス指定で、明示的にクラス名を指定する必要があります。