C#实现数字识别率的OCR
基于C#实现数字识别率的OCR方案
一、核心代码实现
1. 图像预处理(OpenCVSharp)
using OpenCvSharp;
public Mat PreprocessImage(string imagePath)
{
Mat src = Cv2.ImRead(imagePath, ImreadModes.Grayscale);
// 自适应二值化
Mat binary = new Mat();
Cv2.AdaptiveThreshold(src, binary, 255,
AdaptiveThresholdTypes.GaussianC,
ThresholdTypes.BinaryInv, 11, 2);
// 形态学去噪
Mat kernel = Cv2.GetStructuringElement(ElementShape.Rectangle, new Size(3,3));
Cv2.MorphologyEx(binary, binary, MorphOp.Open, kernel);
// 边缘增强
Mat edges = new Mat();
Cv2.Canny(binary, edges, 50, 150);
return edges;
}
2. 数字区域定位
public List<Rect> LocateNumbers(Mat processedImg)
{
List<Rect> regions = new List<Rect>();
Mat labels = new Mat();
Mat stats = new Mat();
// 连通域分析
Cv2.ConnectedComponentsWithStats(processedImg, out labels, stats, _);
for(int i=1; i<stats.Rows; i++) // 跳过背景
{
int area = stats.At<int>(i, 4);
if(area > 50)
{
int x = stats.At<int>(i, 0);
int y = stats.At<int>(i, 1);
int w = stats.At<int>(i, 2);
int h = stats.At<int>(i, 3);
// 过滤非数字区域
if(0.2 < (float)w/h && (float)w/h < 1.5)
{
regions.Add(new Rect(x, y, w, h));
}
}
}
return regions;
}
3. OCR引擎配置(Tesseract)
using Tesseract;
public string RecognizeDigits(Mat roi)
{
using var engine = new TesseractEngine(@"tessdata", "eng", EngineMode.Default);
// 数字专属配置
engine.SetVariable("tessedit_char_whitelist", "0123456789");
engine.SetVariable("tessedit_ocr_engine_mode", "3"); // 仅LSTM引擎
using var page = engine.Process(Pix.LoadFromMemory(roi.ToMemory()));
return page.GetText().Trim();
}
4. 后处理校验
public bool ValidateResult(string text)
{
// 正则表达式校验
if(!Regex.IsMatch(text, @"^\d+$")) return false;
// 数学逻辑校验(示例:金额校验)
if(text.Length > 8) return false;
// 校验码验证(Luhn算法)
return LuhnCheck(text);
}
private bool LuhnCheck(string number)
{
int sum = 0;
bool alternate = false;
for(int i=number.Length-1; i>=0; i--)
{
int n = int.Parse(number[i].ToString());
if(alternate)
{
n *= 2;
if(n > 9) n -= 9;
}
sum += n;
alternate = !alternate;
}
return sum % 10 == 0;
}
参考 C# OCR光学识别,数字识别率达100% youwenfan.com/contentcna/70116.html
二、性能优化策略
1. 硬件加速方案
优化方向 | 实现方法 | 效果提升 |
---|---|---|
GPU加速 | 启用OpenCL并行计算 | +40% |
模型量化 | 使用Tesseract 4.0+量化模型 | +25% |
多线程处理 | Parallel.ForEach批量处理图像 | +30% |
2. 引擎参数调优
// 高级配置示例
var config = new TesseractConfiguration
{
Language = "eng",
PageSegMode = PageSegMode.SingleLine,
DigitWhitelist = "0123456789",
PreserveInterwordSpaces = 1,
Tessedit_DoInvert = 1
};
三、测试验证方案
1. 测试数据集构建
类型 | 样本特征 | 数量 |
---|---|---|
印刷体数字 | 宋体/黑体,10-72pt | 5000 |
手写体数字 | 不同人书写风格 | 1000 |
复杂背景 | 网格/条纹/水印背景 | 2000 |
模糊样本 | 高斯模糊(σ=2-5) | 1500 |
2. 验证指标
public void RunAccuracyTest()
{
int total = 0;
int correct = 0;
foreach(var sample in testData)
{
Mat processed = PreprocessImage(sample.ImagePath);
List<Rect> regions = LocateNumbers(processed);
string result = "";
foreach(var rect in regions)
{
Mat roi = new Mat(processed, rect);
result += RecognizeDigits(roi);
}
if(ValidateResult(result) && result == sample.Expected)
{
correct++;
}
total++;
}
double accuracy = (double)correct / total * 100;
Console.WriteLine($"识别准确率: {accuracy.ToString("F2")}%");
}
四、部署建议
-
嵌入式部署
// 使用Avalonia跨平台部署 var ocrService = new OcrService(); ocrService.Initialize("tessdata");
-
云端服务
// ASP.NET Core API示例 [HttpPost("ocr")] public IActionResult Ocr([FromBody] ImageRequest request) { var result = _ocrProcessor.Process(request.Image); return Ok(new { Text = result }); }