OpenCVの
    拡張ユーティリティ関数群
    拡張  ティリティ関数群
        名古屋工業大学 福嶋慶繁
        Twitter:  @fukushima1981
コードダウンロード先:
      http://nma.web.nitech.ac.jp/fukushima/opencv/extra_opencv.html
実装関数,クラスのヘッダ
           実装関数 クラスのヘッダ
• A l i h
  Analysis.hpp
   – 下記全てのインクルードヘッダ
• Timer.h
   – 時間計測用クラス
• draw.h
   – 描
     描画用の関数群
          数群
• imageQuality.h
   – 画質評価用関数群
• plot.h
   – Gnuplotライクなプロッタークラス
• util.h
   – ユーティリティ関数群
逆引き関数,クラスリスト
           逆引き関数 クラスリスト
画像品質
• 画像品質MSEを計算する
    – getMSEY, getMSERGB
•   画像品質PSNRを計算する
    – getPSNRY, getPSNRRGB
•   画像品質SSIMを計算する
    – getSSIMY, getSSIMRGB
•   画像品質DSSIMを計算する
    画像品質     を計算する
    – getDSSIMY, getDSSIMRGB
•   画像のエントロピーを計算する
    – double getEntropy
      double getEntropy
•   備考:上記関数の引数は第3引数にマスクを取れる
•   備考:カラー画像の戻り値はcv::Scalarで0:B, 1:G, 2:R, 3:(B+G+R)/3の値が返る
•   バウンディングボックス付きPSNR計算(画像の縁を無視する用,上記バウンディ
     ウンディングボックス付きPSNR計算(画像の縁を無視する用,上記 ウンディ
    ングボックスマスクを作ってPSNRを計算)MSE,SSIM,DSSIMも同様に実装
    – getPSNRYBB, getPSNRRGBBB
逆引き関数,クラスリスト
            逆引き関数 クラスリスト
描画
• 三角形,逆三角形を描画する
    – triangle, triangleinv
•   十
    十×*を描画する
       を描画する
    – drawCross( XCV_DRAWCROSS_PLUS, XCV_DRAWCROSS_TIMES,
      XCV_DRAWCROSS_ASTERRISK)
•   画面全体に十字線(グリッド)を表示する
    – drawGrid
•   2枚の画像を連結する
    – connect( XCV_CONNECT_HORIZON,XCV_CONNECT_VERTICAL)
•   複数枚の画像を連結する
    – connectMulti
•   画像のヒストグラム,累積ヒストグラムを描画する
    – createHistogramGray, createHistogramRGB,
    – createAccHistogramGray, createAccHistogramRGB
          t A Hi t      G         t A Hi t      RGB
•   ボックス型のマスクを生成,セット,追加する
    – createBoxMask, setBoxMask, addBoxMask
逆引き関数,クラスリスト
             逆引き関数 クラスリスト
計算時間計測
• スコープ内の処理が終わるまでの時間を計測し,”hoge” 時間 sec と表示する
    { 
         CalcTime t(“hoge”, TIME_SEC);
                    ( g ,           );
         function();
    }
•   スコープ途中経過の計算結果を表示・取得する
    { 
         CalcTime t(“hoge”, TIME_SEC);
         function1();
         double t1 = t.getTime();
         t.show();
         function2();
         double t2 = t.getTime();
         t.show();
                ()
    }
逆引き関数,クラスリスト
         逆引き関数 クラスリスト
アルファブレンドによる画像の確認用関数
アルフ ブレンドによる画像の確認用関数
  二画像a,bをインタラクティブにαブレンド.
  a,bのチャネル数が違っても可.
  void guiAlphaBlend(const cv::Mat& image1, const cv::Mat& image2,cv::Mat& mask)
  – Ampは合成画像を線形倍する関数 dest = amp*src
  – alphaの式: (1‐α) * image1  + α*image2 = dest
  – Maskが未実装
逆引き関数,クラスリスト
            逆引き関数 クラスリスト
コンソール出力の代わりに画像にprintfする
  ンソ ル出力の代わりに画像に                     fする
ConsoleImage console(Size(640,480));
for(int i=0;i<10;i++)
{
    double val = i*i/100.0;
    console( %03d : %f  i val)
    console("%03d : %f “,i, val)
}
imshow(“console”, console.show);

色付きでコンソール出力
始めの引数に色を指定するだけ!
                                                          出力例
Console(CV_RGB(0,255/(i+1),25.5*i),"%03d : %f",i, val);
逆引き関数,クラスリスト
          逆引き関数 クラスリスト
Sinカーブのグラフをプロットする.
Plot p;
Plot p;
for(int i=‐100;i<100;i++)
{ 
     p add(i/50 0 sin(CV PI*i/50 0) 0);//最後の引数が 何番目のプロットかを表す
     p.add(i/50.0,sin(CV_PI i/50.0),0);//最後の引数が,何番目のプロットかを表す
     p.add(i/50.0,sin(CV_PI*(i+10)/50.0),1);
     p.add(i/50.0,sin(2.0*CV_PI*i/50.0),2);
}
p.plot(“sin”);//引数の名前でグラフを表示して無限ループで待つ.
//次は1本のsinのみ描く
p.clear();//入力した点を全てクリア
   l () //入力した点を全てクリア
p.setKeyName(“sin”,0);//データ0のラベルをsinと名付ける
p.setPlot(0,CV_RGB(255,0,0),XCV_PLOT_ASTERRISK);//赤のアスタリスク*で描画する
for(int i=‐100;i<100;i++)
f (i i 100 i 100 i )
{ 
     p.add(i/50.0,sin(CV_PI*i/50.0),0);
}
逆引き関数,クラスリスト
逆引き関数 クラスリスト
    カーソルの位置とその位置を表すグリッド




                      ラベル




     出力例
Plot画面のキーボードショートカット
 l ()メソ ドで呼び出したグラフ画面で有効なキ ボ ドシ      トカ ト
plot()メソッドで呼び出したグラフ画面で有効なキーボードショートカット
• q:    終了
• ?:    ヘルプ
• m: マウスオーバーの値を表示/非常時切り替え
• k:    ラベルを表示する位置の移動
• x:    xのスタートポイントを0に
• y:    yのスタートポイントを0に
• z:    XYのスタートポイントを0に
• r:    XY座標の設定リセット
• s:    画面を保存
• p:    デ タをgnuplot用に出力.ほぼ同じグラフを書くためのGnuplot用のコマン
        データをgnuplot用に出力.ほぼ同じグラフを書くためのGnuplot用のコマン
        ドも出力する.(gnuplotクラスと連携すると楽)
逆引き関数,クラスリスト
           逆引き関数 クラスリスト
       に  ンドを送り ける
Gnuplotにコマンドを送りつける

Gnuplot gp(“./pgnuplot.exe”);
        gp( ./pgnuplot.exe );
gp.cmd(“plot x”);


Plot.cpp内に眠っています.
imshowAnalysisCompare
•    枚の画像を詳しく比較する
    2枚の画像を詳しく比較する
    imshowと同じ用に使えることを目標に作成.imshowの代わりに
    imshowAnalysisCompare(”ウィンドウの名前”,入力1,入力2)とすれば良いだけ
    類似関数に下記二つ(比較機能を除外)
    類似関数        記       (比較機能を除外)
•   void imshowAnalysis(std::string winname, cv::Mat& src);
•   void imshowAnalysis(std::string winname, std::vector<cv::Mat>& s);
                   y (            g                                 )




                     表示例(imshowAnalysisCompare)
表示切り替えスイッチとalpha
        0 ブレンド は ブレンド値
      sw0:αブレンド:αはαブレンド値
      sw1: src1‐src2:αは関係ない
      sw2: threshold(|src1‐src2|): αは閾値

   分析のレベル:0→3の順に詳細に
   0:画像のみ
   1:画質の評価を追加
   2:XY信号を追加
   2 XY信号を追加
   3:ヒストグラムを追加


      色(0:B, 1:G, 2:R, 3:Y)

クリッピング領域
赤の十字を中心とする緑の領域内の信号が表示される
Sw = 0の時は,src1とsrc2の信号が重ねて表示
Sw = 1,2の時はsrc1‐src2の差分信号が表示
有効マスク割合,NBP使わない画素数
                     Yの情報




                     RGBの情報




BB:バウンディングボックスでマスクを作成
Thresh:差分の閾値でマスクを作成
Level0 SSIMなし, Level1 SSIM有り, Level2 全色計算
Show:マスクを可視化して表示するか否か
Shift y:y軸の上下
Shift y:y軸の上下
Clipy:y軸の拡大縮小
関数リファレンス
• 記入予定.定
• 今はtimerだけ記述
  今はtimerだけ記述.
Timer.h: class CalcTime
                     Timer h: class CalcTime
コンストラクタ
•  CalcTime(char*message="time ", int mode=TIME_MSEC ,bool isShow=true)
      –   message:        表示するメッセージ,
                          表示するメ セ ジ
      –   mode :          計測時間の単位(TIME_NSEC, TIME_MSEC, TIME_SEC, TIME_MIN, TIME_HOUR)
      –   isShow:         デストラクタ時に計算時間を表示する否か
メソッド
•  void start()
   void start()                       計測開始
•  void setMode(int mode)             計測時間の単位を設定
•  void setMessage(char* src)         出力メッセージを設定
•  void restart();                    計測時間を初期化してもう一度スタート
•  double getTime()
   do ble getTime()                   現在の経過時間を取得
•  void show();                       現在の経過時間を取得してコンソール出力
•  void show(char* message);          現在の経過時間を取得し,メッセージの設定してコンソール出力

備考
•  コンストラクタでstart(),デストラクタでshow()メソッドが呼び出されるので,宣言したスコープ内でかかった計算時間を簡単
   に計算可能
仕様例:
下記のように書くと, 関数testに要する計算時間がms単位で出力される.
下記のように書くと 関数t tに要する計算時間が 単位で出力される
    void test()
    {
    CalcTime t(“function”, TIME_MSEC);
    Hogehoge…
    H h
    }
mainに実装されたデモの解説
•   imageQualityTest();
     – 様 な劣化画像を
       様々な劣化画像をPSNR,SSIM,MSEで画質評価する,画質評価関数のテストです.
                             画質評価する 画質評価関数   ト す
•   plotTest();
     – Gnuplotライクなプロッタのテストです.Sinカーブ,直線のプロット例が示されています.
•   consoleTest();
     – 高速な関数だとあっという間に流れてしまうコンソール出力を,代わりにimshowで表示
       する とで見やすくするクラ のテ トです
       することで見やすくするクラスのテストです.median,bilateral filterによるデノイジングの
                                  ,                 よるデ イジングの
       デモを行っています.
•   analysisTest_color_gray();
     – 簡単な分析機能付きimshow関数のテストです 引数に取った画像のヒストグラム 平
       簡単な分析機能付きimshow関数のテストです.引数に取った画像のヒストグラム,平
       均分散,指定された領域の輝度値信号を各チャネルごとに出力します.
•   analysisTest_multipleimage();
     – 上記関数の複数枚入力の拡張です 複数枚の画像入力可能となり また各信号が重
       上記関数の複数枚入力の拡張です.複数枚の画像入力可能となり,また各信号が重
       ねあわされて出力されます.
•   analysisTest_compare();
     – 上記関数のより詳細に比較するための関数のテ ト す ある画像と比較画像を入力
       上記関数のより詳細に比較するための関数のテストです.ある画像と比較画像を入力
       すると,その画像品質の比較,ヒストグラムの比較,信号の比較,差分値の可視化,誤
       差の閾値処理の可視化などが行えます.
Plot表示例
コンソール画像出力表示例
分析比較関数の表示例
開発環境
• WindowsXP
• Visual Studio 2010
  Visual Studio 2010
• OpenCV svn ver 2.32くらい

OpenCVの拡張ユーティリティ関数群

  • 1.
    OpenCVの 拡張ユーティリティ関数群 拡張 ティリティ関数群 名古屋工業大学 福嶋慶繁 Twitter:  @fukushima1981 コードダウンロード先: http://nma.web.nitech.ac.jp/fukushima/opencv/extra_opencv.html
  • 2.
    実装関数,クラスのヘッダ 実装関数 クラスのヘッダ • A l i h Analysis.hpp – 下記全てのインクルードヘッダ • Timer.h – 時間計測用クラス • draw.h – 描 描画用の関数群 数群 • imageQuality.h – 画質評価用関数群 • plot.h – Gnuplotライクなプロッタークラス • util.h – ユーティリティ関数群
  • 3.
    逆引き関数,クラスリスト 逆引き関数 クラスリスト 画像品質 • 画像品質MSEを計算する – getMSEY, getMSERGB • 画像品質PSNRを計算する – getPSNRY, getPSNRRGB • 画像品質SSIMを計算する – getSSIMY, getSSIMRGB • 画像品質DSSIMを計算する 画像品質 を計算する – getDSSIMY, getDSSIMRGB • 画像のエントロピーを計算する – double getEntropy double getEntropy • 備考:上記関数の引数は第3引数にマスクを取れる • 備考:カラー画像の戻り値はcv::Scalarで0:B, 1:G, 2:R, 3:(B+G+R)/3の値が返る • バウンディングボックス付きPSNR計算(画像の縁を無視する用,上記バウンディ ウンディングボックス付きPSNR計算(画像の縁を無視する用,上記 ウンディ ングボックスマスクを作ってPSNRを計算)MSE,SSIM,DSSIMも同様に実装 – getPSNRYBB, getPSNRRGBBB
  • 4.
    逆引き関数,クラスリスト 逆引き関数 クラスリスト 描画 • 三角形,逆三角形を描画する – triangle, triangleinv • 十 十×*を描画する を描画する – drawCross( XCV_DRAWCROSS_PLUS, XCV_DRAWCROSS_TIMES, XCV_DRAWCROSS_ASTERRISK) • 画面全体に十字線(グリッド)を表示する – drawGrid • 2枚の画像を連結する – connect( XCV_CONNECT_HORIZON,XCV_CONNECT_VERTICAL) • 複数枚の画像を連結する – connectMulti • 画像のヒストグラム,累積ヒストグラムを描画する – createHistogramGray, createHistogramRGB, – createAccHistogramGray, createAccHistogramRGB t A Hi t G t A Hi t RGB • ボックス型のマスクを生成,セット,追加する – createBoxMask, setBoxMask, addBoxMask
  • 5.
    逆引き関数,クラスリスト 逆引き関数 クラスリスト 計算時間計測 • スコープ内の処理が終わるまでの時間を計測し,”hoge” 時間 sec と表示する {  CalcTime t(“hoge”, TIME_SEC); ( g , ); function(); } • スコープ途中経過の計算結果を表示・取得する {  CalcTime t(“hoge”, TIME_SEC); function1(); double t1 = t.getTime(); t.show(); function2(); double t2 = t.getTime(); t.show(); () }
  • 6.
    逆引き関数,クラスリスト 逆引き関数 クラスリスト アルファブレンドによる画像の確認用関数 アルフ ブレンドによる画像の確認用関数 二画像a,bをインタラクティブにαブレンド. a,bのチャネル数が違っても可. void guiAlphaBlend(const cv::Mat& image1, const cv::Mat& image2,cv::Mat& mask) – Ampは合成画像を線形倍する関数 dest = amp*src – alphaの式: (1‐α) * image1  + α*image2 = dest – Maskが未実装
  • 7.
    逆引き関数,クラスリスト 逆引き関数 クラスリスト コンソール出力の代わりに画像にprintfする ンソ ル出力の代わりに画像に fする ConsoleImage console(Size(640,480)); for(int i=0;i<10;i++) { double val = i*i/100.0; console( %03d : %f  i val) console("%03d : %f “,i, val) } imshow(“console”, console.show); 色付きでコンソール出力 始めの引数に色を指定するだけ! 出力例 Console(CV_RGB(0,255/(i+1),25.5*i),"%03d : %f",i, val);
  • 8.
    逆引き関数,クラスリスト 逆引き関数 クラスリスト Sinカーブのグラフをプロットする. Plot p; Plot p; for(int i=‐100;i<100;i++) {  p add(i/50 0 sin(CV PI*i/50 0) 0);//最後の引数が 何番目のプロットかを表す p.add(i/50.0,sin(CV_PI i/50.0),0);//最後の引数が,何番目のプロットかを表す p.add(i/50.0,sin(CV_PI*(i+10)/50.0),1); p.add(i/50.0,sin(2.0*CV_PI*i/50.0),2); } p.plot(“sin”);//引数の名前でグラフを表示して無限ループで待つ. //次は1本のsinのみ描く p.clear();//入力した点を全てクリア l () //入力した点を全てクリア p.setKeyName(“sin”,0);//データ0のラベルをsinと名付ける p.setPlot(0,CV_RGB(255,0,0),XCV_PLOT_ASTERRISK);//赤のアスタリスク*で描画する for(int i=‐100;i<100;i++) f (i i 100 i 100 i ) {  p.add(i/50.0,sin(CV_PI*i/50.0),0); }
  • 9.
    逆引き関数,クラスリスト 逆引き関数 クラスリスト カーソルの位置とその位置を表すグリッド ラベル 出力例
  • 10.
    Plot画面のキーボードショートカット l ()メソドで呼び出したグラフ画面で有効なキ ボ ドシ トカ ト plot()メソッドで呼び出したグラフ画面で有効なキーボードショートカット • q: 終了 • ?: ヘルプ • m: マウスオーバーの値を表示/非常時切り替え • k: ラベルを表示する位置の移動 • x: xのスタートポイントを0に • y: yのスタートポイントを0に • z: XYのスタートポイントを0に • r: XY座標の設定リセット • s: 画面を保存 • p: デ タをgnuplot用に出力.ほぼ同じグラフを書くためのGnuplot用のコマン データをgnuplot用に出力.ほぼ同じグラフを書くためのGnuplot用のコマン ドも出力する.(gnuplotクラスと連携すると楽)
  • 11.
    逆引き関数,クラスリスト 逆引き関数 クラスリスト に ンドを送り ける Gnuplotにコマンドを送りつける Gnuplot gp(“./pgnuplot.exe”); gp( ./pgnuplot.exe ); gp.cmd(“plot x”); Plot.cpp内に眠っています.
  • 12.
    imshowAnalysisCompare • 枚の画像を詳しく比較する 2枚の画像を詳しく比較する imshowと同じ用に使えることを目標に作成.imshowの代わりに imshowAnalysisCompare(”ウィンドウの名前”,入力1,入力2)とすれば良いだけ 類似関数に下記二つ(比較機能を除外) 類似関数 記 (比較機能を除外) • void imshowAnalysis(std::string winname, cv::Mat& src); • void imshowAnalysis(std::string winname, std::vector<cv::Mat>& s); y ( g ) 表示例(imshowAnalysisCompare)
  • 13.
    表示切り替えスイッチとalpha 0 ブレンド は ブレンド値 sw0:αブレンド:αはαブレンド値 sw1: src1‐src2:αは関係ない sw2: threshold(|src1‐src2|): αは閾値 分析のレベル:0→3の順に詳細に 0:画像のみ 1:画質の評価を追加 2:XY信号を追加 2 XY信号を追加 3:ヒストグラムを追加 色(0:B, 1:G, 2:R, 3:Y) クリッピング領域 赤の十字を中心とする緑の領域内の信号が表示される Sw = 0の時は,src1とsrc2の信号が重ねて表示 Sw = 1,2の時はsrc1‐src2の差分信号が表示
  • 14.
    有効マスク割合,NBP使わない画素数 Yの情報 RGBの情報 BB:バウンディングボックスでマスクを作成 Thresh:差分の閾値でマスクを作成 Level0 SSIMなし, Level1 SSIM有り, Level2 全色計算 Show:マスクを可視化して表示するか否か
  • 15.
  • 16.
  • 17.
    Timer.h: class CalcTime Timer h: class CalcTime コンストラクタ • CalcTime(char*message="time ", int mode=TIME_MSEC ,bool isShow=true) – message: 表示するメッセージ, 表示するメ セ ジ – mode : 計測時間の単位(TIME_NSEC, TIME_MSEC, TIME_SEC, TIME_MIN, TIME_HOUR) – isShow: デストラクタ時に計算時間を表示する否か メソッド • void start() void start() 計測開始 • void setMode(int mode) 計測時間の単位を設定 • void setMessage(char* src) 出力メッセージを設定 • void restart(); 計測時間を初期化してもう一度スタート • double getTime() do ble getTime() 現在の経過時間を取得 • void show(); 現在の経過時間を取得してコンソール出力 • void show(char* message); 現在の経過時間を取得し,メッセージの設定してコンソール出力 備考 • コンストラクタでstart(),デストラクタでshow()メソッドが呼び出されるので,宣言したスコープ内でかかった計算時間を簡単 に計算可能 仕様例: 下記のように書くと, 関数testに要する計算時間がms単位で出力される. 下記のように書くと 関数t tに要する計算時間が 単位で出力される void test() { CalcTime t(“function”, TIME_MSEC); Hogehoge… H h }
  • 18.
    mainに実装されたデモの解説 • imageQualityTest(); – 様 な劣化画像を 様々な劣化画像をPSNR,SSIM,MSEで画質評価する,画質評価関数のテストです. 画質評価する 画質評価関数 ト す • plotTest(); – Gnuplotライクなプロッタのテストです.Sinカーブ,直線のプロット例が示されています. • consoleTest(); – 高速な関数だとあっという間に流れてしまうコンソール出力を,代わりにimshowで表示 する とで見やすくするクラ のテ トです することで見やすくするクラスのテストです.median,bilateral filterによるデノイジングの , よるデ イジングの デモを行っています. • analysisTest_color_gray(); – 簡単な分析機能付きimshow関数のテストです 引数に取った画像のヒストグラム 平 簡単な分析機能付きimshow関数のテストです.引数に取った画像のヒストグラム,平 均分散,指定された領域の輝度値信号を各チャネルごとに出力します. • analysisTest_multipleimage(); – 上記関数の複数枚入力の拡張です 複数枚の画像入力可能となり また各信号が重 上記関数の複数枚入力の拡張です.複数枚の画像入力可能となり,また各信号が重 ねあわされて出力されます. • analysisTest_compare(); – 上記関数のより詳細に比較するための関数のテ ト す ある画像と比較画像を入力 上記関数のより詳細に比較するための関数のテストです.ある画像と比較画像を入力 すると,その画像品質の比較,ヒストグラムの比較,信号の比較,差分値の可視化,誤 差の閾値処理の可視化などが行えます.
  • 19.
  • 20.
  • 21.
  • 22.
    開発環境 • WindowsXP • VisualStudio 2010 Visual Studio 2010 • OpenCV svn ver 2.32くらい