iOS License Plate Scanner SDK - Introduction
A class to scan a vehicle's license plate in a UIImage
or CMSampleBufferRef
and run a validation on the result.
Ideally, you use an instance of this class on subsequent video frames.
Each scanned frame will raise the confidence of the scan.
License Plate Scanner UI
There are two ways to integrate the component into the application:
- Ready to use UI component (more about RTU UI)
- Classic UI component (more about Classic components)
Please be aware that processing really large images may lead to out-of-memory crashes on iOS. Since this limit is highly dynamic and untransparent in iOS, depending on the device, your app's current memory usage, the other running apps, the iOS version, the system configuration and many other unknown variables, we did not add a hard limit for image sizes.
As a general rule of thumb, it is quite safe to assume that processing images of the resolution the camera can shoot will most likely not crash your app. On most modern iOS devices this currently translates to 12 megapixels. But even much larger images may work without crashing as well.
Thus we cannot take responsibility for out-of-memory crashes when dealing with very high-resolution images. It is your responsibility, as an app developer, to properly manage the handling of large images and keep the memory footprint of your app as small as possible.
In case you have any questions on this topic, please reach out to our support team.
Please do not use multiple scanners at the same time. For example, do not combine generic document scanner, health insurance scanner, text data scanner, etc. at the same time! Each scanner instance requires a lot of memory, GPU, and processor resources. Using multiple scanners will lead to performance issues for the entire application.
Ready-To-Use UI Component
The main class of the Ready-To-Use UI (RTU UI) component is SBSDKUILicensePlateScannerViewController
.
Usually, this view controller is used as a separate screen for scanning license plates in a UIImage
or CMSampleBufferRef
.
It returns the recognition results in a delegate method.
While you don't have direct control of the actual scanner view controller you can use the
SBSDKUILicensePlateScannerConfiguration
to customize it in a variety of ways, such as colors, texts, and behavior.
- Swift
- Objective-C
import UIKit
import ScanbotSDK
class LicensePlateScannerUISwiftViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// Start scanning here. Usually this is an action triggered by some button or menu.
self.startScanning()
}
func startScanning() {
// Create the default configuration object.
let configuration = SBSDKUILicensePlateScannerConfiguration.defaultConfiguration
// Behavior configuration:
// e.g. set the maximum number of accumulated frames before starting recognition.
configuration.behaviorConfiguration.maximumNumberOfAccumulatedFrames = 5
// UI configuration:
// e.g. configure various colors.
configuration.uiConfiguration.topBarBackgroundColor = UIColor.red
configuration.uiConfiguration.topBarButtonsColor = UIColor.white
configuration.uiConfiguration.topBarButtonsInactiveColor = UIColor.white.withAlphaComponent(0.3)
// Text configuration:
// e.g. customize a UI element's text.
configuration.textConfiguration.cancelButtonTitle = "Cancel"
// Present the recognizer view controller modally on this view controller.
SBSDKUILicensePlateScannerViewController.present(on: self,
configuration: configuration,
delegate: self)
}
}
extension LicensePlateScannerUISwiftViewController: SBSDKUILicensePlateScannerViewControllerDelegate {
func licensePlateScanner(_ controller: SBSDKUILicensePlateScannerViewController,
didRecognizeLicensePlate result: SBSDKLicensePlateScannerResult) {
// Process the scanned result.
}
}
#import "LicensePlateScannerUIObjcViewController.h"
@import ScanbotSDK;
@interface LicensePlateScannerUIObjcViewController () <SBSDKUILicensePlateScannerViewControllerDelegate>
@end
@implementation LicensePlateScannerUIObjcViewController
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
// Start scanning here. Usually this is an action triggered by some button or menu.
[self startScanning];
}
- (void)startScanning {
// Create the default configuration object.
SBSDKUILicensePlateScannerConfiguration *configuration = [SBSDKUILicensePlateScannerConfiguration defaultConfiguration];
// Behavior configuration:
// e.g. set the maximum number of accumulated frames before starting recognition.
configuration.behaviorConfiguration.maximumNumberOfAccumulatedFrames = 5;
// UI configuration:
// e.g. configure various colors.
configuration.uiConfiguration.topBarBackgroundColor = [UIColor redColor];
configuration.uiConfiguration.topBarButtonsColor = [UIColor whiteColor];
configuration.uiConfiguration.topBarButtonsInactiveColor = [[UIColor whiteColor] colorWithAlphaComponent:0.3];
// Text configuration:
// e.g. customize a UI element's text.
configuration.textConfiguration.cancelButtonTitle = @"Cancel";
// Present the recognizer view controller modally on this view controller.
[SBSDKUILicensePlateScannerViewController presentOn:self
configuration:configuration
delegate:self];
}
- (void)licensePlateScanner:(SBSDKUILicensePlateScannerViewController *)controller
didRecognizeLicensePlate:(SBSDKLicensePlateScannerResult *)result {
// Process the scanned result.
}
@end
Classic UI Component
The main class of the Classic UI component is SBSDKLicensePlateScannerViewController
.
Usually, this view controller is embedded as a child view controller into another view controller, the parent view controller. The parent view controller usually acts as the delegate and processes the recognition results. You still have full control over the UI elements and can add additional views and buttons to your view controller. The Classic component does not display results, instead, it just forwards them to the delegate.
- Swift
- Objective-C
import UIKit
import ScanbotSDK
class LicensePlateScannerSwiftViewController: UIViewController {
// The instance of the scanner view controller.
var scannerViewController: SBSDKLicensePlateScannerViewController?
override func viewDidLoad() {
super.viewDidLoad()
// Create the SBSDKLicensePlateScannerConfiguration object.
let configuration = SBSDKLicensePlateScannerConfiguration()
// Set the maximum number of accumulated frames before starting recognition.
configuration.maximumNumberOfAccumulatedFrames = 5
// Create the SBSDKLicensePlateScannerViewController instance.
self.scannerViewController = SBSDKLicensePlateScannerViewController(parentViewController: self,
parentView: self.view,
configuration: configuration,
delegate: self)
}
}
extension LicensePlateScannerSwiftViewController: SBSDKLicensePlateScannerViewControllerDelegate {
func licensePlateScannerViewController(_ controller: SBSDKLicensePlateScannerViewController,
didRecognizeLicensePlate licensePlateResult: SBSDKLicensePlateScannerResult,
on image: UIImage) {
// Process the recognized result.
}
}
#import "LicensePlateScannerObjcViewController.h"
@import ScanbotSDK;
@interface LicensePlateScannerObjcViewController () <SBSDKLicensePlateScannerViewControllerDelegate>
// The instance of the scanner view controller.
@property (strong, nonatomic) SBSDKLicensePlateScannerViewController *scannerViewController;
@end
@implementation LicensePlateScannerObjcViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Create the SBSDKLicensePlateScannerConfiguration object.
SBSDKLicensePlateScannerConfiguration *configuration = [[SBSDKLicensePlateScannerConfiguration alloc] init];
// Set the maximum number of accumulated frames before starting recognition.
configuration.maximumNumberOfAccumulatedFrames = 5;
// Create the SBSDKLicensePlateScannerViewController instance.
self.scannerViewController = [[SBSDKLicensePlateScannerViewController alloc] initWithParentViewController:self
parentView:self.view
configuration:configuration
delegate:self];
}
- (void)licensePlateScannerViewController:(SBSDKLicensePlateScannerViewController * _Nonnull)controller
didRecognizeLicensePlate:(SBSDKLicensePlateScannerResult * _Nonnull)licensePlateResult
on:(UIImage * _Nonnull)image {
// Process the recognized result.
}
@end
Want to scan longer than one minute?
Generate a free trial license to test the Scanbot SDK thoroughly.
Get your free Trial LicenseWhat do you think of this documentation?
What can we do to improve it? Please be as detailed as you like.