10. プラグイン
[前項] [次項]


10.1 標準プラグイン

標準のプラグインとしてタイプの異なる3つのプラグインがあります.

10.1.1 2値化プラグイン

画像を閾値で2値化するプラグインです.

プラグインを起動すると,プラグインウィンドウが開きます.
閾値を変更することで,閾値に応じた2値化結果がプレビュー画面に表 示されます.
適用ボタンを押すことで結果がメインウィンドウに反映されます.

10.1.2 ラプラシアンプラグイン

画像にラプラシアンフィルターをかけるプラグインです.
これはダイアログが表示されないタイプのプラグインで,結果はそのま まメインウィンドウに繁栄されます.

10.1.3 ガウシアンプラグイン

画像にガウシアンフィルターをかけるプラグインです.

2値化プラグインと異なる所は,プレビューボタンを押さなければプレ ビュー画面が更新されない所です.
プログラムの実行に時間がかかる場合は,このタイプのプラグインにし た方がいいでしょう.

計算の途中経過をウィンドウの下にあるバーで確認することができます.

10.2 オリジナルプラグインの作成

オリジナルプラグインの作成方法について説明します.

10.2.1 ダイアログを使用しないプラグインの作成

ここでは,ラプラシアンフィルタプラグインを参考にダイアログを使用 し ないプラグインの作り方を説明します.

ソースの色づけは以下のようになっています.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <teo.h>
#include <teoeyesplugin.h>

必要なヘッダーファイルです.
必要に応じて追加して下さい.
 
/* ************************************************************************* *
   プラグイン情報
 * ************************************************************************* */
PluginInfo info = { 
  "ラプラシアンフィルタ",    /* メニュータイトル */
  "菅谷 保之",               /* 作成者 */
  "1.0",                        /* バージョン */
  "ラプラシアンフィルタ\n"         /* プラグインの説明 */
  "をかけるプラグインです",
  PLUGIN_SRC_CURRENT        /* 入力画像のタイプ */
};

プラグインからTeoEyesに知らせるプラグイン情報です.
TeoEyesの設定ウィンドウのプラグインのページで参照できます.

/* ************************************************************************* *
     プラグイン関数本体 
 * ************************************************************************* */
TEOIMAGE*
plugin_laplacian (TEOIMAGE *src) {
  TEOIMAGE      *dst;
  int           n, m, p, col, row;
  int           scope = 1;
  int           val[3], filter[] = {-1, -1, -1, -1, 8, -1, -1, -1, -1};

 /* 出力画像用メモリの確保 */
  dst = TeoAllocSimilarImage (src);

 /* ラプラシアンフィルタをかける */
  for (row = TeoYstart (src) + 1; row <= TeoYend (src) - 1; row++) {
    for (col = TeoXstart (src) + 1; col <= TeoXend (src) - 1; col++) {
      val[0] = val[1] = val[2] = 0;
      for (n = -scope; n <= scope; n++) {
        for (m = -scope; m <= scope; m++) {
          for (p = 0; p < TeoPlane (src); p++) 
            val[p] += TeoGetPixel (src, col+m, row+n, p, TEO_UINT8) * 
              filter[(n+scope)*3+(m+scope)];
        }
      }
      for (p = 0; p < TeoPlane (src); p++) {
        if (val[p] < 0)   val[p] = 0;
        if (val[p] > 255) val[p] = 255;
        TeoPutPixel (dst, col, row, p, TEO_UINT8, val[p]); 
      }
    }
  }

  return dst;
}

プラグインの本体となる関数です.
ここに実際に行いたい画像処理アルゴリズムを書きます.
画像処理を施した結果の画像データ(TEOIMAGE)を関数の返り値
とします.
 
/* ************************************************************************* *
     プラグイン実行用関数
 * ************************************************************************* */
void
plugin_run (void) {
  TEOIMAGE      *src;
  TEOIMAGE      *dst;
  TEO_UINT8     val;
  int           col, row;

  /* 入力画像データの獲得 */
  src = plugin_get_image ();
  if (!src) {
    plugin_put_image (src);
    return;
  }

  /* 出力画像の生成 */ 
  dst = plugin_laplacian (src);

  /* 出力画像データの転送 */
  plugin_put_image (dst);

  /* 出力画像用メモリを開放する */
  TeoFreeImage (dst);
}

この関数では,

の3つの処理を行います.
真中のプラグイン本体関数を自分が作った関数に変更するだけでOKで
す.
 
/* ************************************************************************* *
     プラグインメイン関数
 * ************************************************************************* */
int main (int argc, char **argv) {
  /* 引数に応じてプラグインを実行する */
  switch (atoi (argv[1])) {
  case PLUGIN_RUN:                    /* プラグインの実行 */
    plugin_run ();
    break;
  case PLUGIN_QUERY:              /* プラグイン情報の出力 */
    plugin_query (&info);
    break;
  }
  return 0;
}

最後は,プラグインのメイン関数です.
この部分は変更する必要はありません.

あとはコンパイルすれば完成です.プラグインの拡張子は.tpiに統一し て下さい.コンパイル用のMakefileも載 せておきます.

10.2.2 ダイアログを使用するプラグインの作成

ダイアログを使用するプラグインについて説明します.

ダイアログの生成等のインターフェースはプラグインライブラリで
用意されていますので,何も難しいことはありません.
 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <teo.h>
#include <teoeyesplugin.h>

#define         MIN_VAL      0
#define         MAX_VAL   255
#define         STEP_SIZE   1
#define         PAGE_SIZE  5

先程のプラグインと違う所は,ヘッダーファイルの他に#defineの行
が追加されているところです.

ここでは,パラメータの最小値,最大値,増加量,ページの大きさを
定義します.
 
/* ************************************************************************* *
     プラグイン情報
 * ************************************************************************* */
PluginInfo info = {
  "2値化プラグイン",                   /* メニュータイトル */
  "菅谷 保之",                                  /* 作成者 */
  "1.0",                                             /* バージョン */
  "画像を閾値で2値化",               /* プラグインの説明 */
  PLUGIN_SRC_CURRENT        /* 入力画像のタイプ */
};

この箇所は,前のプラグインと同様です.
 
/* ************************************************************************* *
     プラグイン関数本体 
 * ************************************************************************* */
TEOIMAGE*
plugin_binary (TEOIMAGE  *src, 
                            float                   param) {
  int                         row, col, p;
  TEO_UINT8     val;
  TEOIMAGE     *dst;

 /* 出力画像用メモリの確保 */ 
  dst = TeoAllocImage (TeoWidth   (src),
                       TeoHeight  (src),
                       TeoXoffset (src),
                       TeoYoffset (src),
                       TEO_UNSIGNED, 8, 3);

  for (row = TeoYstart (src); row <= TeoYend (src); row++) {
    for (col = TeoXstart (src); col <= TeoXend (src); col++) {
      if ((TeoGetPixel (src, col, row, 0, TEO_UINT8)) > (TEO_UINT8) param) 
        val = 255;
      else
        val = 0;
      for (p = 0; p < TeoPlane (dst); p++) 
        TeoPutPixel (dst, col, row, p, TEO_UINT8, val); 
    }
#if 0 /* プログレスバーを使用する場合は1に変更して下さい */
    plugin_progressbar_update ((float) (row - TeoYstart (src)) /
                               (TeoYend (src) - TeoYstart (src)));
#endif
  }
#if 0 /* プログレスバーを使用する場合は1に変更して下さい */
  plugin_progressbar_update (0.0);
#endif

  return dst;
}

プラグイン関数本体です.
ここも特にダイアログを使用しない時と比べて変わりませんが,計算
の進行状況を表すプログレスバーを表示したい場合,緑の文字の部分
のコメントアウトを外して下さい(#if 0 -> #if 1).

最後にプラグイン用のMakefileを載せておきます.
 
/* ************************************************************************* *
     プラグイン実行用関数 
 * ************************************************************************* */
void
plugin_run (void) {
  TEOIMAGE      *src;

  /* 入力画像データの獲得 */
  src = plugin_get_image ();
  if (!src) {
    plugin_put_image (src);
    return;
  }

  /* プラグインウィンドウの表示 */
  plugin_dialog_show ("2値化プラグイン",                    /* ダイアログのタイトル */
                                         plugin_binary,                               /* プラグイン関数本体 */
                                         src,                                                   /* 入力画像データ */
                                      "閾値",                                             /* パラメータラベル */
                                         MIN_VAL,                                   /* パラメータの最小値 */
                                         MAX_VAL,                                 /* パラメータの最大値 */
                                         STEP_SIZE,                                 /* パラメータのステップ幅 */
                                         PAGE_SIZE,                                /* ページサイズ */
                                      NON_USE_PROGRESSBAR,   /* プログレスバーの使用 */
                                      ACTION_INTERACTIVE);     /* プレビュー画面の更新 方法 */
  gtk_main ();
}

ここでは,入力画像データの読み込みと,ダイアログの表示を行い
ます.
ダイアログが表示された後の処理はライブラリが処理してくれます.
ダイアログを使用しないプラグインの場合,ここで出力画像データ
の転送を行いましたが,これもライブラリが処理してれます.

/* ************************************************************************* *
     プラグインメイン関数 
 * ************************************************************************* */
int main (int argc, char **argv) {
  /* GTK関係の初期化 */
  plugin_gtk_init (argc, argv);

  /* 引数に応じてプラグインを実行する */
  switch (atoi (argv[1])) {
  case PLUGIN_RUN:              /* プラグインの実行 */
    plugin_run ();
    break;
  case PLUGIN_QUERY:        /* プラグイン情報の出力 */
    plugin_query (&info);
    break;
  }
  return 0;
}

メイン関数です.
先程と同様,ここは何も変更する必要はありません.
 
CC                          = gcc -O3

PREFIX                 = /usr/local/lab
TEODIR                = /usr/local/lab
GTKDIR                = /usr
IMLIBDIR             = /usr

CFLAGS                = -I$(TEODIR)/include \
                                   `$(GTKDIR)/bin/glib-config --cflags` \
                                   `$(GTKDIR)/bin/gtk-config --cflags` \
                                   `$(IMLIBDIR)/bin/imlib-config --cflags-gdk`

LDFLAGS             = -L$(TEODIR)/lib \
                                  `$(GTKDIR)/bin/glib-config --libs` \
                                  `$(GTKDIR)/bin/gtk-config --libs` \
                                  `$(IMLIBDIR)/bin/imlib-config --libs-gdk`

LIBS                         = -Wall \
                                     `$(GTKDIR)/bin/glib-config --libs` \
                                     `$(GTKDIR)/bin/gtk-config --libs` \
                                     `$(IMLIBDIR)/bin/imlib-config --libs-gdk` \
                                     -lteoeyesplugin -lteo2gdkimlib -lteo -lm

DEST                       = $(PREFIX)/share/teoeyes/plugins

OBJS                        = binary.o

PROGRAM            = binary.tpi

all:                              $(PROGRAM)

$(PROGRAM):     $(OBJS) $(HDRS)
                                   $(CC) $(OBJS) $(LDFLAGS) $(LIBS) -o $(PROGRAM)

clean:;                        rm -f *.o *~ core $(PROGRAM)

install:                       $(PROGRAM)
                                    strip $(PROGRAM)
                                    mkdir -p $(DEST)
                                    install -s $(PROGRAM) $(DEST)/


[前項] [次項]