Intel IPP さまさま

ついでに今回の仕事で使用した Intel IPP(Integrated Performance Primitive) についても書いておきたいと思います。これは有料(約3万円)の信号・画像処理ライブラリですが Intel 製だけあってとても速いです。
画像処理で「こんなんがあったらええな」と思ったものはほぼ全て実装されている上に、各 API は RGB やグレースケール画像、ピクセル深度が 8bit/16bit/Float のほぼ全ての組み合わせについて揃っており、実にかゆい所に手が届く作りになっています*1Computer Vision 系の API で特徴点のトラッキングなんかも入っているので、今回の動画認識はこれをベースにアルゴリズムを組み立てていく方向で実装しました。まあ研究ではないので手法の独自性もいらんしー(笑)。というかこれがないと今回の仕事はまずこなせなかったと思います。(買ってもらえてよかったほんまに…) まさに Intel さまさまです。ちなみに CPU は Intel でなくてもちゃんと動きます(笑)。
もっとも、処理を行う範囲指定の仕方に妙なクセがあります。

IppStatus ippiFilterGauss_8u_C1R(const Ipp8u* pSrc, int srcStep,
  Ipp8u* pDst, int dstStep,
  IppiSize dstRoiSize, IppiMaskSize mask);

これは 8bit グレースケール画像にガウシアンフィルタをかける API です。これを使ってぼかしをかける場合、入力画像のピクセル参照がはみ出さないようにするため、出力画像の処理範囲をあらかじめ 2 ピクセル(mask が 5x5の場合)狭めておく必要があります。そういう指定をするなら、普通のライブラリなら Rectangle クラスのように矩形で指定するのが普通ですが、dstRoiSize は width と height しかメンバに持ちません。そこで、pDst に (2, 2) のピクセルを指すアドレスを指定し、dstRoiSize には width/height 共に 4 を引いたサイズを渡してやる必要があります。これがなんとも気持ち悪いです。なんだかんだ言ってもう慣れてしまいましたが…(^^;)。

(2007/9/13 訂正) 謹製は謙譲語とのツッコミが入りましたので修正しました。これは恥ずかしい…。
あと、有料化したのは確か IPL2.5 -> IPP3.0 の時やったように思います。

*1:敢えて問題を挙げるならば、API の数がかなりたくさんあるので、英語版ドキュメント(PDF)の海を泳ぐ覚悟の必要があります。日本語ドキュメントもありますが、少し古いようで今回使ったトラッキングについては書かれていませんでした。