Harris Corner Detect

ハリスのコーナー検出について調べた。

PTAMつながりでこれを調べたけども、PTAMではこの方式は使っていない。PTAMでは、FAST Corner Detectionを使っている。これは、libCVD内のcvd_src/faster_corner_9.cxxとかで実装されている。

で、これがまぁびっくりするほどなんのこっちゃわからんので、基本から。。

ハリスのコーナー検出の詳しい説明は、Wikipediaかな。

要するに、微分値が一方向に大きいところが辺、多くの方向に大きいところが頂点ってことみたい。

で、

harrisCorner

としたとき、行列の2個の固有値が大きいときに、そこにコーナーがある。

R=det M – k (tr M)^2

detは行列式、trは対角成分の和を表す。kは経験的に決定する必要があり、0.04から0.15の範囲が適しているらしい。

で、なんのこっちゃぜんぜんわからんのでテストプログラムを書く。

参考にしたのは、University of SouthamptonElectronics and Computer ScienceComputer Vision Demonstration WebsiteCorner Detection。ここには、Javaのサンプルコードが置かれている。

Javaで見てもしょうがないので、C#でちょいちょいと。。。

image

てなアプリです。速度を追求すると言うよりも1枚1枚の経過をひとつづつ確認したかったので、こんな画面。

left
まず、オリジナルの画像。USBカメラで撮影。Microsoft LifeCam VX-6000を普段使っているのだが、どうも、このカメラは、ノイズが多い模様。640×480。

intermidiate0

面倒なので、サンプル通り、Grayscaleに落とす。横着して、(2*r + 4*g + b)/7でGrayscaleに落とす。

intermidiate1

そのままだと、ざらざらしているので、3×3のメディアンフィルタを通す。 

intermidiate2intermidiate3

で、x方向微分と、y方向微分。

x方向微分は、image001 、y方向微分はimage002のPrewitt filterを使う。

x方向微分の画像は、Min/Maxの値は-602/442。y方向微分の画像は、Min/Maxの値は-513/438。それぞれの値を、0から255にマップして表示している。一応全部Floatで計算。

intermidiate4

x方向微分、y方向微分をそれぞれ掛け合わせたのがこれ。  Min/Max値は-105040/99078。

intermidiate5intermidiate6

次にx方向微分の2乗、y方向微分の2乗。 Min/Maxはそれぞれ、0/362404、0/263169。

ここで、それぞれにガウシアンフィルタ(Gaussian filter)で平滑化する。3×3でかけてみた。

intermidiate7
intermidiate8intermidiate9

それぞれ、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乗)。

intermidiate10
intermidiate11intermidiate12
k をそれぞれ、0.04、0.10、0.15で試してみた。

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)よりも大きい値のところに赤でマークを重畳。

result04result10result15  

で、この赤い点がコーナーとなるわけだが。。。。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください