-
作者: 刘留
参考文献为:
Jean-Yves Bouguet "การใช้งานเสี้ยมของ Lucas Kanade ตัวติดตามคุณสมบัติของอัลกอริทึม"
http://www.aivisoft.net/
geo.cra [ที่] gmail [dot] com
-
UNIT OPTICALFLOWLK;
ส่วนต่อประสาน
ใช้
คณิตศาสตร์, windows, sysutils, ตัวแปร, คลาส, กราฟิก, Unitypes, colorconv;
พิมพ์
topticalflowlk = คลาส
ส่วนตัว
Imageold, ImageNew: TTRIPLELONGINTARRAY;
ImageGray, DX, DY, DXY: tdoublelongintarray;
ค่าลักษณะเฉพาะ: tdoubleextendedArray;
WBPOINT: TDOUBLEBOOLEANARRAY;
ความสูง, ความกว้าง, L, Radiox, Radioy: Longint;
ขั้นตอน cornerdetect (Swidth, Sheight: Longint; คุณภาพ: ขยาย);
ขั้นตอน makepyramid (ภาพ var: ttriplelongintarray; Swidth, Sheight, SL: Longint);
สาธารณะ
เฟรม: tbitmap;
คุณสมบัติ: tsinglepointinfoarray;
FeatureCount, SupportCount: Longint;
ความเร็ว, วิทยุ: ขยาย;
ขั้นตอน init (Swidth, Sheight, SL: Longint);
ขั้นตอนการเริ่มต้น (เฟรม: TBITMAP);
ขั้นตอน CalopticalFlowlk (เฟรม: tbitmap);
Destructor ทำลาย; แทนที่;
จบ;
การดำเนินการ
ขั้นตอน topticalflowlk.cornerdetect (Swidth, Sheight: Longint; คุณภาพ: ขยาย);
วาจา
I, J, Fi, FJ: Longint;
A, B, C, Sum, Minaccept, Maxeigenvalue: ขยาย;
เริ่ม
featureCount: = 0;
-
下面采用คุณสมบัติที่ดีในการติดตาม介绍的方法
J. Shi และ C. Tomasi "คุณสมบัติที่ดีในการติดตาม", CVPR 94
-
สำหรับ i: = 1 ถึง Swidth - 2 ทำ
สำหรับ j: = 1 ถึง Sheight - 2 Do เริ่มต้น
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]);
จบ;
{求取 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;
สำหรับ i: = 2 ถึง Swidth - 3 ทำ
สำหรับ j: = 2 ถึง Sheight - 3 เริ่มต้น
A: = 0; B: = 0; C: = 0;
สำหรับ fi: = i - 1 ถึง i + 1 ทำ
สำหรับ fj: = j - 1 ถึง j + 1 เริ่มต้น
A: = A + SQR (DX [FI, FJ]);
b: = b + dxy [fi, fj];
c: = c + sqr (dy [fi, fj]);
จบ;
A: = A / 2; C: = C / 2;
ค่าลักษณะเฉพาะ [i, j]: = (a + c - sqrt ((a - c) * (a - c) + b * b));
ถ้าค่าลักษณะเฉพาะ [i, j]> maxeigenvalue จากนั้น maxeigenvalue: = eigenvalues [i, j];
จบ;
{求取矩阵
| ∑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 * คุณภาพ;
{设置最小允许阀值}
สำหรับ i: = 8 ถึง Swidth - 9 ทำ
สำหรับ j: = 8 ถึง Sheight - 9 ทำ
ถ้าค่าลักษณะเฉพาะ [i, j]> minaccept แล้วเริ่มต้น
Wbpoint [i, j]: = true;
Inc (featureCount);
จบสิ้น
Wbpoint [i, j]: = false;
สำหรับ i: = 8 ถึง Swidth - 9 ทำ
สำหรับ j: = 8 ถึง Sheight - 9 ทำ
ถ้า wbpoint [i, j] แล้วเริ่มต้น
ผลรวม: = eigenvalues [i, j];
สำหรับ fi: = i - 8 ถึง i + 8 เริ่มต้น
สำหรับ fj: = j - 8 ถึง j + 8 ทำ
ถ้า sqr (fi - i) + sqr (fj - j) <= 64 แล้ว
ถ้า (eigenvalues [fi, fj]> = sum) และ ((fi <> i) หรือ (fj <> j)) และ (wbpoint [fi, fj]) จากนั้นเริ่มต้น
Wbpoint [i, j]: = false;
ธ.ค. (featureCount);
หยุดพัก;
จบ;
ถ้าไม่ใช่ wbpoint [i, j] แล้วทำลาย;
จบ;
จบ;
{用非最大化抑制来抑制假角点}
SetLength (คุณสมบัติ, featureCount); fi: = 0;
สำหรับ i: = 8 ถึง Swidth - 9 ทำ
สำหรับ j: = 8 ถึง Sheight - 9 ทำ
ถ้า wbpoint [i, j] แล้วเริ่มต้น
คุณสมบัติ [fi] .info.x: = i;
คุณสมบัติ [fi] .info.y: = j;
คุณสมบัติ [fi] .index: = 0;
Inc (fi);
จบ;
{输出最终的点序列}
จบ;
ขั้นตอน topticalflowlk.init (Swidth, Sheight, SL: Longint);
เริ่ม
ความกว้าง: = Swidth; ความสูง: = Sheight; l: = sl;
setLength (imageold, ความกว้าง, ความสูง, l);
setLength (imageNew, ความกว้าง, ความสูง, l);
เฟรม: = tbitmap.create;
frame.width: = ความกว้าง; Frame.Height: = ความสูง;
frame.pixelformat: = pf24bit;
SetLength (ImageGray, ความกว้าง, ความสูง);
setLength (ค่าลักษณะเฉพาะ, ความกว้าง, ความสูง);
setLength (dx, ความกว้าง, ความสูง);
setLength (dy, ความกว้าง, ความสูง);
setLength (dxy, ความกว้าง, ความสูง);
SetLength (WBPoint, ความกว้าง, ความสูง);
featureCount: = 0;
จบ;
ขั้นตอน topticalflowlk.makepyramid (ภาพ VAR: TTRIPLELONGINTARRAY; Swidth, Sheight, SL: Longint);
วาจา
I, J, K, II, JJ, Nwidth, Nheight, Owidth, Oheight: Longint;
เริ่ม
{生成金字塔图像}
OWIDTH: = Swidth; OHEIGHT: = Sheight;
สำหรับ K: = 1 ถึง SL - 1 เริ่มต้น
nwidth: = (OWIDTH + 1) SHR 1; nheight: = (oheight + 1) SHR 1;
สำหรับ i: = 1 ถึง nwidth - 2 เริ่มต้น
II: = ฉัน shl 1;
สำหรับ j: = 1 ถึง nheight - 2 เริ่มต้น
JJ: = J shl 1;
รูปภาพ [i, j, k]: = (รูปภาพ [ii, jj, k - 1] shl 2 +
รูปภาพ [II - 1, JJ, K - 1] SHL 1 + รูปภาพ [II + 1, JJ, K - 1] SHL 1 + รูปภาพ [II, JJ - 1, K - 1] SHL 1 + รูปภาพ [II, JJ + 1, k - 1] shl 1 +
รูปภาพ [II - 1, JJ - 1, K - 1] + รูปภาพ [II + 1, JJ - 1, K - 1] + รูปภาพ [II - 1, JJ + 1, K - 1] + ภาพ [II + 1 , JJ + 1, K - 1]) SHR 4;
{高斯原则, shl 右移位, Shr 左移位}
จบ;
จบ;
สำหรับ i: = 1 ถึง nwidth - 2 เริ่มต้น
II: = ฉัน shl 1;
รูปภาพ [i, 0, k]: = (รูปภาพ [ii, 0, k - 1] shl 2 +
รูปภาพ [II - 1, 0, K - 1] SHL 1 + รูปภาพ [II + 1, 0, K - 1] SHL 1 + ภาพ [II, 0, K - 1] SHL 1 + ภาพ [II, 1, K - 1] shl 1 +
รูปภาพ [II - 1, 0, K - 1] + รูปภาพ [II + 1, 0, K - 1] + รูปภาพ [II - 1, 1, K - 1] + ภาพ [II + 1, 1, K - 1 ]) SHR 4;
รูปภาพ [i, nheight - 1, k]: = (ภาพ [II, oheight - 1, k - 1] shl 2 +
รูปภาพ [II - 1, oheight - 1, k - 1] shl 1 + รูปภาพ [II + 1, oheight - 1, k - 1] shl 1 + รูปภาพ [II, oheight - 2, k - 1] shl 1 + รูปภาพ [II, oheight - 1, k - 1] shl 1 +
รูปภาพ [II - 1, oheight - 2, k - 1] + รูปภาพ [II + 1, oheight - 2, k - 1] + ภาพ [II - 1, oheight - 1, k - 1] + ภาพ [II + 1 , oheight - 1, k - 1]) SHR 4;
จบ;
{处理上下边}
สำหรับ j: = 1 ถึง nheight - 2 เริ่มต้น
JJ: = J shl 1;
รูปภาพ [0, j, k]: = (รูปภาพ [0, jj, k - 1] shl 2 +
รูปภาพ [0, jj, k - 1] shl 1 + รูปภาพ [1, jj, k - 1] shl 1 + รูปภาพ [0, jj - 1, k - 1] shl 1 + รูปภาพ [0, jj + 1, k - 1] shl 1 +
รูปภาพ [0, JJ - 1, K - 1] + รูปภาพ [1, JJ - 1, K - 1] + ภาพ [0, JJ + 1, K - 1] + ภาพ [1, JJ + 1, K - 1 ]) SHR 4;
รูปภาพ [nwidth - 1, j, k]: = (รูปภาพ [OWIDTH - 1, JJ, K - 1] SHL 2 +
รูปภาพ [OWIDTH - 2, JJ, K - 1] SHL 1 + รูปภาพ [OWIDTH - 1, JJ, K - 1] SHL 1 + รูปภาพ [OWIDTH - 1, JJ - 1, K - 1] SHL 1 + รูปภาพ [OWIDTH - 1, jj + 1, k - 1] shl 1 +
รูปภาพ [OWIDTH - 2, JJ - 1, K - 1] + รูปภาพ [OWIDTH - 1, JJ - 1, K - 1] + รูปภาพ [OWIDTH - 2, JJ + 1, K - 1] + ภาพ [OWIDTH - 1 , JJ + 1, K - 1]) SHR 4;
จบ;
{处理左右边}
รูปภาพ [0, 0, k]: = (รูปภาพ [0, 0, k - 1] shl 2 +
รูปภาพ [0, 0, k - 1] shl 1 + รูปภาพ [1, 0, k - 1] shl 1 + รูปภาพ [0, 0, k - 1] shl 1 + รูปภาพ [0, 1, k - 1] shl 1 +
รูปภาพ [0, 0, K - 1] + รูปภาพ [1, 0, K - 1] + รูปภาพ [0, 1, K - 1] + ภาพ [1, 1, K - 1]) SHR 4;
{处理左上点}
รูปภาพ [0, nheight - 1, k]: = (ภาพ [0, oheight - 1, k - 1] shl 2 +
รูปภาพ [0, oheight - 1, k - 1] shl 1 + รูปภาพ [1, oheight - 1, k - 1] shl 1 + รูปภาพ [0, oheight - 2, k - 1] shl 1 + ภาพ [0, oheight - 1, k - 1] shl 1 +
รูปภาพ [0, oheight - 2, k - 1] + รูปภาพ [1, oheight - 2, k - 1] + ภาพ [0, oheight - 1, k - 1] + ภาพ [1, oheight - 1, k - 1 ]) SHR 4;
{处理左下点}
รูปภาพ [nwidth - 1, 0, k]: = (ภาพ [OWIDTH - 1, 0, K - 1] SHL 2 +
รูปภาพ [OWIDTH - 2, OHEIGHT - 1, K - 1] SHL 1 + รูปภาพ [OWIDTH - 1, OHEIGHT - 1, K - 1] SHL 1 + ภาพ [OWIDTH - 1, OHEIGHT - 1, K - 1] SHL 1 + รูปภาพ [OWIDTH - 1, OHEIGHT - 1, K - 1] SHL 1 +
รูปภาพ [OWIDTH - 2, OHEIGHT - 1, K - 1] + Images [OWIDTH - 1, OHEIGHT - 1, K - 1] + ภาพ [OWIDTH - 2, OHEIGHT - 1, K - 1] + ภาพ [OWIDTH - 1 , oheight - 1, k - 1]) SHR 4;
{处理右上点}
รูปภาพ [nwidth - 1, nheight - 1, k]: = (ภาพ [owidth - 1, oheight - 1, k - 1] shl 2 +
รูปภาพ [OWIDTH - 2, OHEIGHT - 1, K - 1] SHL 1 + รูปภาพ [OWIDTH - 1, OHEIGHT - 1, K - 1] SHL 1 + ภาพ [OWIDTH - 1, OHEIGHT - 2, K - 1] SHL 1 + รูปภาพ [OWIDTH - 1, OHEIGHT - 1, K - 1] SHL 1 +
รูปภาพ [OWIDTH - 2, OHEIGHT - 2, K - 1] + รูปภาพ [OWIDTH - 1, OHEIGHT - 2, K - 1] + ภาพ [OWIDTH - 2, OHEIGHT - 1, K - 1] + ภาพ [OWIDTH - 1 , oheight - 1, k - 1]) SHR 4;
{处理右下点}
จบ;
จบ;
ขั้นตอน topticalflowlk.initfeatures (เฟรม: tbitmap);
วาจา
I, J: Longint;
บรรทัด: prgbtriple;
เริ่ม
SetStRetchBltMode (frame.canvas.handle, stretch_halftone);
stretchblt (frame.canvas.handle, 0, 0, ความกว้าง, ความสูง, เฟรม. canvas.handle, 0, 0, frames.width, frames.height, srccopy);
สำหรับ i: = 0 ถึงความสูง - 1 เริ่มต้น
บรรทัด: = frame.scanline [i];
สำหรับ j: = 0 ถึงความกว้าง - 1 เริ่มต้น
Imageold [j, i, 0]: = (บรรทัด^.rgbtblue * 11 + บรรทัด^.rgbtgreen * 59 + บรรทัด^.rgbtred * 30) Div 100;
ImageGray [j, i]: = imageold [j, i, 0];
Inc (บรรทัด);
จบ;
จบ;
{ime imageold [x, y, 0]}
makepyramid (imageold, ความกว้าง, ความสูง, l);
{生成金字塔图像}
cornerdetect (ความกว้าง, ความสูง, 0.01);
{进行强角点检测}
จบ;
ขั้นตอน topticalflowlk.calopticalflowlk (เฟรม: tbitmap);
วาจา
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: ขยาย;
ix, iy: tdoubleextendedArray;
บรรทัด: prgbtriple;
เปลี่ยน: บูลีน;
เริ่ม
SetStRetchBltMode (frame.canvas.handle, stretch_halftone);
stretchblt (frame.canvas.handle, 0, 0, ความกว้าง, ความสูง, เฟรม. canvas.handle, 0, 0, frames.width, frames.height, srccopy);
สำหรับ i: = 0 ถึงความสูง - 1 เริ่มต้น
บรรทัด: = frame.scanline [i];
สำหรับ j: = 0 ถึงความกว้าง - 1 เริ่มต้น
ImageNew [j, i, 0]: = (บรรทัด^.rgbtBlue * 11 + บรรทัด^.rgbtgreen * 59 + บรรทัด^.rgbtred * 30) Div 100;
Inc (บรรทัด);
จบ;
จบ;
{初始化金字塔图像第一层 imageNew [x, y, 0]}
makepyramid (imageNew, ความกว้าง, ความสูง, l);
{生成金字塔图像}
SetLength (ix, 15, 15); SetLength (iy, 15, 15);
{申请差分图像临时数组}
สำหรับ m: = 0 ถึง featureCount - 1 เริ่มต้น
{算法细节见:
Jean-Yves Bouguet "การใช้งานเสี้ยมของ Lucas Kanade Feature Tracker คำอธิบายของอัลกอริทึม"}
gx: = 0; gy: = 0;
สำหรับ ll: = l - 1 downto 0 เริ่มต้น
px: = คุณสมบัติ [m] .info.x shl ll;
py: = คุณสมบัติ [m] .info.y shr ll;
{对应当前金字塔图像的 u 点: u [l]: = u/2^l}
nwidth: = width shl ll; nheight: = ความสูง shl ll;
A: = 0; B: = 0; C: = 0;
สำหรับ i: = สูงสุด (px - 7, 1) ถึงขั้นต่ำ (px + 7, nwidth - 2) ทำ
สำหรับ j: = สูงสุด (py - 7, 1) ถึงขั้นต่ำ (py + 7, nheight - 2) เริ่มต้น
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];
จบ;
{计算 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;
ถ้า abs (d)> 1e-8 แล้วเริ่มต้น
สำหรับ k: = 1 ถึง 10 เริ่มต้น
E: = 0; f: = 0;
สำหรับ i: = สูงสุด (px - 7, 1) ถึงขั้นต่ำ (px + 7, nwidth - 2) ทำ
สำหรับ j: = สูงสุด (py - 7, 1) ถึงขั้นต่ำ (py + 7, nheight - 2) เริ่มต้น
fi: = i - px + 7; fj: = j - py + 7;
kx: = i + gx + dx; KY: = J + GY + DY;
ถ้า kx <0 ดังนั้น kx: = 0; ถ้า kx> nwidth - 1 kx: = nwidth - 1;
ถ้า ky <0 แล้ว ky: = 0; ถ้า ky> nheight - 1 แล้ว ky: = nheight - 1;
ik: = imageold [i, j, ll] - imageNew [kx, ky, ll];
e: = e + ik * ix [fi, fj];
f: = f + ik * iy [fi, fj];
จบ;
{计算 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}
จบ;
จบ;
gx: = (gx + dx) shl 1; gy: = (gy + dy) shl 1;
{得到下一层的预测运动向量 g}
จบ;
gx: = gx div 2; gy: = gy div 2;
px: = px + gx; py: = py + gy;
คุณสมบัติ [m] .info.x: = px;
คุณสมบัติ [m] .info.y: = py;
คุณสมบัติ [m] .vector.x: = gx;
คุณสมบัติ [m] .vector.y: = gy;
ถ้า (px> ความกว้าง - 1) หรือ (px <0) หรือ (py> ความสูง - 1) หรือ (py <0) จากนั้นคุณสมบัติ [m] .index: = 1;
{失去特征点处理}
จบ;
สำหรับ k: = 0 ถึง l - 1 เริ่มต้น
nwidth: = width shr k; NHEIGHT: = ความสูง Shr K;
สำหรับ i: = 0 ถึง nwidth - 1 ทำ
สำหรับ j: = 0 ถึง nheight - 1 ทำ
Imageold [i, j, k]: = imagenew [i, j, k];
จบ;
{复制 j 到 i}
ทำซ้ำ
เปลี่ยน: = เท็จ;
สำหรับ i: = 0 ถึง featureCount - 1 เริ่มต้น
ถ้าคุณสมบัติ [i] .index = 1 แล้ว
สำหรับ j: = i + 1 ถึง featureCount - 1 เริ่มต้น
คุณสมบัติ [j - 1]: = คุณสมบัติ [j];
เปลี่ยน: = จริง;
จบ;
หากเปลี่ยนแปลงแล้วทำลาย;
จบ;
หากมีการเปลี่ยนแปลงแล้วธันวาคม (featureCount);
จนกว่าจะไม่เปลี่ยนแปลง
SetLength (คุณสมบัติ, featureCount);
{删除失去的特征点}
ความเร็ว: = 0; วิทยุ: = 0; Radiox: = 0; Radioy: = 0;
ถ้า featureCount> 0 แล้วเริ่มต้น
SupportCount: = 0;
สำหรับ i: = 0 ถึง featureCount - 1 ทำ
if (คุณสมบัติ [i] .vector.x <> 0) และ (คุณสมบัติ [i] .vector.y <> 0) จากนั้นเริ่มต้น
Radiox: = Radiox + คุณสมบัติ [i] .vector.x;
radioy: = radioy + คุณสมบัติ [i] .vector.y;
ความเร็ว: = speed + sqrt (sqr (คุณสมบัติ [i] .vector.x) + sqr (คุณสมบัติ [i] .vector.y));
Inc (SupportCount);
จบ;
หาก SupportCount> 0 แล้วเริ่มต้น
ความเร็ว: = Speed / SupportCount; //*0.0352778;
วิทยุ: = Arctan2 (Radioy, Radiox);
จบ;
จบ;
{计算平均速度和整体方向}
frame.canvas.pen.style: = pssolid;
frame.canvas.pen.width: = 1;
frame.canvas.pen.color: = cllime;
frame.canvas.brush.style: = bsclear;
สำหรับ i: = 0 ถึง featureCount - 1 ทำ
frame.canvas.ellipse (คุณสมบัติ [i] .info.x - 4, คุณสมบัติ [i] .info.y - 4, คุณสมบัติ [i] .info.x + 4, คุณสมบัติ [i] .info.y + 4) ;
{用绿圈标识特征点}
frame.canvas.pen.color: = clyellow;
สำหรับ i: = 0 ถึง featureCount - 1 เริ่มต้น
frame.canvas.moveto (คุณสมบัติ [i] .info.x - คุณสมบัติ [i] .vector.x, คุณสมบัติ [i] .info.y - คุณสมบัติ [i] .vector.y);
frame.canvas.lineto (คุณสมบัติ [i] .info.x, คุณสมบัติ [i] .info.y);
จบ;
{用黄色线条表示运动向量}
if (supportCount> 0) และ (ความเร็ว> 3) จากนั้นเริ่มต้น
frame.canvas.pen.style: = pssolid;
frame.canvas.pen.width: = 6;
frame.canvas.pen.color: = clwhite;
frame.canvas.ellipse (ความกว้าง Div 2 - 100, ความสูง Div 2 - 100, ความกว้าง Div 2 + 100, ความสูง Div 2 + 100);
frame.canvas.moveto (ความกว้าง Div 2, ความสูง Div 2);
frame.canvas.pen.color: = clblue;
frame.canvas.lineto (ความกว้าง Div 2 + trunc (90 * cos (วิทยุ)), ความสูง div 2 + trunc (90 * sin (วิทยุ)));
frame.canvas.pen.style: = psclear;
frame.canvas.brush.style: = bssolid;
frame.canvas.brush.color: = clred;
frame.canvas.ellipse (ความกว้าง Div 2 + trunc (90 * cos (วิทยุ)) - 8, ความสูง div 2 + trunc (90 * sin (วิทยุ)) - 8, ความกว้าง div 2 + trunc (90 * cos (วิทยุ) ) + 8, ความสูง div 2 + trunc (90 * sin (วิทยุ)) + 8);
จบ;
จบ;
destructor topticalflowlk.destroy;
เริ่ม
SetLength (Imageold, 0);
SetLength (ImageNew, 0);
SetLength (ImageGray, 0);
SetLength (ค่าลักษณะเฉพาะ, 0);
setLength (dx, 0);
setLength (dy, 0);
setLength (dxy, 0);
SetLength (WBPoint, 0);
สืบทอด;
จบ;
จบ.