fc2ブログ

Ubuntu 20.04でOpenCV 4.3.0を使う(2)

 前回の続きです。今回はOpenCVの画像処理部を「共有ライブラリ」にして「.NET Core(C#)」から読み出す試みです。共有ライブラリ(Shared Library)は、WindowsでいうDLL(Dynamic Link Library)のことで、Linux(Unix系)ではso(Shared Object)ファイルのことです。

 今回作成する共有ライブラリ「image_proc_sl.so」のソースコードは以下の通り。前回の画像表示プログラムを参考に、カラーとグレー画像を表示する単純なものとしました。
// image_proc_sl.cpp
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>

extern "C" int ImageProc()
{
cv::Mat img;
img = cv::imread("dog.jpg", cv::IMREAD_COLOR);
cv::namedWindow("image", cv::WINDOW_AUTOSIZE);
cv::imshow("image", img);

cv::Mat gray_img;
gray_img = cv::imread("dog.jpg", cv::IMREAD_GRAYSCALE);
cv::namedWindow("Gray_image", cv::WINDOW_AUTOSIZE);
cv::imshow("Gray_image", gray_img);

cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
以下のコマンドでビルドして「*.so」ファイルを作成しました。
g++ -shared -fPIC image_proc_sl.cpp -o image_proc_sl.so -I/usr/local/include/opencv4/ -L/usr/local/lib -lopencv_core -lopencv_imgcodecs -lopencv_highgui

 次に読み出す側の「.NET Core」のコードを作成します。ターミナルから以下のコマンドを打ち込むと「OpenCV_test」フォルダが作成され、
dotnet new console -o OpenCV_test
そのフォルダ内の「Program.cs」を以下の通り編集しました。
// Program.cs
using System;
using System.Runtime.InteropServices;
using System.IO;

namespace OpenCv_test
{
class Program
{
[DllImport("./image_proc_sl.so")]
static extern int ImageProc();

static void Main()
{
ImageProc();
}
}
}
このフォルダ(この場合はOpenCV_testフォルダ)で以下のコマンドを実行するとビルドされました。
dotnet build
ビルドされた実行ファイル(OpenCv_test.dll)は「bin/Debug/netcoreapp3.1」という深い階層の中にありますので、先程作成した「image_proc_sl.so」ファイルを「OpenCv_test.dll」と同じフォルダにコピーしました。合わせて、画像ファイルも同様に同じフォルダにコピーしました。その移動先のフォルダで以下のコマンドで実行させました。
dotnet ./OpenCV_test.dll
実行結果は以下の通りです。dotnetCoreRun_Result_200724.png問題なく、動作しました。

 余談ですが、この共有ライブラリを「.NET Core」から実行成功するまでに「コアダンプエラー」に引っかかってうまく行きませんでした。結局は試行錯誤している内にうまく行ったのですが、うまく行った原因がよく分かっていません。不具合の再現性が取れずじまいです。やったことは、試行錯誤の中で生成された数多くの失敗ファイル類を一層(削除)して、新規にコードを作り直しただけなんですけどね。何か悪さをしていたファイルがあったのでしょうか・・?
 また、新しい共有ライブラリを別に作って、問題なく「.NET Core(C#)」から読み出せて、動作することを確認しようと思います。
スポンサーサイト



Ubuntu 20.04でOpenCV 4.3.0を使う(1)

 久々にOpenCVを触りたくなって、最新版4.3.0(20/04/06 Release)をUbuntu 20.04にインストールしました。最近、Python環境からはpipコマンドで簡単にOpenCVをインストール出来ますが、今回はPythonではなく、C++でコーディングするための環境です。

 Ubuntuの「.NET Core環境」でOpenCVを使いたいのですが、
① Python上のOpenCV環境との連携の仕方が良く分からない
② OpenCvSharpもチャレンジしたがうまく行かない(18.04まではサポート、20.04はまだ?)
の問題がありました。

 取り急ぎ、C++でOpenCVのコードを組んで「.NET Core」からコールする作戦に切り替えました。.NET CoreからわざわざOpenCVをコールせずに、「C++のみ」ですべてをコーディングすれば済むことですが、OpenCVの画像処理部だけを独立した「共有ライブラリ」のように使いたいのが今回の主旨です。

 以下、OpenCVのインストール手順の備忘録です。
 まず、OpenCVのWebサイトの「Releases」から「Sources」を選び、opencv-4.3.0.zipをダウンロードしました。Opencv_install_200712.pngzipファイルをhomeフォルダに解凍し、以下のコマンドを順番に実行しました。cmakeのパラメータ設定はデフォルトのままで、buildには時間がかかりますので、気長に終了まで待ちました。
cd opencv-4.3.0
mkdir build
cd build
cmake ..
cmake --build .
make -j4
sudo make install
sudo ldconfig
エラーなくすべて完遂しました!まずは一安心。昔はbuildで頻繁にエラーが出て悩まされましたね・・。エラーが出た場合は、cmakeのパラメータを自分のPC環境に合わせる必要があります。Python環境へのOpenCVのインストール(コマンド一発)に対し、相変わらず大変面倒な作業でした。
インストールされたヘッダファイルやライブラリは以下のフォルダにありました。
header files:   /usr/local/include/opencv4/opencv2
librarIes: /usr/local/lib

 インストールが完了したので、以下のコードを作成し、動作確認しました。画像ファイル(dog.jpg)はソースコードと同じフォルダに入れておきました。
// opencv_test.cpp
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>

int main(){
cv::Mat img;
img = cv::imread("dog.jpg", cv::IMREAD_COLOR);
cv::namedWindow("image", cv::WINDOW_AUTOSIZE);
cv::imshow("image", img);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
ビルドは以下のコマンドで行い、ライブラリとリンクさせました。
g++ opencv_test.cpp -o opencv_test -I/usr/local/include/opencv4/ -L/usr/local/lib -lopencv_core -lopencv_imgcodecs -lopencv_highgui
ビルド成功後に以下のコマンドで実行させたのですが、
./opencv_test
画面描画関連のエラーが発生したので、以下のパッケージをインストールして問題解決しました。
sudo apt install libgtk2.0-dev
sudo apt-get install libcanberra-gtk-module
仕切り直しで実行すると、Opencv_run_200712.png今度は問題なく動作しました。次回は共有ライブラリの作成についてお話します。

ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

Author: Dr.BobT
興味のおもむくままに生涯考え続けるエンジニアでありたい。

月別アーカイブ

メールフォーム

名前:
メール:
件名:
本文: