最簡單的一種角點檢測算子,但是由於采用了非最大化抑制,效果和OpenCV相當。
TPointInfo = record
Info: TPoint;
w: extended;
Color: TLabColor;
end;
TSinglePointInfoArray = array of TPointInfo;
procedure CornerDetect(Width, Height: longint);
var
i, j, fi, fj, sum: longint;
begin
PointCount := 0;
for i := 7 to Width - 8 do
for j := 7 to Height - 8 do begin
sum := 0;
for fi := i - 7 to i + 7 do
for fj := j - 7 to j + 7 do
sum := sum + abs(ImageGray[i, j] - ImageGray[fi, fj]);
ImagePoint[i, j] := sum div $100;
end;
{標准角點檢測算子部分}
for i := 7 to Width - 8 do
for j := 7 to Height - 8 do begin
sum := ImagePoint[i, j];
if sum > $20 then begin
WBPoint[i, j] := true;
Inc(PointCount);
for fi := i - 7 to i + 7 do begin
for fj := j - 7 to j + 7 do
if ImagePoint[fi, fj] > sum then begin
WBPoint[i, j] := false;
Dec(PointCount);
break;
end;
if not WBPoint[i, j] then break;
end;
end else
WBPoint[i, j] := false;
end;
{用非最大化抑制來抑制假角點}
setlength(CornerPoint, PointCount); fi := 0;
for i := 7 to Width - 8 do
for j := 7 to Height - 8 do
if WBPoint[i, j] then begin
CornerPoint[fi].Info.X := i;
CornerPoint[fi].Info.Y := j;
Inc(fi);
end;
{輸出為一個點序列}
end;
輸入的ImageGray為圖像的灰度描述,WBPoint為Boolean數組,ImagePoint為標准角點檢測算子運行後的檢測值。