14th August 2022 at 5:30pm
OpenCvSharp4.1のころの記事です。
OpenCVはフリー(BSDライセンス)で使える定番の画像処理ライブラリです。
CPythonには「Pillow」や「OpenCV(標準でCPythonラッパーが準備されている)」などの専用の画像処理ライブラリがあります。IronPythonにはありません。
そこで、C#(.NET Framework)用のOpenCVラッパー 「OpenCvSharp」を使って、この画像処理ライブラリをIronPythonから利用します。
IronPythonから利用するための手順
IronPythonからC#のライブラリを利用する の手順で行いますが、一から説明するのは大変なので、こちら のソリューションを使って説明します。
- 新規にプロジェクトを作成します。
(上のサンプルを使う場合は不要です。)
- NugetでOpenCvSharpをインストールします。「OpenCvSharp4.Windows (OpenCV 4.x wrapper. All-in-one package for Windows)」で検索します。


- 「wk_util_opencvsharp」プロジェクトの参照に、 「OpenCvSharp.Blob.dll」、「OpenCvSharp.dll」、「OpenCvSharp.Extensions.dll」、「OpenCvSharp.UserInterface.dll」を追加します。
(上のサンプルでは、net461フォルダのものを使います)
参照を右クリック ⇒ 参照の追加

- 簡単なプログラムを作成します。
- 上のサンプルでは「Form1.cs」に簡易なテストプログラムを書いています。

- 後でIronPythonのライブラリにしたいので、出力パスを
..\x64\[Release or Debug]\opencvsharp\にしています。「wk_opencvsharp」プロジェクトのプロパティを確認してください。
- ビルドして動作を確認します。
- 上のサンプルでは
lena.jpgを読み込んで、画像処理して表示します。
__ini__.pyを作成します。(サンプルのものを参考にしてください)- 面倒くさいのは、パスを通す設定と参照設定です。
- 画像の要素アクセスやポインタ操作に関する関数やクラスを「wk_util_opencvsharp」で作りました。「その2」で説明します。
- Cv2、Matクラス、
OpenCvSharp.Extensions.BitmapConverter.ToBitmap()とOpenCvSharp.Extensions.BitmapConverter.ToMat()などの変換用の関数、定番のBitmapクラスやPixelFormatなどを使いやすいようにしています。
・・・
- 最後にReleaseでビルドし、生成された
opencvsharpフォルダを、IronPythonのLibフォルダにコピーします。 - 上のサンプルにおいては、
example.pyも用意しています。
環境変数パスIRONPYTHON_HOMEの設定を忘れないようにしてください。(例:C:\IronPython27)
ひとこと
OpenCvSharpを使うことでIronPython上でも、CPythonと同じような使い勝手でOpenCVを利用できそうです。
example.pyの内容:
# -*- coding: utf-8 -*-
"""
Example of OpenCvSharp (for 64bit)
"""
from opencvsharp import *
def RunExample():
# Read an image from a file.
fn = path.join(IPY_OPENCVSHARP, "lena.jpg")
src = Cv2.ImRead(fn, OpenCvSharp.ImreadModes.Color)
# Prepare the processed image.
size = OpenCvSharp.Size(252, 256)
dst = OpenCvSharp.Mat(size, OpenCvSharp.MatType.CV_8UC3)
# Run Sobel filter.
Cv2.Sobel(src, dst, src.Depth(), 1, 1)
# Display the original image.
Cv2.ImShow("src", src)
# Display the processed image.
Cv2.ImShow("dst", dst)
# Wait for key input.
Cv2.WaitKey(0)
# Dispose
src.Dispose()
dst.Dispose()
if __name__ == '__main__':
RunExample()NumPyが使えないのは痛いですが、Mat同士の加算・減算・乗算・除算、Matの行(もしくは列)ごとの合計値・平均値・最大値・最小値、ソート程度であればOpenCV内で行うことが可能です。こちらを参考にしてください。
ちなみに、
クラスやメソッドの簡単な説明は、help(クラス名やメソッド名)のコマンドで見ることが可能です。[TAB]による補完機能もあります。

MatはDispose()しないと、メモリーリークの原因になりますので注意してください。