.-- --

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
スポンサー広告 comment(-) trackback(-)
.10 2013

画像処理 〜HarrisとStephens、Plesseyのコーナー検出アルゴリズム

こんにちわ。Uedaです。

今日は誰しもOpenCVで一度はお世話になったことのある、コーナー(特徴点)検出についてです。

wiki
http://ja.wikipedia.org/wiki/コーナー検出法

OpenCVでは「goodFeaturesToTrack」関数の前身にあたると思います。筆者は大学時代から今に至るまで、この関数にお世話なりっぱなしです。
ということで、こいつはいったいなにをしているのか、特徴点抽出とはいったい何をやっているのかを簡単に調べてみました。

参考
http://d.hatena.ne.jp/michellon/20120304/1330850172


コード

前回コードで白黒画像を作って...


// 微分画像の生成
std::vector> differential_x;
std::vector> differential_y;
for (y = 1; y < height - 1; y++) {
std::vector dx;
std::vector dy;
for (x = 1; x < width - 1; x++) {

UInt8 *g11, *g12, *g13, *g21, *g22, *g23, *g31, *g32, *g33;
g11 = buffer + (y-1) * bytesPerRow + (x-1)*4; g12 = buffer + (y-1) * bytesPerRow + (x )*4; g13 = buffer + (y-1) * bytesPerRow + (x+1)*4;
g21 = buffer + (y ) * bytesPerRow + (x-1)*4; g22 = buffer + (y ) * bytesPerRow + (x )*4; g23 = buffer + (y ) * bytesPerRow + (x+1)*4;
g31 = buffer + (y+1) * bytesPerRow + (x-1)*4; g32 = buffer + (y+1) * bytesPerRow + (x )*4; g33 = buffer + (y+1) * bytesPerRow + (x+1)*4;

// NSLog(@"%d, %d", *g21 - *g23, *g12 - *g32);
dx.push_back(*g21 - *g23);
dy.push_back(*g12 - *g32);
}
differential_x.push_back(dx);
differential_y.push_back(dy);
}

// 各画素において特徴点かどうか判定
std::vector corners;
for (y = 3; y < height - 3; y++)
{
for (x = 3; x < width - 3; x++)
{
UInt8 A = 0, B = 0, C = 0;
UInt8 x11, x12, x13, x21, x22, x23, x31, x32, x33;
UInt8 y11, y12, y13, y21, y22, y23, y31, y32, y33;

x11 = (differential_x.at(y-1)).at(x-1); x12 = (differential_x.at(y-1)).at( x ); x13 = (differential_x.at(y-1)).at(x+1);
x21 = (differential_x.at( y )).at(x-1); x22 = (differential_x.at( y )).at( x ); x23 = (differential_x.at( y )).at(x+1);
x31 = (differential_x.at(y+1)).at(x-1); x32 = (differential_x.at(y+1)).at( x ); x33 = (differential_x.at(y+1)).at(x+1);

y11 = (differential_y.at(y-1)).at(x-1); y12 = (differential_y.at(y-1)).at( x ); y13 = (differential_y.at(y-1)).at(x+1);
y21 = (differential_y.at( y )).at(x-1); y22 = (differential_y.at( y )).at( x ); y23 = (differential_y.at( y )).at(x+1);
y31 = (differential_y.at(y+1)).at(x-1); y32 = (differential_y.at(y+1)).at( x ); y33 = (differential_y.at(y+1)).at(x+1);

A = x11*x11 + x12*x12 + x13*x13
+ x21*x21 + x22*x22 + x23*x23
+ x31*x31 + x32*x32 + x33*x33;

B = y11*y11 + y12*y12 + y13*y13
+ y21*y21 + y22*y22 + y23*y23
+ y31*y31 + y32*y32 + y33*y33;

C = x11*y11 + x12*y12 + x13*y13
+ x21*y21 + x22*y22 + x23*y23
+ x31*y31 + x32*y32 + x33*y33;

int det = A*B - C*C;
int tr = A + B;

// 判定 (0.1←感度k(sensitivity) 0.04〜0.15
if (35000 < det - 0.1 * tr * tr)
{
corners.push_back(Vector2d(x, y));
}
}
}

// 表示
for (int i = 0; i < corners.size(); i++)
{
Vector2d vec = corners.at(i);
NSLog(@"%f, %f", vec(0), vec(1));
}


検証データ

harris.png

そういえば、感度kってgoodFeaturesToTrackの引数にあったなー!!ってことくらいしか理解できてませんw
関連記事
スポンサーサイト

Comment

Post comment

  • comment
  • secret
  • 管理者にだけ表示を許可する

Trackback

trackbackURL:http://appteam.blog114.fc2.com/tb.php/259-96d72b3e

ブログ内検索

関連リンク

製品情報

最新記事

カテゴリ

プロフィール

neoxneo



NEXT-SYSTEM iOS Developers Blog


  • UTO:
    カナダ版iPhone4Sは、マナーモードでシャッター音がならない…


  • Ehara:
    ...


  • Hayate:
    ...


  • Tasaki:
    Developer登録完了...したのはいいけど


  • Ueda:
    ...



リンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。