Lazarus下图片轮廓处理
Lis 2021-2-4
处理思路: 对图像进行二值化处理后,再进行多个方向的关联对比.
Lazarus 和 Delphi的代码在处理方面,还有细微的不一样,网上你能找到的在delphi下做这方面的处理的示例程序,一般情况下是没有办法直接在Lazarus下编译通的。
图中的图片为32bits,在处理速度上相对还是可以。
Win_DSPack是Lazarus下一套非常棒的摄像头采集组件,让你可以快速方便的连接USB摄像头,进行视频流的采集工作,下次我会专门说说这个组件。
Lazarus的IDE界面几乎和Delphi7.0一样. 良好支持Linux,MAC平台。
[1]灰度处理, 当然这一步可以直接和二值化处理归在一起,我这里放一起是为了让大家更容易解理。
[2]二值化处理
[3]标注封闭区域
[4]如果把封闭区域改成和白色,就可以得到轮廓图了
[5]关键代码部分
type
Trgb24 = packed record
b,g,r,a : byte;
end;
Trgb24scanline = array [word] of Trgb24;
pTrgb24scanline = ^Trgb24scanline;
end;
//-------------------------------------------------
procedure GetFigure(Bitmap: TBitmap);
var
b0: Tbitmap;
i, j: Integer;
p1, p2, p3, p4: pTrgb24scanline;
begin
b0 := Tbitmap.Create;
b0.Assign(Bitmap);
b0.BeginUpdate();
Bitmap.BeginUpdate();
for i := 1 to b0.Height - 2 do
begin
p1 := b0.ScanLine[i - 1];
p2 := b0.ScanLine[i];
p3 := b0.ScanLine[i + 1];
p4 := Bitmap.ScanLine[i];
for j := 1 to b0.Width - 2 do
begin
if (p2^[j].b = 0) and (p2^[j].g = 0) and (p2^[j].r = 0) then
begin
if ((p2^[j-1].b = 0) and (p2^[j-1].g = 0) and (p2^[j-1].r = 0)) and
((p2^[j+1].b = 0) and (p2^[j+1].g = 0) and (p2^[j+1].r = 0)) and
((p1^[j+1].b = 0) and (p1^[j+1].g = 0) and (p1^[j+1].r = 0)) and
((p1^[j].b = 0) and (p1^[j].g = 0) and (p1^[j].r = 0)) and
((p1^[j-1].b = 0) and (p1^[j-1].g = 0) and (p1^[j-1].r = 0)) and
((p3^[j-1].b = 0) and (p3^[j-1].g = 0) and (p3^[j-1].r = 0)) and
((p3^[j].b = 0) and (p3^[j].g = 0) and (p3^[j].r = 0)) and
((p3^[j+1].b = 0) and (p3^[j+1].g = 0) and (p3^[j+1].r = 0))then
begin
p4^[j].b := 0;
p4^[j].g := 0;
p4^[j].r:= 255;
end;
end;
end;
end;
Bitmap.EndUpdate();
b0.EndUpdate();
b0.Free;
end;