📄 unrectification.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 + -