Scilab SIVP - eiichiromomma/CVMLAB GitHub Wiki

(Scilab) SIVP

SIPよりパワフルな画像処理ToolBox

OpenCVを内部で使っているらしいので期待が持てる。 動画像処理もできる。

導入

Windowsの場合はインストーラがあるので実行しておしまい。 非常に便利。

有効化

Scilabを起動したらtoolboxesメニューからSIVPを選ぶ

動画像処理

カメラのオープン

n=camopen()

でnにインデックスを取得できる。

※camopen()の実行は1回で良い。カメラが1台にもかかわらず複数回実行すると、その分だけインデックスが更新されるが実態は最初に取得したインデックスとしか結び付かない。 間違えて取得してしまった場合はaviclose(インデックス)で開放できる。

以下のソースでは毎回解放することにした。

フレームの取得

特別な操作は殆ど必要無く、ループ中にavireadframeで画像を取得→処理といった流れになる。 camopenの所から書くと次のようになる。

    n=camopen();
    for f=1:500
      im=avireadframe(n);
      imshow(im);
    end
    aviclose(n);

フレームごとの処理

    n=camopen();
    for f=1:500
      im=avireadframe(n);
      im=rgb2gray(im);
      E=edge(im,'sobel');
      imshow(E);
    end
    aviclose(n);

stack size exceeded! (Use stacksize function to increase it)というエラー

stacksize関数でスタックの容量を増やす。

    stacksize(20000000);

フレームの保存

    n=camopen();
    im=avireadframe(n);
    im(:,:,:,2)=avireadframe(n);

    for f=1:50
      im(:,:,:,f)=avireadframe(n);
    end
    for f=1:50
      imshow(im(:,:,:,f));
      sleep(33);
    end
    aviclose(n);

とでもして

    nf=avifile('test.avi',[240;320],20);
    for f=1:50
      addframe(nf,im(:,:,:,f));
    end
    aviclose(nf);

でaviに保存できる筈なのだが、うちの環境では保存できない。

一応ちゃんとした動画像処理

realtime()という関数で実時間制御が出来るらしい。 但し、カメラからのキャプチャ等のスピードが出ないので1/10も難しい。

realtimeinit(t)で時間の単位[s]を決める。下の例では0.5sごとにキャプチャしてエッジ抽出したものを表示させる。 一応下のソースできっかり3分動いたので単位中に処理が終わればそこそこ正確?うちの環境ではこの速さが限界。

    n=camopen();
    realtimeinit(1/5);
    realtime(0);
    for f=1:900
      realtime(f);
      im=avireadframe(n);
      im=rgb2gray(im);
      E=edge(im,'sobel');
      imshow(E);
    end
    aviclose(n);

関数(使ったのだけ)

filter2

MATLABとの違いは第3引数が無い事。 'same'の扱いになるらしい。 ラプラシアンの単純な例

    chdir('C:\Program Files\scilab-4.1.2\contrib\SIVP-0.4.3\images');
    im=imread('lena.png)');
    imshow(im)
    f=[0,-1,0;-1,4,-1;0,-1,0];
    im2=filter2(f,im(:,:,2));
    imshow(im2)

fspecial

MATLABと使い方は同じ。 面倒なのでこっち 参照