ハリスのコーナー検出について調べた。
PTAMつながりでこれを調べたけども、PTAMではこの方式は使っていない。PTAMでは、FAST Corner Detectionを使っている。これは、libCVD内のcvd_src/faster_corner_9.cxxとかで実装されている。
で、これがまぁびっくりするほどなんのこっちゃわからんので、基本から。。
ハリスのコーナー検出の詳しい説明は、Wikipediaかな。
要するに、微分値が一方向に大きいところが辺、多くの方向に大きいところが頂点ってことみたい。
で、
としたとき、行列の2個の固有値が大きいときに、そこにコーナーがある。
R=det M – k (tr M)^2
detは行列式、trは対角成分の和を表す。kは経験的に決定する必要があり、0.04から0.15の範囲が適しているらしい。
で、なんのこっちゃぜんぜんわからんのでテストプログラムを書く。
参考にしたのは、University of SouthamptonのElectronics and Computer ScienceのComputer Vision Demonstration WebsiteのCorner Detection。ここには、Javaのサンプルコードが置かれている。
Javaで見てもしょうがないので、C#でちょいちょいと。。。
てなアプリです。速度を追求すると言うよりも1枚1枚の経過をひとつづつ確認したかったので、こんな画面。
まず、オリジナルの画像。USBカメラで撮影。Microsoft LifeCam VX-6000を普段使っているのだが、どうも、このカメラは、ノイズが多い模様。640×480。
面倒なので、サンプル通り、Grayscaleに落とす。横着して、(2*r + 4*g + b)/7でGrayscaleに落とす。
そのままだと、ざらざらしているので、3×3のメディアンフィルタを通す。
で、x方向微分と、y方向微分。
x方向微分は、 、y方向微分はのPrewitt filterを使う。
x方向微分の画像は、Min/Maxの値は-602/442。y方向微分の画像は、Min/Maxの値は-513/438。それぞれの値を、0から255にマップして表示している。一応全部Floatで計算。
x方向微分、y方向微分をそれぞれ掛け合わせたのがこれ。 Min/Max値は-105040/99078。
次にx方向微分の2乗、y方向微分の2乗。 Min/Maxはそれぞれ、0/362404、0/263169。
ここで、それぞれにガウシアンフィルタ(Gaussian filter)で平滑化する。3×3でかけてみた。
それぞれ、xy、xの2乗、yの2乗のガウシアンフィルタの結果。。
Min/Maxはそれぞれ、-74094.31/66832、0/224518.4、0/158617.4
で、最後に、R=det M – k (tr M)^2。
det Mは行列式なので、a*d – b*cということで、(xの2乗) x (yの2乗) – (xy x xy)
k (tr M) ^ 2は対角成分の和ということで、k × ( xの2乗 × yの2乗)。
Min/Maxはそれぞれ、-2.007325E+09/1.741576E+09、-5.143325E+09/6.3295E+08、-7.77278E+09/3.366804E+08。
0.04の絵だと、襟のあたりに明るい点がでている。これが、コーナーになる。
せっかくなので、Grayscaleのイメージの上に10000000.0 (=1.0E+7)よりも大きい値のところに赤でマークを重畳。
で、この赤い点がコーナーとなるわけだが。。。。