手習ひデジタル信号処理(170) Scilab、{IPCV}、ユーティリティツールその3

Joseph Halfmoon

今回もScilabのIPCV「ツールボックス」に含まれるユーティリティ関数の練習を続けます。今回の関数はループでくるくる回っている最中にキーを叩いてループを脱出させるのに都合の良い関数です。画像処理のIPCVは時間かかるものが多そうだけれども、別にIPCVでなくても便利そうなツールです。若干クセ強な挙動です。

※「手習ひデジタル信号処理」投稿順 Indexはこちら

※Windows11上の    Scilab2024.0.0およびScilab上のScilab IPCVツールボックスを使用させていただいております。

今回練習してみるユーティリティツールども

今回は以下の2つですが、使用は「組」にしてです。さらに言うと breakloop という名の大域変数 も使用必須です。

    • imbreakset()
    • imbreakunset()
    • breakloop、大域変数

上記の3つを使うと「ESCキー」を押すことでループから脱出することが可能となります。imbreakset()という関数を事前に実行しておくことで、「ESCキー」によってbreakloop大域変数に「真」を代入できるようになるようです。これをループの中で判定して、break文を実行すれば脱出ができると。そしてimbreakunset()関数でこの機能をディセーブルとして後片付け。

今回練習のテスト関数

imbreakset()関数のHelpページをみれば実施例があるのですが、10回ループ(1ループは約0.5秒)と短時間なので、手元が怪しい年寄が慌てている間に「ESCキー」が認識される前にループ終了してしまいます。そこでループ回数を引数にとり、何回目で脱出したかを返す関数に例を改造したのが以下です。

// test imbreakset()
// rcnt: repeat count
// lst: counts at break
function lst=testBreak(rcnt)
  global breakloop;
  breakloop = %f;
  plot(0,0);
  imbreakset();
  lst=0;
  for cnt = 1:rcnt
    sleep(500);
    disp(cnt);
    if breakloop == %t
      disp('User Break');
      lst = cnt;
      break
    end
  end
  imbreakunset();
endfunction

ここで、以下のようにすれば、慌てることなくESCキーを押すことができます。

testBreak(100)
キー認識のクセ?

慌てることなくキーを押せるようになったお陰で、以下のようにループの途中で脱出することができてます。UserBreak

しかし、このESCキーの認識がちょっとクセ強です。基本、プロットのウインドウにフォーカスがあたっていないとループ脱出はできないのですが、plot

手もとの環境では以下のような挙動を示しました。

    • グラフエリア内(上記の緑の領域)をクリックしてフォーカスを得る分にはESCキーでブレークできる。
    • 「タイトルバー」~「グラフィック・ウインドウ番号0」の領域(上記の赤の領域)をクリックしてウインドウにフォーカスすると ESCキーでブレークできない

知らないと慌てるぞ、これは。グラフィックハンドルとかの黒魔術?

手習ひデジタル信号処理(169) Scilab、{IPCV}、ユーティリティツールその2 へ戻る

手習ひデジタル信号処理(171) Scilab、{IPCV}、超解像(多画像超解像)へ進む