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型で扱うということを意識すれば、だいたい同じ感覚で書けそうですね。
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> 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.Windows
とOpenCvSharp
名前空間に、それぞれWindowという同名のクラスが定義されています。
そのため、usingでどちらの名前空間も読み込んでいる場合には、MainWindowの親クラス指定で、明示的にクラス名を指定する必要があります。