Jump to content
Bixby Sayz

Find boxes in TPA

Recommended Posts

Link to comment
Share on other sites

If SCARExt is an option to use, then this function will work on your image, it will extract the two boxes you have there (but can do much more then just that).

 

I took the liberty to modify your image, with additional shapes, and then separating am in to boxes as well with this function:

mcql4g.jpg

 

The code I used:

program New;
{$I SCARExt/SCARExt.scar}

var
 bmp:TSCARBitmap;

function GetBitmapColorTPA(bmp: TSCARBitmap; Color, Tol: Integer): TPointArray;
var
 client: TSCARClient;
begin
 client := SetClient(TSCARBitmapClient.Create(bmp));
 FindColorTolEx(Result, Color, 0, 0, (bmp.Width - 1), (bmp.Height - 1),Tol);
 SetClient(client).Free;
end; 


function TPAFindBoxes(TPA:TPointArray): TBoxArray;
var
 i: Integer;
 ATPA:T2DPointArray;
begin
 TPA := XT_UniteTPA(XT_InvertTPA(TPA), XT_TPABorder(TPA), False);
 ATPA := XT_ClusterTPA(TPA,1,False);
 SetLength(Result, High(ATPA));
 for i:=1 to High(ATPA) do
 begin
   Result[i-1] := TPABounds(ATPA[i]);
   ExpandBox(Result[i-1], 1);
 end;  
end;



var
 TPA:TPointArray;
 i:Integer;
 TBA: TBoxArray;
begin
 Bmp := TSCARBitmap.Create('deNrt3FFuHEkOBFDrwr6jT9b+NQSo0WZmspLke' +
   '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' +
   'Q8=');


 TPA := GetBitmapColorTPA(bmp, clWhite, 1);    
 TBA := TPAFindBoxes(TPA); 
 //Display am
 for i:=0 to High(TBA) do
 begin
   TPA := [Point(TBA[i].x1, TBA[i].y1), Point(TBA[i].x2, TBA[i].y1), 
           Point(TBA[i].x2, TBA[i].y2), Point(TBA[i].x1, TBA[i].y2)];
   bmp.SetPixels(XT_ConnectTPA(TPA), Random($FFFFFF));
 end;

 DebugBitmap(bmp); 
 Bmp.Free;
end.

 

It can be done without SCARExt, using FloodFill on the generated bitmaps background (with a color that is not black), and then extracting each black pixel, and splitting. That will require you to also make the bitmap 1px larger in each side (ensure floodfill start-point, and that is get around your squares).

 

Edit, written with pure SCAR, but this wont work as well, as SCARs FloodFill is eightway (so it seems), and doesn't allow us to set it to fourway, so the triangle in my example wont get extracted, it does leak... But it will work fine for your simple example (also not sure how SplitTPAEx acts in this case - Untested).

function TPAFindBoxes(TPA:TPointArray): TBoxArray;
var
 i: Integer;
 bmp:TSCARBitmap;
 B: TBox;
 ATPA:T2DPointArray;
begin
 bmp := TSCARBitmap.Create(''); 
 B := TPABounds(TPA);
 ExpandBox(B,1);
 bmp.SetSize(B.x2-B.x1+1, B.y2-B.y1+1); 
 OffsetTPA(TPA, -B.x1, -B.y1); 
 bmp.SetPixels(TPA, clRed);
 FloodFill(bmp,0,0,255);
 TPA := GetBitmapColorTPA(bmp, clBlack, 1);  
 ATPA := SplitTPAEx(TPA,1,1);
 SetLength(Result, Length(ATPA));
 for i:=0 to High(ATPA) do
 begin
   Result[i] := TPABounds(ATPA[i]);
   ExpandBox(Result[i],1);
   OffsetBox(Result[i], B.x1, B.y1);
 end;  
 Bmp.Free;
end;

Edited by slacky
Fixed the function (found a bug).
Link to comment
Share on other sites

If SCARExt is an option to use, then this function will work on your image, it will extract the two boxes you have there (but can do much more then just that).

 

I took the liberty to modify your image, with additional shapes, and then separating am in to boxes as well with this function:

mcql4g.jpg

 

The code I used:

program New;
{$I SCARExt/SCARExt.scar}

var
 bmp:TSCARBitmap;

function GetBitmapColorTPA(bmp: TSCARBitmap; Color, Tol: Integer): TPointArray;
var
 client: TSCARClient;
begin
 client := SetClient(TSCARBitmapClient.Create(bmp));
 FindColorTolEx(Result, Color, 0, 0, (bmp.Width - 1), (bmp.Height - 1),Tol);
 SetClient(client).Free;
end; 


function TPAFindBoxes(TPA:TPointArray): TBoxArray;
var
 i: Integer;
 bmp:TSCARBitmap;
 B: TBox;
 ATPA:T2DPointArray;
begin
 bmp := TSCARBitmap.Create(''); 
 B := TPABounds(TPA);
 bmp.SetSize(B.x2 - B.x1 + 1, B.y2 - B.y1 + 1); 
 OffsetTPA(TPA, -B.x1, -B.y1);
 bmp.SetPixels(XT_FloodFillPolygon(TPA, True), clBlue);
 bmp.SetPixels(TPA, clRed);
 TPA := GetBitmapColorTPA(bmp, clBlue, 1);
 ATPA := XT_ClusterTPA(TPA,1,False);
 SetLength(Result, Length(ATPA));
 for i:=0 to High(ATPA) do
 begin
   Result[i] := TPABounds(ATPA[i]);
   ExpandBox(Result[i],1);
   OffsetBox(Result[i], B.x1, B.y1);
 end;  
 Bmp.Free;
end;



var
 TPA:TPointArray;
 i:Integer;
 TBA: TBoxArray;
begin
 Bmp := TSCARBitmap.Create('deNrt3FFuHEkOBFDrwr6jT9b+NQSo0WZmspLke' +
   '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' +
   'Q8=');


 TPA := GetBitmapColorTPA(bmp, clWhite, 1);    
 TBA := TPAFindBoxes(TPA); 
 //Display am
 for i:=0 to High(TBA) do
 begin
   TPA := [Point(TBA[i].x1, TBA[i].y1), Point(TBA[i].x2, TBA[i].y1), 
           Point(TBA[i].x2, TBA[i].y2), Point(TBA[i].x1, TBA[i].y2)];
   bmp.SetPixels(XT_ConnectTPA(TPA), Random($FFFFFF));
 end;

 DebugBitmap(bmp); 
 Bmp.Free;
end.

 

It can be done without SCARExt, using FloodFill on the generated bitmaps background (with a color that is not black), and then extracting each black pixel, and splitting. That will requres you to also make the bitmap 1px larger in each side (ensure floodfill start-point, and that is get around your squares).

 

Edit, written with pure SCAR, but this wont work as well, as SCARs FloodFill is eightway, and doesnt allow us to set it to fourway, so the triangle in my example wont get extracted, cuz it will leak... But it will work fine for your simple example.

function TPAFindBoxes(TPA:TPointArray): TBoxArray;
var
 i: Integer;
 bmp:TSCARBitmap;
 B: TBox;
 ATPA:T2DPointArray;
begin
 bmp := TSCARBitmap.Create(''); 
 B := TPABounds(TPA);
 ExpandBox(B,1);
 bmp.SetSize(B.x2-B.x1+1, B.y2-B.y1+1); 
 OffsetTPA(TPA, -B.x1, -B.y1); 
 bmp.SetPixels(TPA, clRed);
 FloodFill(bmp,0,0,255);
 TPA := GetBitmapColorTPA(bmp, clBlack, 1);  
 ATPA := SplitTPAEx(TPA,1,1);
 SetLength(Result, Length(ATPA));
 for i:=0 to High(ATPA) do
 begin
   Result[i] := TPABounds(ATPA[i]);
   ExpandBox(Result[i],1);
   OffsetBox(Result[i], B.x1, B.y1);
 end;  
 Bmp.Free;
end;

slacky for the rescue! :P Very interesting solution mate, which works like charm.

 

I don't see why it would be any problem to have SCARExt as an option..

Link to comment
Share on other sites

Nice!!! I'll have a look at this later after I have time to digest it.

 

Edit: GetBitmapColorTPA ???

Edit2: Nvm

  CurClient := SetClient(TSCARBitmapClient.Create(Bmp));
 with GetClient.ImageArea do
   FindColorEx(Tpa, clBlack, X1, Y1, X2, Y2);
 SetClient(CurClient).Free();

 

Found a version of GetBitmapColorTPA by Janilabo on PasteBin but it only took 2 params, not 3. Not sure what that 3rd param is supposed to be.

http://pastebin.com/bjtkReJn

Edited by Bixby Sayz
Link to comment
Share on other sites

Nice!!! I'll have a look at this later after I have time to digest it.

 

Edit: GetBitmapColorTPA ???

Edit2: Nvm

  CurClient := SetClient(TSCARBitmapClient.Create(Bmp));
 with GetClient.ImageArea do
   FindColorEx(Tpa, clBlack, X1, Y1, X2, Y2);
 SetClient(CurClient).Free();

 

Found a version of GetBitmapColorTPA by Janilabo on PasteBin but it only took 2 params, not 3. Not sure what that 3rd param is supposed to be.

[Pascal] {$loadlib pumbaa.dll} const DIST = 7.5; function GetBitmapColorTPA(bmp: - Pastebin.com

slacky added support for tolerance to hes version.

So, the 3rd parameter (Tol) is tolerance, that way it can collect pixels with similar colors aswell. :)

 

That one by me in pastebin is Simba-based, so it wont work with SCAR. :(

SCAR version with 2 parameters would be:

 

function GetBitmapColorTPA(bmp: TSCARBitmap; color: Integer): TPointArray;
var
 client: TSCARClient;
begin
 client := SetClient(TSCARBitmapClient.Create(bmp));
 FindColorEx(Result, color, 0, 0, (bmp.Width - 1), (bmp.Height - 1));
 SetClient(client).Free;
end;

Edited by Janilabo
Link to comment
Share on other sites

Nice!!! I'll have a look at this later after I have time to digest it.

 

Edit: GetBitmapColorTPA ???

Edit2: Nvm

  CurClient := SetClient(TSCARBitmapClient.Create(Bmp));
 with GetClient.ImageArea do
   FindColorEx(Tpa, clBlack, X1, Y1, X2, Y2);
 SetClient(CurClient).Free();

 

Found a version of GetBitmapColorTPA by Janilabo on PasteBin but it only took 2 params, not 3. Not sure what that 3rd param is supposed to be.

[Pascal] {$loadlib pumbaa.dll} const DIST = 7.5; function GetBitmapColorTPA(bmp: - Pastebin.com

There is no need to use "GetBitmapColorTPA", it was simply added for the sake of the example... All you need is the function "TPAFindBoxes", and to give the function the TPA that you gathered.

Edited by slacky
Link to comment
Share on other sites

Works like a treat with a few caveats.

 

If there are any extra pixels scattered around you get a gazillion boxes. Can work around this with a bit of filtering. More serious I've noticed that the boxes can sometimes have small gaps of a couple pixels in them. This only works if the boxes are solid with no gaps.

 

I'll have to approach this a different way and give up on the boxes. Or simply give up on it. This is a 1/50 chance special case (maybe less). The world won't end if not handled those few times.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
  • Create New...