2020/07/24
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以下のコマンドでビルドして「*.so」ファイルを作成しました。
#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;
}
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このフォルダ(この場合はOpenCV_testフォルダ)で以下のコマンドを実行するとビルドされました。
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();
}
}
}
dotnet buildビルドされた実行ファイル(OpenCv_test.dll)は「bin/Debug/netcoreapp3.1」という深い階層の中にありますので、先程作成した「image_proc_sl.so」ファイルを「OpenCv_test.dll」と同じフォルダにコピーしました。合わせて、画像ファイルも同様に同じフォルダにコピーしました。その移動先のフォルダで以下のコマンドで実行させました。
dotnet ./OpenCV_test.dll実行結果は以下の通りです。

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