dotnetでOpenCvSharpを導入してみる
半年ぐらい前、dotnetでGtk#にてGUIの作成を行う記事を公開しました。
elsammit-beginnerblg.hatenablog.com
そこで下記のようなコメントを残していたのですが、、、
やれておりませんでした。。。
ここまでは出来たのですが、OpenCVとの連携が出来ていないです泣
どうやるのかな??
最終的にはOpenCVと連携したいので、もう少し調べてみます。
また分かったらブログにて備忘録残しておこうと思います!!
今回、dotnetでOpenCvSharpをインストールする方法とGtk#との連携方法をまとめたいと思います。
■dotnetでGtk#を用意
OpenCvSharpをダウンロードする前にdotnetでGtk#を用意するまでをまとめておこうと思います。
まずはGtk#を用意するためのディレクトリを作成し、
さらに作成したディレクトリに移動します。
mkdir gtkApp cd gtkApp
次にこちらのコマンドでGtk#を作成します。
dotnet new gtkapp
コマンド実行が成功していれば、
MainWindow.cs MainWindow.glade Program.cs
といったファイルが生成されているかと思います。
念のため試しに動かしてみます。
こちらのコマンドで実行可能です。
dotnet run
上手く動作すればこちらのような画面が表示されるかと思います。
■dotnetでOpenCvSharpインストール
ではOpenCvSharpをインストールしていきます。
先ほど作成したgtkappディレクトリ配下にてこちらのコマンドを実行します。
dotnet add package OpenCvSharp4 dotnet add package OpenCvSharp4.runtime.ubuntu.18.04-x64
これでOpenCvSharpをdotnetでインストールさせることができます。
すでに環境一式が用意されていたので簡単にインストール出来て便利!!
こちらのOpenCvSharpのインストールですが、
dotnetで新規(GUI)アプリをnewした後に毎度packageをaddする必要があるので注意。
■OpenCvShrpを使ってみる
では実際にOpenCvSharpを組み入れて動かしてみたいと思います。
今回は簡単のために読み出した画像を別画像として保存させてみます。
MainWindow.csのコードはこちらになっているかと思います。
using System; using Gtk; using UI = Gtk.Builder.ObjectAttribute; namespace GtkApp { class MainWindow : Window { [UI] private Label _label1 = null; [UI] private Button _button1 = null; private int _counter; public MainWindow() : this(new Builder("MainWindow.glade")) { } private MainWindow(Builder builder) : base(builder.GetRawOwnedObject("MainWindow")) { builder.Autoconnect(this); DeleteEvent += Window_DeleteEvent; _button1.Clicked += Button1_Clicked; } private void Window_DeleteEvent(object sender, DeleteEventArgs a) { Application.Quit(); } private void Button1_Clicked(object sender, EventArgs a) { _counter++; _label1.Text = "Hello World! This button has been clicked " + _counter + " time(s)."; } } }
こちらのコードに対してまずOpenCvSharpを定義します。
using OpenCvSharp;
次にMainWindowコンストラクタ内にこちらのコードを入力します。
Mat mat = new Mat("画像パス"); Cv2.ImWrite("作成画像ファイル名",mat);
最後にクラス名をこちらのように置き換え。
class MainWindow : Gtk.Window
どうやらWindowだけだと、
Gtk.Windowなのか、OpenCvSharp.Windowなのか区別が出来ずエラーになってしまうようです。
先ほどの変更内容を追記したコードがこちら。
using System; using Gtk; using OpenCvSharp; using UI = Gtk.Builder.ObjectAttribute; namespace GtkApp { class MainWindow : Window { [UI] private Label _label1 = null; [UI] private Button _button1 = null; private int _counter; public MainWindow() : this(new Builder("MainWindow.glade")) { } private MainWindow(Builder builder) : base(builder.GetRawOwnedObject("MainWindow")) { Mat mat = new Mat("画像パス"); Cv2.ImWrite("作成画像ファイル名",mat); builder.Autoconnect(this); DeleteEvent += Window_DeleteEvent; _button1.Clicked += Button1_Clicked; } private void Window_DeleteEvent(object sender, DeleteEventArgs a) { Application.Quit(); } private void Button1_Clicked(object sender, EventArgs a) { _counter++; _label1.Text = "Hello World! This button has been clicked " + _counter + " time(s)."; } } }
こちらを実行してみます。
dotnet run
ディレクトリ内にCv2.ImWriteで指定したファイルが生成されていればOKです。
■(補足)OpenCvSharpビルド手順
補足としてOpenCvSharpビルド手順をまとめておきます。
まずはGitHubより環境一式をダウンロードします。
git clone https://github.com/GtkSharp/GtkSharp.git
次に
cd opencvsharp/src
でsrc配下に移動し、
mkdir build
でビルドディレクトリを作成。
そして、
cmake .. make sudo make install sudo ldconfig
でビルド+インストールを実施し、最後にパスを通しておきます。
成功すれば、OpenCvSharpExternディレクトリが生成され、
配下にlibOpenCvSharpExtern.soファイルが生成されているかと思います。
こちらがLinuxでOpenCvSharpを用いる際の.soファイルになります。
■最後に
今回はdotnetでOpenCvSharp導入手順についてまとめてみました。
次回はGtk#とOpenCvSharpをてGUI画面上に動画や画像の表示をさせてみたいな。と思っております。
別途monodevelopでもOpenCvSharpを導入しようとしているのだけれどこちらはうまく行かず。。。
monodevelopだとNugetも関わってくるからよく分からなくなってくる。
一応自分でビルドした環境を所定の位置に入れてパス通してみたけど動かず。。。困った。