前言
本文將詳細介紹如何使用C#、OpenCvSharp和PaddleOCR構建一個高效的車牌識別系統,適用于車輛管理、智慧停車和交通監控等多種應用場景。
車牌識別技術
車牌識別(License Plate Recognition, LPR)是計算機視覺領域的重要應用,通過圖像處理和光學字符識別(OCR)技術,自動提取并識別車輛牌照上的字符信息。該技術廣泛應用于智慧城市、智能交通管理和安防監控等領域。車牌識別的基本流程包括:
圖像獲?。簭臄z像頭或視頻流中捕獲圖像。
車牌定位:檢測并定位圖像中的車牌區域。
車牌預處理:對車牌區域進行預處理,如灰度化、二值化等。
字符分割:將車牌上的字符逐一分割出來。
字符識別:使用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(5, 5), 0);
// 調整HSV邊界根據實際情況
Scalar lowerBlue = new Scalar(100, 70, 70); // 使用更具體的下邊界
Scalar upperBlue = new Scalar(140, 255, 255); // 上邊界保持不變
using (Mat blueMask = new Mat())
{
Cv2.InRange(hsvImage, lowerBlue, upperBlue, blueMask);
// 形態學操作:去噪
using (Mat kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(5, 5)))
{
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.05, true);
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, 0, 255, 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, 0, 0);
}
// 設置文本樣式
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或更大):噪點去除效果好,但可能導致細節丟失
根據圖像分辨率和質量,可動態調整核大?。?/span>
車牌傾斜校正
在實際應用中,車牌可能存在一定的傾斜角度,可以通過以下方法校正:
自適應車牌定位參數
不同場景下的車牌特征可能有所不同,可以設計自適應參數調整機制:
總結
本文詳細介紹了基于C#和OpenCVSharp實現車牌識別系統的完整過程。從圖像預處理、車牌定位到字符識別,我們采用了一系列計算機視覺和圖像處理技術。雖然示例中主要針對中國藍色車牌,但通過調整相關參數,同樣適用于其他類型車牌的識別。車牌識別技術正在各行各業發揮越來越重要的作用。
閱讀原文:原文鏈接
該文章在 2025/3/21 10:40:16 編輯過