MENOU-RN プラグインデバイス機能

MENOU-RNのプラグインデバイス機能について説明します。

機能概要
プラグインデバイス機能を利用することで、MENOU-RNに対応していないカメラからでも撮像画像を取得することができます。MENOU-RNで撮像画像を取得するためには、カメラから撮像を行うアプリケーション(以下、「撮像アプリ」と呼びます)を呼び出すことで実現します。
※撮像アプリは、用途に応じて作成する必要があります。

手順
以下の手順に従い、MENOU-RNからプラグインデバイスを扱うことができます。

  • 撮像アプリの作成
  • MENOU-RNにプラグインデバイスを設定

撮像アプリ作成
撮像アプリを作成する手順を示します。

  1. パッケージソースの追加
    以下のパッケージソースリポジトリに公開されている Nuget パッケージソースを追加します。
  1. Nugetパッケージのインストール
    Visual Studio Nuget パッケージマネージャー上で、パッケージソースを 先ほど追加したパッケージソースに設定し、「Menou.VI.SDK.Imaging.Plugin」パッケージを検索、インストールしてください。

  2. 撮像アプリの作成
    Visual Studio(2022)を利用してC#コンソールアプリケーションを作成します。

  3. 適当な名前でプロジェクトを新規作成します。
    C#のコンソールアプリプロジェクトを選択します。
    image

  4. プロジェクトのプロパティ設定にて、Windows アプリケーションを指定します。
    image

  5. 撮像するプログラムを実装します。
    以下にC#のサンプルコードを示します。
    この例では、OpenCVSharpを使ってカメラの撮像を行い、撮像要求が来たら画像データを渡す処理を行います。
    ※ 撮像要求時の処理は、撮像を行い、撮像画像データをセットする処理です。必要に応じて、適宜変更してください。

// Program.cs 

// Copyright (c) 2023 MENOU. All rights reserved.

using System.Runtime.InteropServices;
using OpenCvSharp;

namespace Menou.VI.Core.Imaging.Plugin.Test.Host;

/// <summary>
/// プラグインデバイスのテストのホスト部(デバイス側)
/// </summary>
internal class Program
{
    #region field

    /// <summary>
    /// カメラID
    /// </summary>
    private const int CameraId = 0;

    /// <summary>
    /// 撮像デバイス。
    /// </summary>
    private static VideoCapture? CaptureDevice = null;

    /// <summary>
    /// 撮像失敗時のエラーコード。
    /// 0は正常を意味するため、0以外を指定する。
    /// </summary>
    private static readonly int CaptureErrorCode = -1;

    #endregion

    public static async Task Main(string[] args)
    {
        var name = args[0]; // 画像転送用のメモリマップ名
        var sizeName = args[1]; // 画像サイズ転送用のメモリマップ名
        var appDataDirectory = args[2]; // アプリケーションデータディレクトリ(ログ保存用)

        using var pluginImageDeviceCommunicator = new PluginImageDeviceCommunicator(name, sizeName, appDataDirectory);

        // 撮像デバイス初期化
        CaptureDevice = new VideoCapture();

        // カメラオープン
        // カメラIDが重複しないようにCameraIdを設定すること。
        if (CaptureDevice?.Open(CameraId) != true)
        {
            return;
        }

        // 撮像要求時のイベント登録。
        pluginImageDeviceCommunicator.CaptureRequested += OnCaptureRequested;

        // 終了要求時のイベント登録
        pluginImageDeviceCommunicator.TerminateRequested += OnTerminateRequested;

        // 開始
        await pluginImageDeviceCommunicator.StartAsync();
    }

    /// <summary>
    /// 撮像要求時の処理
    /// このメソッドはサンプルコードですので、適宜変更してください。
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="eventArgs"></param>
    private static void OnCaptureRequested(object? sender, CaptureEventArgs eventArgs)
    {
        using var frame = new Mat();

        // 撮像
        CaptureDevice?.Read(frame);

        if (!frame.Empty()) // 撮像成功時
        {
            eventArgs.ImageWidth = frame.Width;
            eventArgs.ImageHeight = frame.Height;
            eventArgs.ImageChannels = frame.Channels();

            var data = new byte[eventArgs.ImageWidth * eventArgs.ImageHeight * eventArgs.ImageChannels];
            Marshal.Copy(frame.Data, data, 0, data.Length);
            eventArgs.ImageBytes = data;
        }
        else // 撮像失敗時
        {
            // エラーコードを指定する
            eventArgs.ErrorCode = CaptureErrorCode;
        }
    }

    /// <summary>
    /// 終了要求時の処理。
    /// このメソッドはサンプルコードですので、適宜変更してください。
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="eventArgs"></param>
    private static void OnTerminateRequested(object? sender, EventArgs eventArgs)
    {
        // 撮像デバイスの解放
        DisposeCaptureDevice();
    }

    /// <summary>
    /// 撮像デバイスの解放処理。
    /// </summary>
    private static void DisposeCaptureDevice()
    {
        CaptureDevice?.Dispose();
        CaptureDevice = null;
    }
}
  1. プロジェクトに対してビルドを行い、実行形式ファイル(.exe)を出力します。

MENOU-RNにプラグインデバイスを設定

  1. MENOU-RNの撮像設定ボタンをクリックします。
    image

  2. 画像取り込み設定からプラグインを選択します。

  3. 新規追加ボタンから任意の名前でデバイスを追加します。

  4. 設定画面からのアプリケーションパスに作成した撮像アプリを指定します。
    image

  5. 設定終了をクリックし、設定を終了します。

  6. 撮像設定でプラグインを選択します。
    image

「いいね!」 4