ImageEn, unit iexHelperFunctions

TIEBitmapHelper.MatchTemplate

TIEBitmapHelper.MatchTemplate


Declaration

// Single Result overload
function MatchTemplate(SearchTemplate: TIEBitmap; MatchMethod: TIEVisionTemplateMatchMethod; MatchThreshold: Double; out Rect: TRect; out Rank: Double): Boolean; overload;

// Multiple Result overload
function MatchTemplate(SearchTemplate: TIEBitmap; MatchThreshold: Double; out Rects: TIERectArray; out Ranks: TIEArrayOfDouble; RemoveBackground: Boolean = False): Integer; overload;


Description

Shortcut methods for matchTemplate and matchTemplateMulti that search the image for the locations of the template image.

Single Result Overload:
Parameter Description
SearchTemplate Template image to find. It must be not larger than the source image
MatchMethod Comparison method
MatchThreshold Minimum rank required. Range is 0 to 100%, though generally values of <90% are not good matches
Rect Bounding boxes of found objects
ranks Ranking of the found object

Multiple Result Overload:
Parameter Description
SearchTemplate Template image to find. It must be not larger than the source image
MatchThreshold Minimum rank required. Range is 0 to 100%, though generally values of <90% are not good matches
Rects Array of TRect representing the bounding boxes of found objects
Ranks Array of Double values representing ranks of found objects
RemoveBackground If the SearchTemplate does not contain an alpha channel, the background will also be matched. To avoid this, enable RemoveBackground and alpha channel will automatically be created by guessing the background of the image. Note: This will modify the image



Note:
You must add the iexHelperFunctions unit to your uses clause
Delphi/C++ 2005 or newer is required to use helper classes
You can draw the rects to a canvas using DrawRects
Template matching requires IEVision. You will need to register it before calling the method


Single Result Method Behavior

The following call:

// perform template searching
if ImageEnView1.IEBitmap.MatchTemplate( ImageEnView2.IEBitmap, ievSQDIFF, 95, rect, rank ) then
  Memo1.Lines.Add( format( 'Found: (%d,%d,%d,%d) - %d%%', [ rect.Left, rect.Top, rect.Right, rect.Bottom, trunc(rank) ]));

Is the same as calling:

// get image to search in
image := ImageEnView1.IEBitmap.GetIEVisionImage();

// get the template image to search
templ := ImageEnView2.IEBitmap.GetIEVisionImage();

// perform template searching
rect := image.matchTemplate(templ, ievSQDIFF, @rank);

if rank >= 95 then
begin
  r := IEVisionRectToTRect( rect );
  Caption := format( 'Found: (%d,%d,%d,%d) - %d%%', [ r.Left, r.Top, r.Right, r.Bottom, trunc( rank )]);
end;


Multi Result Method Behavior

The following call:

// perform template searching
count := ImageEnView1.IEBitmap.MatchTemplate( ImageEnView2.IEBitmap, 96.0, rects, ranks );
for i := 0 to count - 1 do
begin
  r := rects[i];
  Memo1.Lines.Add( format( '#%d: (%d,%d,%d,%d) - %d%%', [ i+1, r.Left, r.Top, r.Right, r.Bottom, trunc(ranks[i]) ]));
end;

Is the same as calling:

// get image to search in
image := ImageEnView1.IEBitmap.GetIEVisionImage();

// get the template image to search
templ := ImageEnView2.IEBitmap.GetIEVisionImage();

// get template mask (from alpha channel)
if ImageEnView2.IEBitmap.HasAlphaChannel() then
  templMask := ImageEnView2.IEBitmap.AlphaChannel.GetIEVisionImage(true)
else
  templMask := nil;

// perform template searching
count := image.matchTemplateMulti(templ, templMask, 96.0, rects, ranks);

for i := 0 to count - 1 do
begin
  r := IEVisionRectToTRect( rects.getRect(i) );
  Memo1.Lines.Add( format( '#%d: (%d,%d,%d,%d) - %d%%', [ i+1, r.Left, r.Top, r.Right, r.Bottom, trunc(ranks.getDouble(i)) ]));
end;


Demo

Demo  Demos\ImageEditing\EveryMethod\EveryMethod.dpr


Overload 1 Example

// Search image (ImageEnView1) for one instance of the selected image in a TImageEnMView
ImageEnView1.LayersClear( False );
idx := ImageEnMView1.SelectedImage;

// perform template searching
if ImageEnView1.IEBitmap.MatchTemplate( ImageEnMView1.GetTIEBitmap(idx), ievSQDIFF, 95, rect, rank ) then
begin
  ImageEnView1.LayersAdd( ielkText, rect );
  with TIETextLayer( ImageEnView1.CurrentLayer ) do
  begin
    BorderColor  := clRed;
    BorderWidth  := 5;
    FillColor    := clWhite;
    Opacity      := 0.66;
    Font.Height  := 24;
    Font.Color   := clRed;
    WordWrap     := False;
    Alignment    := iejCenter;
    Text         := ImageEnMView1.ImageBottomText[idx] + ' ' + FloatToStr(trunc(rank)) + '%';
    TextOverflow := ieoShrink;
  end;
end;

ImageEnMView1.ReleaseBitmap(idx);


Overload 2 Example

// Search image (ImageEnView1) for multiple instances of the selected image in a TImageEnMView
idx := ImageEnMView1.SelectedImage;
ImageEnView1.LayersClear( False );

// perform template searching
count := ImageEnView1.IEBitmap.MatchTemplate( ImageEnMView1.GetTIEBitmap(idx), 95, rects, ranks );
for i := 0 to count - 1 do
begin
  // draw a red box around the found rectangle
  ImageEnView1.LayersAdd( ielkText, IEVisionRectToTRect( rects.getRect(i) ));
  with TIETextLayer( ImageEnView1.CurrentLayer ) do
  begin
    BorderColor  := clRed;
    BorderWidth  := 2;
    Opacity      := 0.66;
    Font.Height  := 21;
    Font.Color   := clRed;
    Font.Style   := [fsBold];
    WordWrap     := False;
    Alignment    := iejCenter;
    Text         := '#' + IntToStr(i + 1) + ' ' + FloatToStr(trunc(ranks[i])) + '%';
    TextOverflow := ieoShrink;
  end;
end;

ImageEnMView1.ReleaseBitmap(idx);