车牌识别emgucv.doc_第1页
车牌识别emgucv.doc_第2页
车牌识别emgucv.doc_第3页
车牌识别emgucv.doc_第4页
车牌识别emgucv.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

using System;using System.Collections.Generic;using System.Text;using System.Drawing;using Emgu.Util;using Emgu.CV;using Emgu.CV.Structure;using tessnet2;using System.Diagnostics; namespace LicensePlateRecognition / / A license plate detector / public class LicensePlateDetector : DisposableObject private Tesseract _ocr; / / Create a license plate detector / public LicensePlateDetector() /create OCR _ocr = new Tesseract(); /You can download more language definition data from //p/tesseract-ocr/downloads/list /Languages supported includes: /Dutch, Spanish, German, Italian, French and English _ocr.Init(eng, false); / / Detect license plate from the given image / / The image to search license plate from / A list of images where the detected license plate region is stored / A list of images where the detected license plate region with noise removed is stored / A list where the region of license plate, defined by an MCvBox2D is stored / The list of words for each license plate public ListList DetectLicensePlate(Image img, ListImage licensePlateList, ListImage filteredLicensePlateList, List boxList) /Stopwatch w = Stopwatch.StartNew(); ListList licenses = new ListList(); using (Image gray = img.Convert() using (Image canny = new Image(gray.Size) using (MemStorage stor = new MemStorage() CvInvoke.cvCanny(gray, canny, 100, 50, 3); Contour contours = canny.FindContours( Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_TREE, stor); FindLicensePlate(contours, gray, canny, licensePlateList, filteredLicensePlateList, boxList, licenses); /w.Stop(); return licenses; private void FindLicensePlate( Contour contours, Image gray, Image canny, ListImage licensePlateList, ListImage filteredLicensePlateList, List boxList, ListList licenses) for (; contours != null; contours = contours.HNext) Contour approxContour = contours.ApproxPoly(contours.Perimeter * 0.05, contours.Storage); if (approxContour.Area 100 & approxContour.Total = 4) /img.Draw(contours, new Bgr(Color.Red), 1); if (!IsParallelogram(approxContour.ToArray() Contour child = contours.VNext; if (child != null) FindLicensePlate(child, gray, canny, licensePlateList, filteredLicensePlateList, boxList, licenses); continue; MCvBox2D box = approxContour.GetMinAreaRect(); double whRatio = (double)box.size.Width / box.size.Height; if (!(3.0 whRatio & whRatio 8.0) Contour child = contours.VNext; if (child != null) FindLicensePlate(child, gray, canny, licensePlateList, filteredLicensePlateList, boxList, licenses); continue; Image plate = gray.Copy(box); Image filteredPlate = FilterPlate(plate); List words; using (Bitmap bmp = filteredPlate.Bitmap) words = _ocr.DoOCR(bmp, filteredPlate.ROI); licenses.Add(words); licensePlateList.Add(plate); filteredLicensePlateList.Add(filteredPlate); boxList.Add(box); / / Check if the four points forms a parallelogram / / The four points that defines a polygon / True if the four points defines a parallelogram private static bool IsParallelogram(Point pts) LineSegment2D edges = PointCollection.PolyLine(pts, true); double diff1 = Math.Abs(edges0.Length - edges2.Length); double diff2 = Math.Abs(edges1.Length - edges3.Length); if (diff1 / edges0.Length = 0.05 & diff1 / edges2.Length = 0.05 & diff2 / edges1.Length = 0.05 & diff2 / edges3.Length = 0.05) return true; return false; / / Filter the license plate to remove noise / / The license plate image / License plate image without the noise private static Image FilterPlate(Image plate) Image thresh = plate.ThresholdBinaryInv(new Gray(120), new Gray(255); using (Image plateMask = new Image(plate.Size) using (Image plateCanny = plate.Canny(new Gray(100), new Gray(50) using (MemStorage stor = new MemStorage() plateMask.SetValue(255.0); for ( Contour contours = plateCanny.FindContours( Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_EXTERNAL, stor); contours != null; contours = contours.HNext) Rectangle rect = contours.BoundingRectangle; if (rect.Height (plate.Height 1) rect.X -= 1; rect.Y -= 1; rect.Width += 2; rect.Heigh

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论