Mais conteúdo relacionado
Semelhante a OpenCVの拡張ユーティリティ関数群 (20)
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);
}
- 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:マスクを可視化して表示するか否か
- 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();
– 上記関数のより詳細に比較するための関数のテ ト す ある画像と比較画像を入力
上記関数のより詳細に比較するための関数のテストです.ある画像と比較画像を入力
すると,その画像品質の比較,ヒストグラムの比較,信号の比較,差分値の可視化,誤
差の閾値処理の可視化などが行えます.