Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

dotnetでOpenCvSharpを導入してみる

半年ぐらい前、dotnetGtk#にてGUIの作成を行う記事を公開しました。
elsammit-beginnerblg.hatenablog.com

そこで下記のようなコメントを残していたのですが、、、
やれておりませんでした。。。

 ここまでは出来たのですが、OpenCVとの連携が出来ていないです泣
 どうやるのかな??
 最終的にはOpenCVと連携したいので、もう少し調べてみます。
 また分かったらブログにて備忘録残しておこうと思います!!

今回、dotnetでOpenCvSharpをインストールする方法とGtk#との連携方法をまとめたいと思います。



■環境

前回はUbuntu16.04を用いましたが、
今回はUbuntu20.04を利用しました。

またGtk#やdotnetのインストールは実施済みの環境を前提とします。

dotnetGtk#を用意

OpenCvSharpをダウンロードする前にdotnetGtk#を用意するまでをまとめておこうと思います。

まずはGtk#を用意するためのディレクトリを作成し、
さらに作成したディレクトリに移動します。

mkdir gtkApp
cd gtkApp

次にこちらのコマンドでGtk#を作成します。

dotnet new gtkapp

コマンド実行が成功していれば、

MainWindow.cs  
MainWindow.glade  
Program.cs

といったファイルが生成されているかと思います。

念のため試しに動かしてみます。
こちらのコマンドで実行可能です。

dotnet run

上手く動作すればこちらのような画面が表示されるかと思います。
f:id:Elsammit:20210418211814p:plain

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も関わってくるからよく分からなくなってくる。
一応自分でビルドした環境を所定の位置に入れてパス通してみたけど動かず。。。困った。