Saqoosha.net

  1. About
  2. Archives
  3. Search
  4. Say
Language:

スーパー高速に射影変換するには

昨日のてら子で質問にあった射影変換の高速化。気になったのでやってみましたよ。射影変換 (Homography) てのは↓こういうのを言います。

2009052501-Homography

左のようなパースのついた画像から、真っ正面むいてる絵を取り出すのに使ったりするですね。まーったく理論とかわかってなかったのでいろいろググって探してみたところ、AS3 で書いてる人がいたのでこれをベースにやってみました。OpenCV のソースみてるとかなり複雑そうだったのにこれはすごくシンプル。意外と簡単。

高速化の方法としては 2 つ。1 つは、Pixel Bender を使う方法。もう 1 つは DisplacementMapFilter を使う方法。両方書いてみた。で、処理速度を計測してみた結果。

––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
.TestSuite (20 iterations)
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
method...................................................ttl ms...avg ms
Test1_setPixel                                             6594   329.70
Test2a_PixelBender                                          155     7.75
Test2b_PixelBender_Smoothed                                 187     9.35
Test3_DisplacementMap                                        87     4.35
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

それぞれの方法で 20 回処理した時間が ttl ms。avg ms は 1 回あたりの平均処理時間。Test1_setPixel てのが元のコード。329.7ms。これじゃリアルタイムには使えない。Test2a_PixelBender が Pixel Bender 版。40 倍高速。さすが。Test2b_PixelBender_Smoothed これも Pixel Bender なんだけど、sampleNearest じゃなくって sampleLinear で色を取ってきてるので画質的には一番きれい。で、最速、Test3_DisplacementMap。DisplacementMapFilter 版。(あー、ちなみにこのベンチマークテストは gSkinner の PerformanceTest クラスを使わせてもらってます。便利。)

まあ数字だけ見ると DisplacementMapFilter が一番かなっと思うのだけど、画質がけっこうアレでして。このサンプルで一番歪みが激しい左上のを比較してみるとよくわかる。

20090525-Homography2

というわけで、速度的には、DisplacementMapFilter が一番速いけど画質も考慮すると Pixel Bender (sampleNearest) がベストですかね、っと。

ソースはこちら。

追記:Test3_DisplacementMap には DisplacementMap 用の画像を生成する時間が含まれてないので、対象となる四角形がグリグリ変わるのなら Pixel Bender のが断然高速。って、あー、そっか、Displace map を Pixel Bender で作ればいいのか。

4 Responses to “スーパー高速に射影変換するには”

  1. Saqoosha.net :: スーパー高速に射影変換するには « Netcrema - creme de la social news via digg + delicious + stumpleupon + reddit Says:

    [...] Saqoosha.net :: スーパー高速に射影変換するには [...]

  2. HIDIHO! » Homography Says:

    [...] the comments, homography can be part of the AR video stream process. saqoosha did 2 versions with Pixelbender and a displacementmap filter. His benchmark simply makes this class pointless ( +/- 75 times faster ) check saqoosha’s article here [...]

  3. たかのぶ Says:

    てら子で射影変換の質問させてもらったたかのぶです。
    早速手持ちのソースと組み合わせてみたところ、バッチリ動きました!
    動画でもイケてます。ホントありがとうございました。
    変換後の縦横比が1:1になるみたいなんで、その辺もう少し勉強してみます。
    あと、openCVのソースが複雑なのは多分、変換の対象となる点が4点以上
    あったときに、誤差を最少2乗法とかで丸める処理が書かれてるんだと思います。

    いい企画書、書けそうです。おーワクワクしてきた!

  4. Saqoosha Says:

    そりゃよかった。
    変換後のサイズは HomographyTransformFilter の 1 個目と 2 個目の引数で変えられますよ。
    OpenCV の件、そうみたいですねー。あとで調べたらそんなかんじでした。

Leave a Reply



Saqoosha.net は Windows なら Internet Explorer 7, Firefox 3, Safari 3, Mac なら Firefox 3, Safari 3 でいい感じになるように作ってありますのでそれ以外のブラウザでは Saqoosha が意図しない見た目になっている可能性がありますのでよろしくです。
どうやら Flash Player の最新版がインストールされていないようです。こちらから最新版をインストールするともうちょっと素敵な Saqoosha.net を見ることができるかもしれません → Flash Player Download