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

实现Lucas-Kanade光流计算的Delphi类

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2309 更新时间:2009/4/23 18:26:16
1 + Images[0, jj - 1, k - 1] shl 1 + Images[0, jj + 1, k - 1] shl 1 +
        Images[0, jj - 1, k - 1] + Images[1, jj - 1, k - 1] + Images[0, jj + 1, k - 1] + Images[1, jj + 1, k - 1]) shr 4;
      Images[nWidth - 1, j, k] := (Images[oWidth - 1, jj, k - 1] shl 2 +
        Images[oWidth - 2, jj, k - 1] shl 1 + Images[oWidth - 1, jj, k - 1] shl 1 + Images[oWidth - 1, jj - 1, k - 1] shl 1 + Images[oWidth - 1, jj + 1, k - 1] shl 1 +
        Images[oWidth - 2, jj - 1, k - 1] + Images[oWidth - 1, jj - 1, k - 1] + Images[oWidth - 2, jj + 1, k - 1] + Images[oWidth - 1, jj + 1, k - 1]) shr 4;
    end;
    {处理左右边}
    Images[0, 0, k] := (Images[0, 0, k - 1] shl 2 +
      Images[0, 0, k - 1] shl 1 + Images[1, 0, k - 1] shl 1 + Images[0, 0, k - 1] shl 1 + Images[0, 1, k - 1] shl 1 +
      Images[0, 0, k - 1] + Images[1, 0, k - 1] + Images[0, 1, k - 1] + Images[1, 1, k - 1]) shr 4;
    {处理左上点}
    Images[0, nHeight - 1, k] := (Images[0, oHeight - 1, k - 1] shl 2 +
      Images[0, oHeight - 1, k - 1] shl 1 + Images[1, oHeight - 1, k - 1] shl 1 + Images[0, oHeight - 2, k - 1] shl 1 + Images[0, oHeight - 1, k - 1] shl 1 +
      Images[0, oHeight - 2, k - 1] + Images[1, oHeight - 2, k - 1] + Images[0, oHeight - 1, k - 1] + Images[1, oHeight - 1, k - 1]) shr 4;
    {处理左下点}
    Images[nWidth - 1, 0, k] := (Images[oWidth - 1, 0, k - 1] shl 2 +
      Images[oWidth - 2, oHeight - 1, k - 1] shl 1 + Images[oWidth - 1, oHeight - 1, k - 1] shl 1 + Images[oWidth - 1, oHeight - 1, k - 1] shl 1 + Images[oWidth - 1, oHeight - 1, k - 1] shl 1 +
      Images[oWidth - 2, oHeight - 1, k - 1] + Images[oWidth - 1, oHeight - 1, k - 1] + Images[oWidth - 2, oHeight - 1, k - 1] + Images[oWidth - 1, oHeight - 1, k - 1]) shr 4;
    {处理右上点}
    Images[nWidth - 1, nHeight - 1, k] := (Images[oWidth - 1, oHeight - 1, k - 1] shl 2 +
      Images[oWidth - 2, oHeight - 1, k - 1] shl 1 + Images[oWidth - 1, oHeight - 1, k - 1] shl 1 + Images[oWidth - 1, oHeight - 2, k - 1] shl 1 + Images[oWidth - 1, oHeight - 1, k - 1] shl 1 +
      Images[oWidth - 2, oHeight - 2, k - 1] + Images[oWidth - 1, oHeight - 2, k - 1] + Images[oWidth - 2, oHeight - 1, k - 1] + Images[oWidth - 1, oHeight - 1, k - 1]) shr 4;
    {处理右下点}
  end;
end;

procedure TOpticalFlowLK.InitFeatures(Frames: TBitmap);
var
  i, j: longint;
  Line: pRGBTriple;
begin
  SetStretchBltMode(Frame.Canvas.Handle, Stretch_Halftone);
  StretchBlt(Frame.Canvas.Handle, 0, 0, Width, Height, Frames.Canvas.Handle, 0, 0, Frames.Width, Frames.Height, SrcCopy);
  for i := 0 to Height - 1 do begin
    Line := Frame.ScanLine[i];
    for j := 0 to Width - 1 do begin
      ImageOld[j, i, 0] := (Line^.rgbtBlue * 11 + Line^.rgbtGreen * 59 + Line^.rgbtRed * 30) div 100;
      ImageGray[j, i] := ImageOld[j, i, 0];
      Inc(Line);
    end;
  end;
  {初始化金字塔图像第一层ImageOld[x,y,0]}
  MakePyramid(ImageOld, Width, Height, L);
  {生成金字塔图像}
  CornerDetect(Width, Height, 0.01);
  {进行强角点检测}
end;

procedure TOpticalFlowLK.CalOpticalFlowLK(Frames: TBitmap);
var
  i, j, fi, fj, k, ll, m, dx, dy, gx, gy, px, py, kx, ky, ed, edc, nWidth, nHeight: longint;
  nx, ny, vx, vy, A, B, C, D, E, F, Ik: extended;
  Ix, Iy: TDoubleExtendedArray;
  Line: pRGBTriple;
  Change: boolean;
begin
  SetStretchBltMode(Frame.Canvas.Handle, Stretch_Halftone);
  StretchBlt(Frame.Canvas.Handle, 0, 0, Width, Height, Frames.Canvas.Handle, 0, 0, Frames.Width, Frames.Height, SrcCopy);
  for i := 0 to Height - 1 do begin
    Line := Frame.ScanLine[i];
    for j := 0 to Width - 1 do begin
      ImageNew[j, i, 0] := (Line^.rgbtBlue * 11 + Line^.rgbtGreen * 59 + Line^.rgbtRed * 30) div 100;
      Inc(Line);
    end;
  end;
  {初始化金字塔图像第一层ImageNew[x,y,0]}
  MakePyramid(ImageNew, Width, Height, L);
  {生成金字塔图像}
  setlength(Ix, 15, 15); setlength(Iy, 15, 15);
  {申请差分图像临时数组}
  for m := 0 to FeatureCount - 1 do begin
    {算法细节见:
    Jean-Yves Bouguet "Pyramidal Implementation of the Lucas Kanade Feature Tracker Description of the algorithm"}
    gx := 0; gy := 0;
    for ll := L - 1 downto 0 do begin
      px := Features[m].Info.X shr ll;
      py := Features[m].Info.Y shr ll;
      {对应当前金字塔图像的u点:u[L]:=u/2^L}
      nWidth := Width shr ll; nHeight := Height shr ll;
      A := 0; B := 0; C := 0;
      for i := max(px - 7, 1) to min(px + 7, nWidth - 2) do
        for j := max(py - 7, 1) to min(py + 7, nHeight - 2) do begin
          fi := i - px + 7; fj := j - py + 7;
          Ix[fi, fj] := (ImageOld[i + 1, j, ll] - ImageOld[i - 1, j, ll]) / 2;
          Iy[fi, fj] := (ImageOld[i, j + 1, ll] - ImageOld[i, j - 1, ll]) / 2;
          A := A + Ix[fi, fj] * Ix[fi, fj]; B := B + Ix[fi, fj] * Iy[fi, fj];
          C := C + Iy[fi, fj] * Iy[fi, fj];
        end;
      {计算2阶矩阵G:
        |Ix(x,y)*Ix(x,y)  Ix(x,y)*Iy(x,y)|
      ∑|Ix(x,y)*Iy(x,y)  Iy(x,y)*Iy(x,y)|}
      D := A * C - B * B;
      vx := 0; vy := 0; dx := 0; dy := 0;
      if abs(D) > 1E-8 then begin
        for k := 1 to 10 do begin
          E := 0; F := 0;
          for i := max(px - 7, 1) to min(px + 7, nWidth - 2) do
            for j := max(py - 7, 1) to min(py + 7, nHeight - 2) do begin
              fi := i - px + 7; fj := j - py + 7;
              kx := i + gx + dx; ky := j + gy + dy;
              if kx < 0 then kx := 0; if kx > nWidth - 1 then kx := nWidth - 1;
              if ky < 0 then ky := 0; if ky > nHeight - 1 then ky := nHeight - 1;
              Ik := ImageOld[i, j, ll] - ImageNew[kx, ky, ll];
              E := E + Ik * Ix[fi, fj];
              F := F + Ik * Iy[fi, fj];
            end;
          {计算2x1阶矩阵b:
            |Ik(x,y)*Ix(x,y)|
          ∑|Ik(x,y)*Iy(x,y)|}
          nx := (C * E - B * F) / D;
          ny := (B * E - A * F) / (-D);
          {计算η=G^-1*b}
          vx := vx + nx; vy := vy + ny;
          dx := trunc(vx); dy := trunc(vy);
          {得到相对运动向量d}
        end;
      end;
      gx := (gx + dx) shl 1; gy := (gy + dy) shl 1;
      {得到下一层的预测运动向量g}
    end;
    gx := gx div 2; gy := gy div 2;
    px := px + gx; py := py + gy;
    Features[m].Info.X := px;
    Features[m].Info.Y := py;
    Features[m].Vector.X := gx;
    Features[m].Vector.Y := gy;
    if (px > Width - 1) or (px < 0) or (py > Height - 1) or (py < 0) then Features[m].Index := 1;
    {失去特征点处理}
  end;

  for k := 0 to L - 1 do begin
    nWidth := Width shr k; nHeight := Height shr k;
    for i := 0 to nWidth - 1 do
      for j := 0 to nHeight - 1 do
        ImageOld[i, j, k] := ImageNew[i, j, k];
  end;
  {复制J到I}
  repeat
 &nbs

上一页  [1] [2] [3]  下一页


[系统软件]InstallShield Express for delphi制作安装程序定…  [常用软件]InstallShield Express制作Delphi数据库安装程序
[Delphi程序]为什么选择Delphi.Net ?  [Delphi程序]《关于VisiBroker For Delphi的使用》(4)
[Delphi程序]Delphi 程序员代码编写标准指南  [Delphi程序]转贴:Conversion to Delphi 6: Missing unit Pro…
[Delphi程序]Borland Delphi 9 的新特性  [Delphi程序]Delphi 键盘码表
[Delphi程序]Chuck Jazdzewski的离开意味着Delphi的终结吗?  [Delphi程序]Delphi Access violations 问题的解决之道
教程录入: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……
    咸宁网络警察报警平台