LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# 智能车牌识别基于 OpenCvSharp 和 PaddleOCR 的实战

admin
2025年3月20日 21:51 本文热度 271

前言

本文将详细介绍如何使用C#、OpenCvSharp和PaddleOCR构建一个高效的车牌识别系统,适用于车辆管理、智慧停车和交通监控等多种应用场景。

车牌识别技术

车牌识别(License Plate Recognition, LPR)是计算机视觉领域的重要应用,通过图像处理和光学字符识别(OCR)技术,自动提取并识别车辆牌照上的字符信息。该技术广泛应用于智慧城市、智能交通管理和安防监控等领域。车牌识别的基本流程包括:

图像获取:从摄像头或视频流中捕获图像。

车牌定位:检测并定位图像中的车牌区域。

车牌预处理:对车牌区域进行预处理,如灰度化、二值化等。

字符分割:将车牌上的字符逐一分割出来。

字符识别:使用OCR技术识别分割出的字符。

技术栈

车牌识别系统主要基于以下技术:

OpenCvSharp4:用于图像处理的开源库。

OpenCvSharp4.Extensions:增强图像处理功能的扩展库。

OpenCvSharp4.runtime.win:Windows平台运行时支持。

PaddleOCRSharp:高精度OCR引擎,简化文字识别过程。

System.Drawing:用于图像绘制和展示结果。

基本流程

一个完整的车牌识别系统通常包含以下几个步骤:

图像采集:从摄像头或视频流中获取图像数据。

图像预处理:对图像进行必要的预处理操作,如缩放、去噪等。

车牌定位:检测并定位图像中的车牌区域。

字符分割:将车牌区域中的字符逐一分割。

字符识别:使用OCR技术识别分割出的字符。

结果输出:将识别结果输出或存储到数据库中。

完整代码

using System.Drawing;
using System;
using OpenCvSharp;
using Size = OpenCvSharp.Size;
using Rect = OpenCvSharp.Rect;
using Point = OpenCvSharp.Point;

namespaceAppLicensePlate
{
    internalclassProgram
    {
        static void Main(string[] args)
        {
            DetectBlueRectangles("v2.jpg");
        }

        public static void DetectBlueRectangles(string imagePath)
        {
            using (Mat image = Cv2.ImRead(imagePath))
            {
                using (Mat hsvImage = new Mat())
                {
                    Cv2.CvtColor(image, hsvImage, ColorConversionCodes.BGR2HSV);
                    Cv2.GaussianBlur(hsvImage, hsvImage, new Size(55), 0);

                    // 调整HSV边界根据实际情况  
                    Scalar lowerBlue = new Scalar(1007070);  // 使用更具体的下边界  
                    Scalar upperBlue = new Scalar(140255255); // 上边界保持不变  

                    using (Mat blueMask = new Mat())
                    {
                        Cv2.InRange(hsvImage, lowerBlue, upperBlue, blueMask);

                        // 形态学操作:去噪  
                        using (Mat kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(55)))
                        {
                            Cv2.MorphologyEx(blueMask, blueMask, MorphTypes.Close, kernel);
                            Cv2.MorphologyEx(blueMask, blueMask, MorphTypes.Open, kernel);
                        }

                        // 查找轮廓  
                        Cv2.FindContours(blueMask, out Point[][] contours, out HierarchyIndex[] hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
                        foreach (var contour in contours)
                        {
                            var approxContour = Cv2.ApproxPolyDP(contour, Cv2.ArcLength(contour, true) * 0.05true);
                            if (approxContour.Length == 4)
                            {
                                Rect boundRect = Cv2.BoundingRect(approxContour);

                                // 计算区域面积  
                                double area = Cv2.ContourArea(contour);
                                float aspectRatio = (float)boundRect.Width / boundRect.Height;

                                // 添加多个阈值条件  
                                if (area > 1000 && aspectRatio >= 2 && aspectRatio <= 5)
                                {
                                    // 在源图像中确认背景颜色是否偏离标准蓝色  
                                    Mat roi = new Mat(image, boundRect);
                                    Scalar meanColor = Cv2.Mean(roi);

                                    if (meanColor[0] > 60 && meanColor[1] < 100 && meanColor[2] < 100// 检查蓝色分量是否占优  
                                    {
                                        Cv2.Rectangle(image, boundRect, Scalar.Red, 2);
                                        // 文字识别预处理  
                                        using (Mat grayRoi = new Mat())
                                        {
                                            Cv2.CvtColor(roi, grayRoi, ColorConversionCodes.BGR2GRAY);
                                            Cv2.Threshold(grayRoi, grayRoi, 0255, ThresholdTypes.Otsu);
                                            // 保存临时文件用于OCR识别  
                                            string tempImagePath = "temp_plate.png";
                                            Cv2.ImWrite(tempImagePath, grayRoi);
                                            var text = new PaddleOCRSharp.PaddleOCREngine().DetectText(tempImagePath).Text;
                                            using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(image.Width, image.Height))
                                            {
                                                using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap))
                                                {
                                                    // 复制OpenCV图像到Bitmap  
                                                    using (System.Drawing.Bitmap temp = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(image))
                                                    {
                                                        g.DrawImage(temp, 00);
                                                    }

                                                    // 设置文本样式  
                                                    System.Drawing.Font font = new System.Drawing.Font("SimHei"20, System.Drawing.FontStyle.Bold);
                                                    System.Drawing.Brush brush = System.Drawing.Brushes.Yellow;
                                                    System.Drawing.StringFormat format = new System.Drawing.StringFormat();

                                                    // 绘制带有背景的文本,提高可读性  
                                                    System.Drawing.RectangleF rectF = new System.Drawing.RectangleF(
                                                        boundRect.X, boundRect.Y + boundRect.Height + 5, boundRect.Width, 40);
                                                    g.FillRectangle(System.Drawing.Brushes.Black, rectF);
                                                    g.DrawString(text, font, brush, rectF, format);
                                                }

                                                // 将Bitmap转换回OpenCV格式  
                                                using (Mat newImage = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap))
                                                {
                                                    newImage.CopyTo(image);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }

                        Cv2.ImShow("Blue Rectangle & Plate Text Detection", image);
                        Cv2.WaitKey(0);
                        Cv2.DestroyAllWindows();
                    }

                }
            }
        }
    }
}

​注意:中文直接通过OpenCvSharp绘制显示有问题,不支持中文字符。

优化与实用技巧

HSV颜色空间调优

HSV颜色空间对于车牌识别非常重要,不同光照条件下可能需要调整参数:

形态学操作的核大小选择

形态学操作的核大小直接影响处理效果:

较小的核(3×3):保留更多细节,但可能无法有效去除噪点

较大的核(7×7或更大):噪点去除效果好,但可能导致细节丢失

根据图像分辨率和质量,可动态调整核大小:

车牌倾斜校正

在实际应用中,车牌可能存在一定的倾斜角度,可以通过以下方法校正:

自适应车牌定位参数

不同场景下的车牌特征可能有所不同,可以设计自适应参数调整机制:

总结

本文详细介绍了基于C#和OpenCVSharp实现车牌识别系统的完整过程。从图像预处理、车牌定位到字符识别,我们采用了一系列计算机视觉和图像处理技术。虽然示例中主要针对中国蓝色车牌,但通过调整相关参数,同样适用于其他类型车牌的识别。车牌识别技术正在各行各业发挥越来越重要的作用。


阅读原文:原文链接


该文章在 2025/3/21 10:40:16 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved