C#使用OpenCV进行字母数字识别

安装

安装

1
2
3
Install-Package OpenCvSharp4 -Version 4.8.0.20230708
Install-Package OpenCvSharp4.runtime.win -Version 4.8.0.20230708
Install-Package OpenCvSharp4.Extensions -Version 4.8.0.20230708

识别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static double Same(Mat image1, Mat image2)
{
Mat resultMat = new Mat();

Cv2.Resize(image1, resultMat, new Size(image2.Cols, image2.Rows));
int row = resultMat.Rows;
int col = resultMat.Cols;
int sameCount = 0;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (resultMat.At<byte>(j, i) == image2.At<byte>(j, i))
{
sameCount += 1;
}
}
}

return 1.0 * sameCount / (row * col);
}

在识别之前,我们要把字符的图片调整为高度一致,宽高固定的图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static Mat GetMat20(Mat oldMat)
{
Mat whiteImage = new Mat(20, 20, MatType.CV_8U, Scalar.All(255));
if (oldMat.Width <= oldMat.Height)
{
Mat resultMat = new Mat();

Cv2.Resize(oldMat, resultMat, new Size(oldMat.Cols * 20 / oldMat.Rows, 20));
Rect destinationRegion = new Rect((whiteImage.Width - resultMat.Width) / 2, 0, resultMat.Width,
resultMat.Height);

resultMat.CopyTo(new Mat(whiteImage, destinationRegion));
}
else
{
Mat resultMat = new Mat();

Cv2.Resize(oldMat, resultMat, new Size(20, 20 * oldMat.Rows / oldMat.Cols));
Rect destinationRegion = new Rect(0, (whiteImage.Height - resultMat.Height) / 2, resultMat.Width,
resultMat.Height);

resultMat.CopyTo(new Mat(whiteImage, destinationRegion));
}

return whiteImage;
}

目前识别的结果是

8和B ]和1会识别错误

OCR模型

这个库在识别区域文字片段的时候能识别大多数,但是没有返回位置,并且如果识别单字符总是识别不出来。

https://gitee.com/leoseven/tessdata/tree/master

1
Install-Package Tesseract -Version 5.2.0

识别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Bitmap bitmap = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(img2);
using (var pix = PixConverter.ToPix(bitmap))
{
// 创建 Tesseract OCR 引擎
using (var ocr = new TesseractEngine(
@"C:\Users\Administrator\Desktop\1202\tessdata",
"eng",
EngineMode.Default
))
{
// 进行 OCR 识别
using (var page = ocr.Process(pix))
{
// 输出识别结果
string text = page.GetText();
Console.WriteLine("识别结果:");
Console.WriteLine(text);
}
}
}

KNN与Microsoft.ML

https://www.jianshu.com/p/c39478dfb324

OpenCV本身在C#中并不直接提供KNN分类器的训练接口。

如果要训练可以使用

  • C#的Microsoft.ML
  • 在Python中使用OpenCV的KNN

OpenCV 的 KNN 和 Microsoft.ML(ML.NET)都是用于机器学习的工具,但它们在功能和适用场景上有些不同。

OpenCV 的 KNN:

  • 定位: OpenCV 是一个开源计算机视觉库,主要用于图像处理和计算机视觉任务。
  • 功能: OpenCV 提供了 K-Nearest Neighbors (KNN) 算法的实现,适用于图像分类、目标检测等视觉任务。
  • 优点: 对于计算机视觉和图像处理领域,OpenCV 提供了丰富的功能和优化,适合在图像数据上使用 KNN。

Microsoft.ML (ML.NET):

  • 定位: ML.NET 是微软开发的一个开源机器学习框架,适用于各种机器学习任务,尤其是在.NET平台上的应用。
  • 功能: ML.NET 提供了多种机器学习算法,包括分类、回归、聚类等。它的 KNN 实现可以用于各种数据类型,不限于图像。
  • 优点: 如果你在.NET生态系统中工作,ML.NET 可以很好地集成到你的应用中,支持更多的机器学习任务,并且具有良好的文档和社区支持。

总结:

如果你的主要任务是计算机视觉相关的应用,那么 OpenCV 的 KNN 可能会更合适,因为它在处理图像数据方面有很好的优化。

如果你需要在 .NET 环境中进行各种机器学习任务,ML.NET 会更适合,它提供了更多的功能和灵活性。