转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
强角点检测算子的Pascal实现代码         ★★★★

强角点检测算子的Pascal实现代码

作者:闵涛 文章来源:闵涛的学习笔记 点击数:632 更新时间:2009/4/23 18:26:29

procedure CornerDetect(sWidth, sHeight: longint; Quality: extended);
var
  i, j, fi, fj: longint;
  a, b, c, sum, MinAccept, MaxEigenvalue: extended;
begin
  FeatureCount := 0;
  {
  下面采用Good Feature To Track介绍的方法
  J. Shi and C. Tomasi "Good Features to Track", CVPR 94
  }
  for i := 1 to sWidth - 2 do
    for j := 1 to sHeight - 2 do begin
      dx[i, j] := ImageGray[i - 1, j - 1] + 2 * ImageGray[i - 1, j] + ImageGray[i - 1, j + 1]
        - (ImageGray[i + 1, j - 1] + 2 * ImageGray[i + 1, j] + ImageGray[i + 1, j + 1]);
      dy[i, j] := ImageGray[i - 1, j + 1] + 2 * ImageGray[i, j + 1] + ImageGray[i + 1, j + 1]
        - (ImageGray[i - 1, j - 1] + 2 * ImageGray[i, j - 1] + ImageGray[i + 1, j - 1]);
      dxy[i, j] := ImageGray[i + 1, j - 1] + ImageGray[i - 1, j + 1]
        - (ImageGray[i - 1, j - 1] + ImageGray[i + 1, j + 1]);
    end;
  {求取Sobel算子的Dx, Dy, Dxy
  Dx:
  |1 0 -1|
  |2 0 -2|
  |1 0 -1|
  Dy:
  |-1 -2 -1|
  | 0  0  0|
  | 1  2  1|
  Dxy
  |-1  0  1|
  | 0  0  0|
  | 1  0 -1|}
  MaxEigenvalue := 0;
  for i := 2 to sWidth - 3 do
    for j := 2 to sHeight - 3 do begin
      a := 0; b := 0; c := 0;
      for fi := i - 1 to i + 1 do
        for fj := j - 1 to j + 1 do begin
          a := a + sqr(dx[fi, fj]);
          b := b + dxy[fi, fj];
          c := c + sqr(dy[fi, fj]);
        end;
      a := a / 2; c := c / 2;
      Eigenvalues[i, j] := (a + c - sqrt((a - c) * (a - c) + b * b));
      if Eigenvalues[i, j] > MaxEigenvalue then MaxEigenvalue := Eigenvalues[i, j];
    end;
  {求取矩阵
    |∑Dx*Dx   ∑Dxy|
  M=|               |
    |∑Dxy   ∑Dy*Dy|
  的特征值
  λ= ∑Dx*Dx + ∑Dy*Dy - ((∑Dx*Dx+∑Dy*Dy)^2-4*(∑Dx*Dx * ∑Dy*Dy - ∑Dxy * ∑Dxy))^1/2}
  MinAccept := MaxEigenvalue * Quality;
  {设置最小允许阀值}

  for i := 8 to sWidth - 9 do
    for j := 8 to sHeight - 9 do
      if Eigenvalues[i, j] > MinAccept then begin
        WBPoint[i, j] := true;
        Inc(FeatureCount);
      end else
        WBPoint[i, j] := false;

  for i := 8 to sWidth - 9 do
    for j := 8 to sHeight - 9 do
      if WBPoint[i, j] then begin
        sum := Eigenvalues[i, j];
        for fi := i - 8 to i + 8 do begin
          for fj := j - 8 to j + 8 do
            if sqr(fi - i) + sqr(fj - j) <= 64 then
              if (Eigenvalues[fi, fj] >= sum) and ((fi <> i) or (fj <> j)) and (WBPoint[fi, fj]) then begin
                WBPoint[i, j] := false;
                Dec(FeatureCount);
                break;
              end;
          if not WBPoint[i, j] then break;
        end;
      end;
  {用非最大化抑制来抑制假角点}

  setlength(Features, FeatureCount); fi := 0;
  for i := 8 to sWidth - 9 do
    for j := 8 to sHeight - 9 do
      if WBPoint[i, j] then begin
        Features[fi].Info.X := i;
        Features[fi].Info.Y := j;
        Features[fi].Index := 0;
        Inc(fi);
      end;
  {输出最终的点序列}
end;


[VB.NET程序][原创]TEA算法的VB实现代码  
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台