⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unrectification.pas

📁 这是我用Delphi和Matlab写的一个程序
💻 PAS
字号:
unit unRectification;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls, ExtDlgs, rxToolEdit, Mask, RXCtrls,
  Grids, DBGrids, RXDBCtrl, DBCtrls, unDM, ComObj;

type
  TfmRectification = class(TForm)
    ScrollBoxP: TScrollBox;
    ImageP: TImage;
    ScrollBoxQ: TScrollBox;
    ImageQ: TImage;
    btnOpenP: TBitBtn;
    btnSaveP: TBitBtn;
    btnSaveQ: TBitBtn;
    btnOpenQ: TBitBtn;
    OpenPicDlg: TOpenPictureDialog;
    gbx: TGroupBox;
    lblP: TLabel;
    lblQ: TLabel;
    RxDBGrid: TRxDBGrid;
    DBNavigator: TDBNavigator;
    RxLabel: TRxLabel;
    gbxProcess: TGroupBox;
    btnRectify: TBitBtn;
    RxLblPcn: TRxLabel;
    procedure btnOpenPClick(Sender: TObject);
    procedure btnOpenQClick(Sender: TObject);
    procedure btnRectifyClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    Matlab: OleVariant;
    Precision: Variant;
    procedure PutImage(Img: TBitmap; mName: string);
  public
    { Public declarations }
  end;

var
  fmRectification   : TfmRectification;

implementation

{$R *.dfm}

procedure TfmRectification.btnOpenPClick(Sender: TObject);
begin
  if OpenPicDlg.Execute then
    ImageP.Picture.LoadFromFile(OpenPicDlg.FileName);
end;

procedure TfmRectification.btnOpenQClick(Sender: TObject);
begin
  if OpenPicDlg.Execute then
    ImageQ.Picture.LoadFromFile(OpenPicDlg.FileName);
end;

procedure TfmRectification.btnRectifyClick(Sender: TObject);
var
  lImgFPs, rImgFPs  : OleVariant;       //  2维动态数组
  i                 : Integer;
begin
  if not (ImageP.Picture.Bitmap.Empty or ImageQ.Picture.Bitmap.Empty or
    DM.ADOTable.IsEmpty) then
  begin
    {  将表中的数据装入数组  }
    with DM.ADOTable do
    begin
      lImgFPs := VarArrayCreate([0, RecordCount - 1, 0, 1], varDouble);  //   RecordCount-by-2 array
      rImgFPs := VarArrayCreate([0, RecordCount - 1, 0, 1], varDouble);  //   RecordCount-by-2 array

      First;
      for i := 0 to RecordCount - 1 do
      begin
        lImgFPs[i, 0] := FieldByName('LeftImgPntX').Value;
        lImgFPs[i, 1] := FieldByName('LeftImgPntY').Value;
        rImgFPs[i, 0] := FieldByName('RightImgPntX').Value;
        rImgFPs[i, 1] := FieldByName('RightImgPntY').Value;
        Next;
      end;
    end;

    {  将特征点的数组传递给Matlab自动化服务器  }
    Matlab.PutWorkspaceData('lImgFPs', 'base', lImgFPs);
    Matlab.Execute('lImgFPs(:, 3) = 1');
    Matlab.Execute('lImgFPs = lImgFPs' + ''''); //  ''''中间两个表示一个单引号
    Matlab.PutWorkspaceData('rImgFPs', 'base', rImgFPs);
    Matlab.Execute('rImgFPs(:, 3) = 1');
    Matlab.Execute('rImgFPs = rImgFPs' + '''');

    {  将图像的数组aryImg传递给Matlab自动化服务器  }
    PutImage(ImageP.Picture.Bitmap, 'lImg');
    PutImage(ImageQ.Picture.Bitmap, 'rImg');

    {  极线校正  }
    Matlab.Execute('[I0, I1, Precision] = RectifyEpipolarLine(lImg, rImg, lImgFPs, rImgFPs);');
    Matlab.GetWorkspaceData('Precision', 'base', Precision);
    RxLblPcn.Caption := RxLblPcn.Caption + VarToStr(Precision);
  end;

end;

procedure TfmRectification.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  try
    Matlab.Quit;
  except on E: Exception do
      MessageDlg(E.Message, mtError, [mbOk], 0);
  end;
end;

procedure TfmRectification.FormCreate(Sender: TObject);
var
  sCurDir           : string;
begin
  {  创建一个Matlab自动化服务器的对象实例  }
  try
    Matlab := GetActiveOleObject('Matlab.Application');
  except
    Matlab := CreateOleObject('Matlab.Application');
  end;

  Matlab.MinimizeCommandWindow;

  {  设置当前路径  }
  sCurDir := ExtractFilePath(Application.ExeName) + 'Rectification';
  sCurDir := 'path(''' + sCurDir + ''', path)';
  Matlab.Execute(sCurDir);
end;

procedure TfmRectification.PutImage(Img: TBitmap; mName: string);
var
  R, G, B           : OleVariant;       //  2维动态数组,用来存储图像
  X, Y              : Integer;          //  循环变量
  Row               : PByteArray; //  A line of pixels. 指向TByteArray的指针
begin
  with Img do
  begin
    if PixelFormat <> pf24bit then
    begin
      MessageDlg('当前图像不是24位的位图,程序将自动转换为24位的位图',
        mtWarning,
        [mbOK], 0);
      PixelFormat := pf24bit;
    end;

    R := VarArrayCreate([1, Height, 1, Width], varInteger);
    G := VarArrayCreate([1, Height, 1, Width], varInteger);
    B := VarArrayCreate([1, Height, 1, Width], varInteger);

    for Y := 0 to Height - 1 do
    begin
      Row := ScanLine[Y];               //  扫描一行

      for X := 0 to Width - 1 do
      begin
        B[Y + 1, X + 1] := Row[X * 3 + 2]; //  B
        G[Y + 1, X + 1] := Row[X * 3 + 1]; //  G
        R[Y + 1, X + 1] := Row[X * 3];  //  R
      end;
    end;

    {  将图像的数组aryImg传递给Matlab自动化服务器  }
    try
      Matlab.PutWorkspaceData('B', 'base', B);
      Matlab.PutWorkspaceData('G', 'base', G);
      Matlab.PutWorkspaceData('R', 'base', R);

      //  调整为Matlab中图像的格式,Matlab中三原色排列顺序:BGR
      Matlab.Execute(mName + '(:, :, 1) = B;'); //  整页赋值
      Matlab.Execute(mName + '(:, :, 2) = G;');
      Matlab.Execute(mName + '(:, :, 3) = R;');
      Matlab.Execute(mName + ' = uint8(' + mName + ');');
    except on E: Exception do
        MessageDlg(E.Message, mtError, [mbOk], 0);
    end;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -