FreeFlow

Ultimate Number Plate Recognition Engine
with Software Developement Kit

Carmen® FreeFlow: ANPR Brilliance

Revolutionize your project development with Carmen® FreeFlow, the cutting-edge Number Plate Recognition Engine and Software Development Kit (SDK). Carmen® FreeFlow empowers your applications to seamlessly capture and process license plate information, opening new possibilities for data-driven solutions. Whether your project requires swift recognition of fast-moving vehicles or precise identification of stationary ones, Carmen® FreeFlow effortlessly extracts essential data, including license plate numbers, vehicle attributes, and GPS coordinates.

Highlighted Features

Tried &Tested

Used in over 100,000 systems worldwide

Worldwide ANPR & MMR

Worldwide recognition of vehicle plates, make, model, and color with a single integration.

Regular Engine Updates

Four updates released per year.

Scalability

From small through medium, to large and complex systems.

Video & Image Processing

SDK supports either data input

Support of major OP systems

Runs on Windows and Linux

Sample Codes

				
					 #include "gxsdldr.c"
    #include "cmanpr.h"
    
    // If an error occurred it displays the error and terminates the program
    void term_if_err(int st) {
        int err_code;
        wchar_t err_str[256];
    
        if(st) return;		// No error occurred
        // Displays error code and description
        err_str[(sizeof(err_str)/sizeof(wchar_t))-1] = 0;
        gx_geterror(&err_code, err_str, (sizeof(err_str)/sizeof(wchar_t))-1);
        fprintf(stderr, "GX error (%x) occurred: %ls\n", err_code, err_str);
        // Terminates the program
        exit(1);
    }
    
    int main(void) {
        struct gxHANDLE anprhandle, imagehandle;
        struct gxIMAGE *image;
        struct cmNP *anprresult;
        int st;
        
        // Opens the ANPR module with EUR region
        st = gx_openmodule(&anprhandle, L"cmanpr", L"eur");
        term_if_err(st);
        
        // Opens the image module, allocates the image structure and load the image
        st = gx_openmodule(&imagehandle, L"gximage", L"default");
        term_if_err(st);
        st = gx_allocimage(imagehandle, &image);
        term_if_err(st);
        st = gx_loadimage(imagehandle, image, L"image.jpg", GX_UNDEF);
        term_if_err(st);
        
        // Finds the first license plate
        anprresult = 0;
        st = cm_findfirst(anprhandle, image, &anprresult);
        term_if_err(st);
        
        if(anprresult) {
            char countryCode[256]="";
            // Get short country code
            st = cm_getcountrycode(anprhandle,anprresult->type,(int)CCT_COUNTRY_SHORT,countryCode,sizeof(countryCode));
            term_if_err(st);
            // Displays the result, country code and type
            printf("Plate text: %s\n", anprresult->text);
            printf("Country code: %s\n", countryCode[0] ? countryCode : "No plate type");
            printf("Type: %i\n", anprresult->type);
    
            // Frees up the result
            st = gx_globalfree(anprresult);
            term_if_err(st);
        } else {
            printf("No license plate found\n");
        }
        
        // Frees up the resources
        st = gx_unrefimage(imagehandle, image);
        term_if_err(st);
        st = gx_unrefhandle(&imagehandle);
        term_if_err(st);
        st = gx_unrefhandle(&anprhandle);
        term_if_err(st);
    
        return 0;
    }
    
				
			
				
					    #include "gxsdldr.cpp"
    #include "cmanpr.h"
    
    int main() {
        try {
            // Creates the ANPR object with EUR region
            cm::cmAnpr anpr("eur");
    
            // Creates the image object and load the image
            gxImage image;
            image.Load("image.jpg");
    
            // Finds the first license plate
            if(anpr.FindFirst(image)) {
                // Get short country code
                gxOutStr countryCode = anpr.GetCountryCode(anpr.GetType(),(int)cm::CCT_COUNTRY_SHORT);
                std::wstring wCountryCode = countryCode.empty() ? L"No plate type" : countryCode;
    
                // Displays the result, country code and type
                std::wcout << L"Plate text: " << anpr.GetText() << std::endl;
                std::wcout << L"Country code: " << wCountryCode << std::endl;
                std::wcout << L"Type: " << anpr.GetType() << std::endl;
            } else {
                std::wcout << L"No license plate found" << std::endl;
            }
    
        } catch(gxError &e) {
            std::wcerr << L"GX error (" << e.GetErrorCode() << ") occurred: " <<  e.GetErrorString() << std::endl;
            return 1;
        }
    
        return 0;
    }
    
				
			
				
					 using System;
    using gx;
    using cm;
    
    namespace carmen
    {
        class MainClass
        {
            public static void Main(string[] args)
            {
                try {
                    // Creates the ANPR object with EUR region
                    cmAnpr anpr = new cmAnpr("eur");
    
                    // Creates the image object and load the image
                    gxImage image = new gxImage();
                    image.Load("image.jpg");
    
                    // Finds the first license plate
                    if (anpr.FindFirst(image)) {
                        // Get short country code
                        String countryCode = anpr.GetCountryCode(anpr.GetType(), (int)CC_TYPE.CCT_COUNTRY_SHORT);
                        countryCode = countryCode.Length > 0 ? countryCode : "No plate type";
    
                        //Displays the result, country code and type
                        Console.WriteLine("Plate text: {0}", anpr.GetText());
                        Console.WriteLine("Country code: {0}", countryCode);
                        Console.WriteLine("Type: {0}", anpr.GetType());
                    } else {
                        Console.WriteLine("No license plate found");
                    }
                } catch(gxException) {
                    Console.Error.WriteLine("GX error (" + gxSystem.GetErrorCode() + ") occured: " + gxSystem.GetErrorString());
                    Environment.Exit(1);
                }
            }
        }
    }
    
				
			
				
					import com.adaptiverecognition.gx.*;
    import com.adaptiverecognition.cm.*;
    
    public class cmanpr {
    
        static {
            try {
                System.loadLibrary("jgx");
                System.loadLibrary("jcmanpr");
            } catch(UnsatisfiedLinkError e) {
                System.err.println("Native code library failed to load." + e);
                System.exit(1);
            }
        }
    
        public static void main(String argv[]) {
            try {
                // Creates the ANPR object with EUR region
                cmAnpr anpr = new cmAnpr("eur");
    
                // Creates the image object and load the image
                gxImage image = new gxImage();
                image.Load("image.jpg");
                
                // Finds the first license plate
                if(anpr.FindFirst(image)) {
                    // Get short country code
                    String countryCode = anpr.GetCountryCode(anpr.GetType(),jcmanprConstants.CCT_COUNTRY_SHORT);
                    countryCode = countryCode.length()>0 ? countryCode : "No plate type";
    
                    // Displays the result, country code and type
                    System.out.println("Plate text: " + anpr.GetText());
                    System.out.println("Country code: " + countryCode);
                    System.out.println("Type: " + anpr.GetType());
                } else {
                    System.out.println("No license plate found");
                }			
    
                // Frees up resources
                anpr.delete();
                image.delete();
            } catch(RuntimeException e) {
                System.err.println("GX error (" + String.format("0x%08x",gxSystem.GetErrorCode()) + ") occured: " + gxSystem.GetErrorString());
                System.exit(1);
            }
        }
    }
    
				
			
				
					Imports System
    Imports gx
    Imports cm
    
    Module Main
        Sub Main()
            Try
                ' Creates the ANPR object with EUR region
                Dim anpr As cmAnpr = New cmAnpr("eur")
    
                ' Creates the image object and load the image
                Dim image As gxImage = New gxImage("default")
                image.Load("image.jpg")
    
                ' Finds the first license plate
                If anpr.FindFirst(image) Then
                    ' Get short country code
                    Dim countryCode As String
                    countryCode = anpr.GetCountryCode(anpr.GetType(), CC_TYPE.CCT_COUNTRY_SHORT)
                    If countryCode.Length = 0 Then countryCode = "No plate type"
    
                    ' Displays the result, country code and type
                    Console.WriteLine("Plate text: {0}", anpr.GetText())
                    Console.WriteLine("Country code: {0}", countryCode)
                    Console.WriteLine("Type: {0}", anpr.GetType())
                Else
                    Console.WriteLine("No license plate found")
                End If
            Catch ex As gxException
                Console.Error.WriteLine("GX error (" + gxSystem.GetErrorCode().ToString() + ") occured: " + gxSystem.GetErrorString())
                Environment.Exit(1)
            End Try
        End Sub
    End Module
     
				
			
				
					 #include "gxsdldr.c"
    #include "cmanpr.h"
    
    // If an error occurred it displays the error and terminates the program
    void term_if_err(int st) {
        int err_code;
        wchar_t err_str[256];
    
        if(st) return;		// No error occurred
        // Displays error code and description
        err_str[(sizeof(err_str)/sizeof(wchar_t))-1] = 0;
        gx_geterror(&err_code, err_str, (sizeof(err_str)/sizeof(wchar_t))-1);
        fprintf(stderr, "GX error (%x) occurred: %ls\n", err_code, err_str);
        // Terminates the program
        exit(1);
    }
    
    int main(void) {
        struct gxHANDLE anprhandle, imagehandle;
        struct gxIMAGE *image;
        struct cmNP *anprresult;
        int st;
        
        // Opens the ANPR module with EUR region
        st = gx_openmodule(&anprhandle, L"cmanpr", L"eur");
        term_if_err(st);
        
        // Opens the image module, allocates the image structure and load the image
        st = gx_openmodule(&imagehandle, L"gximage", L"default");
        term_if_err(st);
        st = gx_allocimage(imagehandle, &image);
        term_if_err(st);
        st = gx_loadimage(imagehandle, image, L"image.jpg", GX_UNDEF);
        term_if_err(st);
        
        // Finds the first license plate
        anprresult = 0;
        st = cm_findfirst(anprhandle, image, &anprresult);
        term_if_err(st);
        
        if(anprresult) {
            char countryCode[256]="";
            // Get short country code
            st = cm_getcountrycode(anprhandle,anprresult->type,(int)CCT_COUNTRY_SHORT,countryCode,sizeof(countryCode));
            term_if_err(st);
            // Displays the result, country code and type
            printf("Plate text: %s\n", anprresult->text);
            printf("Country code: %s\n", countryCode[0] ? countryCode : "No plate type");
            printf("Type: %i\n", anprresult->type);
    
            // Frees up the result
            st = gx_globalfree(anprresult);
            term_if_err(st);
        } else {
            printf("No license plate found\n");
        }
        
        // Frees up the resources
        st = gx_unrefimage(imagehandle, image);
        term_if_err(st);
        st = gx_unrefhandle(&imagehandle);
        term_if_err(st);
        st = gx_unrefhandle(&anprhandle);
        term_if_err(st);
    
        return 0;
    }
    
				
			
				
					    #include "gxsdldr.cpp"
    #include "cmanpr.h"
    
    int main() {
        try {
            // Creates the ANPR object with EUR region
            cm::cmAnpr anpr("eur");
    
            // Creates the image object and load the image
            gxImage image;
            image.Load("image.jpg");
    
            // Finds the first license plate
            if(anpr.FindFirst(image)) {
                // Get short country code
                gxOutStr countryCode = anpr.GetCountryCode(anpr.GetType(),(int)cm::CCT_COUNTRY_SHORT);
                std::wstring wCountryCode = countryCode.empty() ? L"No plate type" : countryCode;
    
                // Displays the result, country code and type
                std::wcout << L"Plate text: " << anpr.GetText() << std::endl;
                std::wcout << L"Country code: " << wCountryCode << std::endl;
                std::wcout << L"Type: " << anpr.GetType() << std::endl;
            } else {
                std::wcout << L"No license plate found" << std::endl;
            }
    
        } catch(gxError &e) {
            std::wcerr << L"GX error (" << e.GetErrorCode() << ") occurred: " <<  e.GetErrorString() << std::endl;
            return 1;
        }
    
        return 0;
    }
    
				
			
				
					 using System;
    using gx;
    using cm;
    
    namespace carmen
    {
        class MainClass
        {
            public static void Main(string[] args)
            {
                try {
                    // Creates the ANPR object with EUR region
                    cmAnpr anpr = new cmAnpr("eur");
    
                    // Creates the image object and load the image
                    gxImage image = new gxImage();
                    image.Load("image.jpg");
    
                    // Finds the first license plate
                    if (anpr.FindFirst(image)) {
                        // Get short country code
                        String countryCode = anpr.GetCountryCode(anpr.GetType(), (int)CC_TYPE.CCT_COUNTRY_SHORT);
                        countryCode = countryCode.Length > 0 ? countryCode : "No plate type";
    
                        //Displays the result, country code and type
                        Console.WriteLine("Plate text: {0}", anpr.GetText());
                        Console.WriteLine("Country code: {0}", countryCode);
                        Console.WriteLine("Type: {0}", anpr.GetType());
                    } else {
                        Console.WriteLine("No license plate found");
                    }
                } catch(gxException) {
                    Console.Error.WriteLine("GX error (" + gxSystem.GetErrorCode() + ") occured: " + gxSystem.GetErrorString());
                    Environment.Exit(1);
                }
            }
        }
    }
    
				
			
				
					import com.adaptiverecognition.gx.*;
    import com.adaptiverecognition.cm.*;
    
    public class cmanpr {
    
        static {
            try {
                System.loadLibrary("jgx");
                System.loadLibrary("jcmanpr");
            } catch(UnsatisfiedLinkError e) {
                System.err.println("Native code library failed to load." + e);
                System.exit(1);
            }
        }
    
        public static void main(String argv[]) {
            try {
                // Creates the ANPR object with EUR region
                cmAnpr anpr = new cmAnpr("eur");
    
                // Creates the image object and load the image
                gxImage image = new gxImage();
                image.Load("image.jpg");
                
                // Finds the first license plate
                if(anpr.FindFirst(image)) {
                    // Get short country code
                    String countryCode = anpr.GetCountryCode(anpr.GetType(),jcmanprConstants.CCT_COUNTRY_SHORT);
                    countryCode = countryCode.length()>0 ? countryCode : "No plate type";
    
                    // Displays the result, country code and type
                    System.out.println("Plate text: " + anpr.GetText());
                    System.out.println("Country code: " + countryCode);
                    System.out.println("Type: " + anpr.GetType());
                } else {
                    System.out.println("No license plate found");
                }			
    
                // Frees up resources
                anpr.delete();
                image.delete();
            } catch(RuntimeException e) {
                System.err.println("GX error (" + String.format("0x%08x",gxSystem.GetErrorCode()) + ") occured: " + gxSystem.GetErrorString());
                System.exit(1);
            }
        }
    }
    
				
			
				
					Imports System
    Imports gx
    Imports cm
    
    Module Main
        Sub Main()
            Try
                ' Creates the ANPR object with EUR region
                Dim anpr As cmAnpr = New cmAnpr("eur")
    
                ' Creates the image object and load the image
                Dim image As gxImage = New gxImage("default")
                image.Load("image.jpg")
    
                ' Finds the first license plate
                If anpr.FindFirst(image) Then
                    ' Get short country code
                    Dim countryCode As String
                    countryCode = anpr.GetCountryCode(anpr.GetType(), CC_TYPE.CCT_COUNTRY_SHORT)
                    If countryCode.Length = 0 Then countryCode = "No plate type"
    
                    ' Displays the result, country code and type
                    Console.WriteLine("Plate text: {0}", anpr.GetText())
                    Console.WriteLine("Country code: {0}", countryCode)
                    Console.WriteLine("Type: {0}", anpr.GetType())
                Else
                    Console.WriteLine("No license plate found")
                End If
            Catch ex As gxException
                Console.Error.WriteLine("GX error (" + gxSystem.GetErrorCode().ToString() + ") occured: " + gxSystem.GetErrorString())
                Environment.Exit(1)
            End Try
        End Sub
    End Module
     
				
			

Licensing Options

K-License
For Low Traffic Project
This type of license is recommended for access control projects with less than 300 parking places
FreeFlow Licensing
By CPU Core
Via this option, you can adapt your licensing to the processing capacity of your hardware (see table below).

Licesing Guidelines

Based on Processing Power and Requirements

Guidelines

Single License (Image/Sec)

Dual License (Image/Sec)

Quad License (Image/Sec)

i3 processor

1 - 5

2 - 10

4 - 20

i5 processor

3 - 7

6 - 14

12 - 28

i7 processor

5 - 10

10 - 20

20 - 40

Image processing capacity depends on numerous factors, such as resolution, the processing capacity of hardware, the complexity of regional license plates, and the number of license plate types in the regional engine. The values above are guidelines based on FHD resolution and OCR-ready images. For more information, please contact us.

Product Documentation
& Other Resources

Connect with our sales team
We’re here to help you get started. Please complete this form to book a
meeting, or call our sales team directly