22
OpenCVOpenCV拡張ユーティリティ関数群 名古屋工業大学 福嶋慶繁 名古屋工業大学 福嶋慶繁 Twitter: @fukushima1981 http://nma.web.nitech.ac.jp/fukushima/opencv/extra_opencv.html コードダウンロード先:

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

Embed Size (px)

DESCRIPTION

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

Citation preview

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

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

名古屋工業大学福嶋慶繁名古屋工業大学福嶋慶繁

Twitter:  @fukushima1981

http://nma.web.nitech.ac.jp/fukushima/opencv/extra_opencv.html

コードダウンロード先:

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

実装関数 クラスのヘッダ実装関数,クラスのヘッダ

A l i h• Analysis.hpp– 下記全てのインクルードヘッダ

• Timer.hTimer.h– 時間計測用クラス

• draw.h描 数群– 描画用の関数群

• imageQuality.h– 画質評価用関数群– 画質評価用関数群

• plot.h– Gnuplotライクなプロッタークラス

• util.h– ユーティリティ関数群

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

逆引き関数 クラスリスト逆引き関数,クラスリスト

画像品質画像品質• 画像品質MSEを計算する

– getMSEY, getMSERGB• 画像品質PSNRを計算する画像品質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

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

逆引き関数 クラスリスト逆引き関数,クラスリスト

描画描画• 三角形,逆三角形を描画する

– triangle, triangleinv• 十×*を描画する十 を描画する

– drawCross( XCV_DRAWCROSS_PLUS, XCV_DRAWCROSS_TIMES,XCV_DRAWCROSS_ASTERRISK)

• 画面全体に十字線(グリッド)を表示するdrawGrid– drawGrid

• 2枚の画像を連結する– connect( XCV_CONNECT_HORIZON,XCV_CONNECT_VERTICAL)

• 複数枚の画像を連結する複数枚の画像を連結する– connectMulti

• 画像のヒストグラム,累積ヒストグラムを描画する– createHistogramGray, createHistogramRGB,

t A Hi t G t A Hi t RGB– createAccHistogramGray, createAccHistogramRGB• ボックス型のマスクを生成,セット,追加する

– createBoxMask, setBoxMask, addBoxMask

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

逆引き関数 クラスリスト逆引き関数,クラスリスト

計算時間計測計算時間計測• スコープ内の処理が終わるまでの時間を計測し,”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();()

}

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

逆引き関数 クラスリスト逆引き関数,クラスリスト

アルフ ブレンドによる画像の確認用関数アルファブレンドによる画像の確認用関数

二画像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が未実装

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

逆引き関数 クラスリスト逆引き関数,クラスリスト

ンソ ル出力の代わりに画像に fするコンソール出力の代わりに画像にprintfする

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);出力例

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

逆引き関数 クラスリスト逆引き関数,クラスリスト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のみ描く

l () //入力した点を全てクリアp.clear();//入力した点を全てクリア

p.setKeyName(“sin”,0);//データ0のラベルをsinと名付ける

p.setPlot(0,CV_RGB(255,0,0),XCV_PLOT_ASTERRISK);//赤のアスタリスク*で描画する

f (i i 100 i 100 i )for(int i=‐100;i<100;i++)

p.add(i/50.0,sin(CV_PI*i/50.0),0);

}

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

逆引き関数 クラスリスト逆引き関数,クラスリストカーソルの位置とその位置を表すグリッド

ラベル

出力例

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

Plot画面のキーボードショートカットPlot画面のキーボードショートカット

l ()メソ ドで呼び出したグラフ画面で有効なキ ボ ドシ トカ トplot()メソッドで呼び出したグラフ画面で有効なキーボードショートカット

• q: 終了

• ?: ヘルプ

• m: マウスオーバーの値を表示/非常時切り替え

• k: ラベルを表示する位置の移動

• x: xのスタートポイントを0に• x: xのスタートポイントを0に

• y: yのスタートポイントを0に

• z: XYのスタートポイントを0に

• r: XY座標の設定リセット

• s: 画面を保存

• p: データをgnuplot用に出力.ほぼ同じグラフを書くためのGnuplot用のコマンp: デ タをgnuplot用に出力.ほぼ同じグラフを書くためのGnuplot用のコマンドも出力する.(gnuplotクラスと連携すると楽)

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

逆引き関数 クラスリスト逆引き関数,クラスリスト

に ンドを送り けるGnuplotにコマンドを送りつける

Gnuplot gp(“./pgnuplot.exe”);Gnuplot gp( ./pgnuplot.exe );

gp.cmd(“plot x”);

Plot.cpp内に眠っています.

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

imshowAnalysisCompareimshowAnalysisCompare

枚の画像を詳しく比較する• 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)

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

表示切り替えスイッチとalpha0 ブレンド は ブレンド値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の差分信号が表示

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

有効マスク割合,NBP使わない画素数

Yの情報

有効マスク割合,NBP使わない画素数

RGBの情報RGBの情報

BB:バウンディングボックスでマスクを作成Thresh:差分の閾値でマスクを作成Level0 SSIMなし, Level1 SSIM有り, Level2 全色計算Show:マスクを可視化して表示するか否か

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

Shift y:y軸の上下Shift y:y軸の上下Clipy:y軸の拡大縮小

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

関数リファレンス関数リファレンス

定• 記入予定.

• 今はtimerだけ記述今はtimerだけ記述.

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

Timer h: class CalcTimeTimer.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(); 計測時間を初期化してもう一度スタート

• do ble getTime() 現在の経過時間を取得• double getTime() 現在の経過時間を取得

• void show(); 現在の経過時間を取得してコンソール出力

• void show(char* message); 現在の経過時間を取得し,メッセージの設定してコンソール出力

備考備考

• コンストラクタでstart(),デストラクタでshow()メソッドが呼び出されるので,宣言したスコープ内でかかった計算時間を簡単に計算可能

仕様例:

下記のように書くと 関数t tに要する計算時間が 単位で出力される下記のように書くと,関数testに要する計算時間がms単位で出力される.

void test()

{

CalcTime t(“function”, TIME_MSEC);

H hHogehoge…

}

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

mainに実装されたデモの解説mainに実装されたデモの解説• imageQualityTest();

様 な劣化画像を 画質評価する 画質評価関数 ト す– 様々な劣化画像をPSNR,SSIM,MSEで画質評価する,画質評価関数のテストです.

• plotTest();– Gnuplotライクなプロッタのテストです.Sinカーブ,直線のプロット例が示されています.

• consoleTest();– 高速な関数だとあっという間に流れてしまうコンソール出力を,代わりにimshowで表示

することで見やすくするクラスのテストです.median,bilateral filterによるデノイジングのする とで見やすくするクラ のテ トです , よるデ イジングのデモを行っています.

• analysisTest_color_gray();– 簡単な分析機能付きimshow関数のテストです 引数に取った画像のヒストグラム 平簡単な分析機能付きimshow関数のテストです.引数に取った画像のヒストグラム,平

均分散,指定された領域の輝度値信号を各チャネルごとに出力します.

• analysisTest_multipleimage();上記関数の複数枚入力の拡張です 複数枚の画像入力可能となり また各信号が重– 上記関数の複数枚入力の拡張です.複数枚の画像入力可能となり,また各信号が重ねあわされて出力されます.

• analysisTest_compare();上記関数のより詳細に比較するための関数のテ ト す ある画像と比較画像を入力– 上記関数のより詳細に比較するための関数のテストです.ある画像と比較画像を入力すると,その画像品質の比較,ヒストグラムの比較,信号の比較,差分値の可視化,誤差の閾値処理の可視化などが行えます.

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

Plot表示例Plot表示例

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

コンソール画像出力表示例コンソール画像出力表示例

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

分析比較関数の表示例分析比較関数の表示例

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

開発環境開発環境

• WindowsXP

• Visual Studio 2010Visual Studio 2010

• OpenCV svn ver 2.32くらい