Download Full functional trial ALPR processor SDK

License Plate Recognition - LPR - ANPR - SDK For Delphi & C++

The last two releases:
Active development of the license plate recognition SDK has stopped.
Before purchasing, please check whether the program meets your needs.


2017.05.05 License Plate Recognition - ALPR - library v.2.5.5
Added TRTLCriticalSection in Tvideo
2017.04.23 License Plate Recognition - ALPR - library v.2.5.4
New proprety in TVideo: CropTop
Buying Solutions
Buy from BMT Micro - eCommerce solutions
Buy Now


LPR (License Plate Recognition) is an image-processing technology used to identify vehicles by their license plates. This technology is used in various security and traffic applications, such as the access-control system.
Is a software component aimed at vehicle license plate detect and recognition. It has a very simple application programming interface that allows applications to supply a path to an image, local or remote video file and to get in return the detected license plate number and its success rate.

It can be used from Visual C++, Embarcadero C++, Embarcadero Delphi all version or Delphi 7 Integration is simple and straightforward as demonstrated in the examples supplied with the SDK.
All kinds of plate reading can be taught. Typical successful detection rates range from 90% to 100% provided that license plates are in good condition, unoccluded and the text height is larger than 20 pixels.


Some areas for application
LPR applications have a wide range of applications, which use the extracted plate number and optional images to create automated solutions for various problems.

- Access Control - a gate automatically opens for authorized members in a secured area, thus replacing or assisting the security gaurd. The events are logged on a database and could be used to search the history of events.

- Parking - the plate number is used to automatically enter pre-paid members and calculate parking fee for non-members (by comparing the exit and entry times). The optional driver face image can be used to prevent car hijacking.

- Tolling - the car number is used to calculate the travel fee in a toll-road, or used to double-check the ticket

- Marketing Tool - the car plates may be used to compile a list of frequent visitors for marketing purposes, or to build a traffic profile (such as the frequency of entry verses the hour or day).

- A number of LPR units are installed in different locations in city routes and the passing vehicle plate numbers are matched between the points. The average speed and travel time between these points can be calculated and presented in order to monitor municipal traffic loads. Additionally, the average speed may be used to issue a speeding ticket.


If you do not meet the needs of current license plate recognition component, we create a program branch or additions for your needs. If you want even more,( maybe have own developer team) then we recommend our SDK set.
If you have any other question belonging to version branches, ask with confidence!

programming language: Delphi, C, C++
Programming tools: Microsoft Visual Sutdio, C++ Builder XE2, Delphi 7 or Delphi XE family

LPR SDK

LPR SDK lifetime license price: $50 / Developer computer.
No other (client, cpu, etc...) costs!

Download Full functional trial ALPR processor SDK | Buy Now

Very easy Delphi implementation:

Use the License Plate Recognition inteface
var
  alpr: Talpr;
 iii, ii, i: integer;
  mplate: TPlate;
  BMP: TBitmap;
begin

  (*
   Create Talpr, this is License plate recognition processing object.
  *)
  alpr := Talpr.Create;

  (*
    ALPR processor license keys validation. First step after Talpr.Create
    purchase details: https://pergel.hu/langs/eng/License-Plate-Recognition/
  *)
  alpr.SetLicenseDetails(111111, 'XXXXXXXXXXXX');


  (*
    Recognize a plate tyle
    eu: All countries in European Union
    us: All Member States of the US
    au: Australia
    kr: Korean plates
    mx: Mexico plate
    br: Brazilian plate
    vn: Vietnamese plates
    vn2: Vietnamese 2 line plates
    gb: UK  plates
    sg: Singapore plates
  *)
  alpr.PlateStyle:='eu';
  
  (*
    Using multiple config options
    Eu and Us plates
  alpr.PlateStyle:='eu,us';
   *)
   
  (*
   Confidence list max count, from 1 to 100 score. The higher best confidence
  *)
  alpr.TopPlateNumbers:=5;


  (*
    Initialise alpr processor, one Talpr.Create one alpr.InitializeALPR;
  *)
  alpr.InitializeALPR;

  (*
  Alpr recognition input file,  *.jpg, *.bmp, *.png with path
  This example program processing jpeg and bmp formats.
  *)

ConfidenceIndexes.text:='';
BestRec.text:='';
Caption:=IntToStr(iii);
  alpr.AlprRecognition(CarImage);

  (*
    Plates detected count in image.
  *)
  for i := 0 to alpr.PlateResultsCount - 1 do
  begin
    Caption:=inttostr(iii);

    (*
      One plate in the list
      TPlate type stores the following information:
      Plate positions, Characters on the plate.
    *)
    mplate := alpr.PlateResults[i];

    (*
      BestPlate The best of plate Characters results
    *)
    BestRec.Lines.Add('Best: ' + mplate.BestPlate);

    (*
      confidence list, from 1 to 100 score. The higher reliability
    *)
    for ii := 0 to mplate.GetConfidencePlateCount - 1 do
    begin
      //One plate: Plate index -  confidence - score
      ConfidenceIndexes.Lines.Add('Palte index: '+IntToStr(i)+' confidence: ' + FloatToStr(mplate.GetConfidencePlate(ii).Confidence) + ' . ' + mplate.GetConfidencePlate(ii).PlateString);
    end;

    (*
      Image marking
    *)
    BMP := TBItmap.Create();
    BMP.Assign(Image1.Picture.Graphic);

    BMP.Canvas.Pen.Color := clyellow;
    BMP.Canvas.Pen.Width:=2;


    (*
    Plate coordinates in the image
    mplate.PlatePointsPos.PlatePoint"A..D"."X.Y"
    *)
    BMP.Canvas.MoveTo(mplate.PlatePointsPos.PlatePointA.X, mplate.PlatePointsPos.PlatePointA.Y);
    BMP.Canvas.LineTo(mplate.PlatePointsPos.PlatePointB.X, mplate.PlatePointsPos.PlatePointB.Y);

    BMP.Canvas.MoveTo(mplate.PlatePointsPos.PlatePointB.X, mplate.PlatePointsPos.PlatePointB.Y);
    BMP.Canvas.LineTo(mplate.PlatePointsPos.PlatePointC.X, mplate.PlatePointsPos.PlatePointC.Y);

    BMP.Canvas.MoveTo(mplate.PlatePointsPos.PlatePointC.X, mplate.PlatePointsPos.PlatePointC.Y);
    BMP.Canvas.LineTo(mplate.PlatePointsPos.PlatePointD.X, mplate.PlatePointsPos.PlatePointD.Y);

    BMP.Canvas.MoveTo(mplate.PlatePointsPos.PlatePointD.X, mplate.PlatePointsPos.PlatePointD.Y);
    BMP.Canvas.LineTo(mplate.PlatePointsPos.PlatePointA.X, mplate.PlatePointsPos.PlatePointA.Y);
    Image1.Picture.Bitmap := BMP;
    (*
      Copying multiple images on one area, it's a job waiting for you
    *)
    Image2.Canvas.CopyRect(Rect(0, 0, Image2.Width, Image2.Height), Image1.Canvas, Rect(mplate.PlatePointsPos.PlateRectanglePos.X1, mplate.PlatePointsPos.PlateRectanglePos.Y1, mplate.PlatePointsPos.PlateRectanglePos.X2, mplate.PlatePointsPos.PlateRectanglePos.Y2));
    Image2.Repaint;
    Image2.Refresh;
    Image1.Repaint;
    Image1.Refresh;
    BMP.Destroy;
  end;

  (*
    It is important, for each processing clear the plate list with ClearPlateList procedure.
  *)
  alpr.ClearPlateList;

  (*
  We finished with the operation and free the alpr
  *)
  alpr.Destroy;


Or use the dlls directly
	 	Handle := LoadLibrary('ALPR_PROCESSOR.DLL');

    ret := GetLastError();
    Memo2.Lines.Add(SysErrorMessage(ret));

    Button1.Enabled := true;
    ButtonReleaseALPRLib.Enabled := true;
    ButtonInitializeALPRLib.Enabled := false;

    (* *
      ALPR processor license keys validation. Before initialization.
    *)
    @mSetLicenceKey := GetProcAddress(Handle, 'SetLicenceKey');
    mSetLicenceKey(0,
      PAnsiChar(AnsiString('NULL')));
    // mSetLicenceKey(0,PAnsiChar(AnsiString('NULL')));

    @mInitializeALPR := GetProcAddress(Handle, 'InitializeALPR');

    (* Set country chars
      European Union: eu
      United States of America: us
      Korean:kor
      Set other countries in alpr.conf
    *)
    SALPRInit.country := PAnsiChar(AnsiString('eu'));
    (* Set plate results numbers, first the best Confidence *)
    SALPRInit.topn := 3;
    (* Initialize ALPR processor.
      Should be called only once at the beginning of the process. *)
    mInitializeALPR(@SALPRInit);

 	@mStartALPR := GetProcAddress(Handle, 'StartALPR');
    @mFreeResult := GetProcAddress(Handle, 'FreeResult');


  
         
    (* Set input image *)
    SImageSource.MyImageFile := PAnsiChar(AnsiString(CarImage));
    Memo1.Lines.Clear;

    (* Starting plate detect and recognition *)
    pd := mStartALPR(@SImageSource);

    (* Standard XML result, the plate datas with numbers and positions *)
    Memo1.Lines.Add(pd.PlateXML);

    (* last error message *)
    Memo2.Lines.Add(pd.LastError);

    (* Best characters on plate *)
    Edit1.Text := pd.PlateString;

    (* Required to release the plate data in memory *)
    mFreeResult(pd);
    


Very easy C++ implementation:
	
char * CarImage  ="..\\TestPlates\\images.jpg";
		TALPRInit SALPRInit;
	/* Set country chars
	 European Union: eu
	 United States of America: us
	 Korean:kor
	 Set other countries in alpr.conf
	 */
	SALPRInit.country = "eu";
	/* Set plate results numbers, first the best Confidence */
	SALPRInit.topn = 2;
	/**
	 ALPR processor license keys validation. Before initialization.
	 */
	SetLicenceKey(0, "NULL");
	/* Initialize ALPR processor.
	 Should be called only once at the beginning of the process. */
	InitializeALPR(&SALPRInit);		

	TImageSource SImageSource;
	TMyData *pd;

	/* Set input image */
	SImageSource.MyImageFile = CarImage;
	printf(SImageSource.MyImageFile);
	
	/* Starting plate detect and recognition */
	pd = StartALPR(&SImageSource);

	/* Standard XML result, the plate datas with numbers and positions */
	printf(pd->PlateXML);
	

	/* last error message */
	if(pd->LastError){
		printf(pd->LastError);
	}
	/* Best characters on plate */
	printf(pd->PlateString);

	/* Required to release the plate data in memory */
	FreeResult(pd);
		ReleaseALPR();
	
	


License Plate Recognition evolutionary path. Old devs






Visit Delphi Pages