/* * Copyright (c) 2015 Dr. Masroor Ehsan * * This file is part of OpenAlpr.Net. * * OpenAlpr.Net is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License * version 3 as published by the Free Software Foundation * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Reflection; using System.Windows.Forms; using openalprnet; namespace openalprnet_windemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public static string AssemblyDirectory { get { var codeBase = Assembly.GetExecutingAssembly().CodeBase; var uri = new UriBuilder(codeBase); var path = Uri.UnescapeDataString(uri.Path); return Path.GetDirectoryName(path); } } public Rectangle boundingRectangle(List points) { // Add checks here, if necessary, to make sure that points is not null, // and that it contains at least one (or perhaps two?) elements var minX = points.Min(p => p.X); var minY = points.Min(p => p.Y); var maxX = points.Max(p => p.X); var maxY = points.Max(p => p.Y); return new Rectangle(new Point(minX, minY), new Size(maxX - minX, maxY - minY)); } private static Image cropImage(Image img, Rectangle cropArea) { var bmpImage = new Bitmap(img); return bmpImage.Clone(cropArea, bmpImage.PixelFormat); } public static Bitmap combineImages(List images) { //read all images into memory Bitmap finalImage = null; try { var width = 0; var height = 0; foreach (var bmp in images) { width += bmp.Width; height = bmp.Height > height ? bmp.Height : height; } //create a bitmap to hold the combined image finalImage = new Bitmap(width, height); //get a graphics object from the image so we can draw on it using (var g = Graphics.FromImage(finalImage)) { //set background color g.Clear(Color.Black); //go through each image and draw it on the final image var offset = 0; foreach (Bitmap image in images) { g.DrawImage(image, new Rectangle(offset, 0, image.Width, image.Height)); offset += image.Width; } } return finalImage; } catch (Exception ex) { if (finalImage != null) finalImage.Dispose(); throw ex; } finally { //clean up memory foreach (var image in images) { image.Dispose(); } } } private void button1_Click(object sender, EventArgs e) { if (openFileDialog.ShowDialog(this) == DialogResult.OK) { processImageFile(openFileDialog.FileName); } } private void processImageFile(string fileName) { resetControls(); var region = rbUSA.Checked ? "us" : "eu"; using (var alpr = new AlprNet(region, Path.Combine(AssemblyDirectory, "openalpr.conf"))) { if (!alpr.isLoaded()) { lbxPlates.Items.Add("Error initializing OpenALPR"); return; } picOriginal.ImageLocation = fileName; picOriginal.Load(); var results = alpr.recognize(fileName); var images = new List(results.plates.Count()); var i = 1; foreach (var result in results.plates) { var rect = boundingRectangle(result.plate_points); var img = Image.FromFile(fileName); var cropped = cropImage(img, rect); images.Add(cropped); lbxPlates.Items.Add("\t\t-- Plate #" + i++ + " --"); foreach (var plate in result.topNPlates) { lbxPlates.Items.Add(string.Format(@"{0} {1}% {2}", plate.characters.PadRight(12), plate.overall_confidence.ToString("N1").PadLeft(8), plate.matches_template.ToString().PadLeft(8))); } } if (images.Any()) { picLicensePlate.Image = combineImages(images); } } } private void resetControls() { picOriginal.Image = null; picLicensePlate.Image = null; lbxPlates.Items.Clear(); } private void Form1_Load(object sender, EventArgs e) { resetControls(); } } }