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

6,083 views

Published on

画像処理ライブラリであるOpenCVに足りない,いくつかの関数を追加し,そのコードの説明を行っています.
ソースコードはこちら
http://nma.web.nitech.ac.jp/fukushima/opencv/cvutil.zip

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,083
On SlideShare
0
From Embeds
0
Number of Embeds
858
Actions
Shares
0
Downloads
19
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

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

  1. 1. OpenCVの 拡張ユーティリティ関数群 拡張 ティリティ関数群 名古屋工業大学 福嶋慶繁 Twitter:  @fukushima1981コードダウンロード先: http://nma.web.nitech.ac.jp/fukushima/opencv/extra_opencv.html
  2. 2. 実装関数,クラスのヘッダ 実装関数 クラスのヘッダ• A l i h Analysis.hpp – 下記全てのインクルードヘッダ• Timer.h – 時間計測用クラス• draw.h – 描 描画用の関数群 数群• imageQuality.h – 画質評価用関数群• plot.h – Gnuplotライクなプロッタークラス• util.h – ユーティリティ関数群
  3. 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. 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. 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. 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. 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. 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. 9. 逆引き関数,クラスリスト逆引き関数 クラスリスト カーソルの位置とその位置を表すグリッド ラベル 出力例
  10. 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. 11. 逆引き関数,クラスリスト 逆引き関数 クラスリスト に ンドを送り けるGnuplotにコマンドを送りつけるGnuplot gp(“./pgnuplot.exe”); gp( ./pgnuplot.exe );gp.cmd(“plot x”);Plot.cpp内に眠っています.
  12. 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. 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. 14. 有効マスク割合,NBP使わない画素数 Yの情報 RGBの情報BB:バウンディングボックスでマスクを作成Thresh:差分の閾値でマスクを作成Level0 SSIMなし, Level1 SSIM有り, Level2 全色計算Show:マスクを可視化して表示するか否か
  15. 15. Shift y:y軸の上下Shift y:y軸の上下Clipy:y軸の拡大縮小
  16. 16. 関数リファレンス• 記入予定.定• 今はtimerだけ記述 今はtimerだけ記述.
  17. 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. 18. mainに実装されたデモの解説• imageQualityTest(); – 様 な劣化画像を 様々な劣化画像をPSNR,SSIM,MSEで画質評価する,画質評価関数のテストです. 画質評価する 画質評価関数 ト す• plotTest(); – Gnuplotライクなプロッタのテストです.Sinカーブ,直線のプロット例が示されています.• consoleTest(); – 高速な関数だとあっという間に流れてしまうコンソール出力を,代わりにimshowで表示 する とで見やすくするクラ のテ トです することで見やすくするクラスのテストです.median,bilateral filterによるデノイジングの , よるデ イジングの デモを行っています.• analysisTest_color_gray(); – 簡単な分析機能付きimshow関数のテストです 引数に取った画像のヒストグラム 平 簡単な分析機能付きimshow関数のテストです.引数に取った画像のヒストグラム,平 均分散,指定された領域の輝度値信号を各チャネルごとに出力します.• analysisTest_multipleimage(); – 上記関数の複数枚入力の拡張です 複数枚の画像入力可能となり また各信号が重 上記関数の複数枚入力の拡張です.複数枚の画像入力可能となり,また各信号が重 ねあわされて出力されます.• analysisTest_compare(); – 上記関数のより詳細に比較するための関数のテ ト す ある画像と比較画像を入力 上記関数のより詳細に比較するための関数のテストです.ある画像と比較画像を入力 すると,その画像品質の比較,ヒストグラムの比較,信号の比較,差分値の可視化,誤 差の閾値処理の可視化などが行えます.
  19. 19. Plot表示例
  20. 20. コンソール画像出力表示例
  21. 21. 分析比較関数の表示例
  22. 22. 開発環境• WindowsXP• Visual Studio 2010 Visual Studio 2010• OpenCV svn ver 2.32くらい

×