最简单的一种角点检测算子,但是由于采用了非最大化抑制,效果和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为标准角点检测算子运行后的检测值。
没有相关教程
|