以前、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 { staticvoid 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型で扱うということを意識すれば、だいたい同じ感覚で書けそうですね。
WPFとの連携
以前のサンプルと同じように、OpenCVSharpで加工した画像を、WPFのImageコントロールで表示してみます。
MatからWriteableBitmapへの変換
Mat型にもToWriteableBitmapという拡張メソッドが用意されていて、IplImageと同じようにWriteableBitmapに変換できます。
サンプルコード
ボタンを押すと、このように画像をグレースケールで表示します。
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>publicpartialclass MainWindow : System.Windows.Window { public MainWindow() { InitializeComponent(); } privatevoid 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.Windows
とOpenCvSharp
名前空間に、それぞれWindowという同名のクラスが定義されています。
そのため、usingでどちらの名前空間も読み込んでいる場合には、MainWindowの親クラス指定で、明示的にクラス名を指定する必要があります。