IronPythonからOpenCVSharp その1(旧)

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()しないと、メモリーリークの原因になりますので注意してください。


HomeへIronPythonの記事Topへ