OpenCV for Unityでぼかし処理
開発準備
Scriptの追加
SimpleScript.csのUpdate()メソッドにある「/* 画像加工開始 */」と「/* 画像加工終了 */」の間を修正していくのでその中身のみを書いていきます。
カメラ映像のMatはcvCamMatという変数で取得し、cvCamMatをTexture2Dに変換して描画しています。
画面に映るデフォルトの状態はこちらです。
わかりやすくするために描画結果のみ比べるようにします。
https://gyazo.com/88851159ac24489df23344cd93025779
Median Blur
https://gyazo.com/306db306e5517c9be9457337f7885cef
code:cs
Imgproc.medianBlur(cvCamMat, cvCamMat, 41);
第一引数:入力Mat
第二引数:出力Mat
第三引数:アパーチャサイズ(各ピクセル近傍領域の直径)、大きくなるとぼかしが強くなる(1より大きな奇数)
ガウシアンフィルタ
https://gyazo.com/8566f804ec65cab939076da1461a3ea8
code:cs
Imgproc.GaussianBlur(cvCamMat, cvCamMat, new Size(41, 41), 0.0, 0.0);
第一引数:入力Mat
第二引数:出力Mat
第三引数:ガウシアンカーネルのサイズ、大きくなるとぼかしが強くなる(1より大きな奇数)
第四引数:X方向の標準偏差
第五引数:Y方向の標準偏差
ボックスフィルタ
https://gyazo.com/72368e893111f0b96bd996408f675a5b
code:cs
Imgproc.boxFilter(cvCamMat, cvCamMat, cvCamMat.depth(), new Size(41, 41));
第一引数:入力Mat
第二引数:出力Mat
第三引数:デプス(Matのデータ型)
第四引数:平滑化カーネルのサイズ、大きくなるほどほかしが強くなる(1より大きな奇数)
バイラテラルフィルタ(失敗)
https://gyazo.com/88851159ac24489df23344cd93025779
code:cs
Imgproc.cvtColor (cvCamMat, cvCamMat, Imgproc.COLOR_RGBA2BGR);
Mat bgrMat = new Mat();
Imgproc.bilateralFilter (cvCamMat, bgrMat, 41, 0.0, 0.0);
Imgproc.cvtColor(bgrMat, cvCamMat, Imgproc.COLOR_BGR2RGBA);
第一引数:入力Mat
第二引数:出力Mat
第三引数:各ピクセル近傍領域の直径、大きくなるほどほかしが強くなる
第四引数:色空間におけるフィルタシグマ、大きくなるほど色的により遠くのピクセルが混ぜ合わさる
第五引数:座標空間におけるフィルタシグマ、大きくなるほど距離的により遠くのピクセル同士が影響しあう
「Utils.setDebugMode(true);」でOpenCVのネイティブ側で発生したエラーの出力ができる。
code:console
imgproc::bilateralFilter_11() : /Users/satoo/opencv/mac/3.1/opencv-3.1.0/modules/imgproc/src/smooth.cpp:3228: error: (-215) (src.type() == CV_8UC1 || src.type() == CV_8UC3) && src.data != dst.data in function bilateralFilter_8u
第一引数と第二引数は同じMatだとダメみたいです。
別のMatを用意して再度実行したら処理は重くなりましたが、描画される画像に変化は見られませんでした。
ミーンシフトフィルタ(失敗)
https://gyazo.com/88851159ac24489df23344cd93025779
code:cs
Imgproc.cvtColor (cvCamMat, cvCamMat, Imgproc.COLOR_RGBA2BGR);
Mat bgrMat = new Mat();
Imgproc.pyrMeanShiftFiltering(cvCamMat, bgrMat, 11, 11);
Imgproc.cvtColor(bgrMat, cvCamMat, Imgproc.COLOR_BGR2RGBA);
第一引数:入力Mat
第二引数:出力Mat
第三引数:空間窓の半径?
第四引数:色空間窓の半径?
バイラテラルフィルタと同じく処理は重いが動作しない。
引数の数値が正しくないとかが原因かもしれない。
その他
他のバイラテラルフィルタや平均値シフト法でのぼかしも挑戦しましたが動作しないため現在記載しておりません。
処理速度(上と同じ、ぼかし度:41、画像サイズ:750x750pxで比較)
table:順位 フィルタ名 体感速度
1位 ボックスフィルタ ほぼリアルタイム
2位 ガウシアンフィルタ 2秒ほど遅れを感じる
3位 Median Blur 3秒ほど遅れを感じる
※バイラテラルフィルタは順位は4位だが変化がないため除外
ちゃんとぼかされていてある程度のリアルタイム性が必要であればボックスフィルタが有能?
引数や元Matサイズを調整することで変わることがあると思います。