OCR文本自动标注工具,Ocr文字识别,OCR图像识别 OCR标注工具 自动识别文字区域,并自动标注,支持单张标注,手动标注,多张自动标注,支持导出label文件,基于C# Framework开发。 目前演示版本框架为.net Framework4.6

直接上干货——今天给大家安利一个自己撸的OCR标注工具,纯C#手搓,专治各种图片文字识别后的标注需求。这玩意儿最大的特点就是能自动识别文字区域生成标注框,批量处理几百张扫描件就跟玩儿似的。

先看核心模块的代码结构。咱们用EmguCV做图像处理底层,这货是OpenCV的.NET马甲,处理图像区域检测稳得一批:

//区域检测核心代码
public List<Rectangle> DetectTextRegions(Mat srcImage)
{
    using (var gray = new Mat())
    {
        CvInvoke.CvtColor(srcImage, gray, ColorConversion.Bgr2Gray);
        var morphologyKernel = CvInvoke.GetStructuringElement(ElementShape.Rectangle, new Size(3, 3), new Point(-1, -1));
        CvInvoke.Threshold(gray, gray, 0, 255, ThresholdType.Otsu);
        CvInvoke.MorphologyEx(gray, gray, MorphOp.Close, morphologyKernel, new Point(-1, -1), 2, BorderType.Default, new MCvScalar(0));
        
        var contours = new VectorOfVectorOfPoint();
        CvInvoke.FindContours(gray, contours, null, RetrType.List, ChainApproxMethod.ChainApproxSimple);
        return contours.ToArray()
            .Where(c => CvInvoke.ContourArea(c) > 50)
            .Select(CvInvoke.BoundingRectangle)
            .ToList();
    }
}

这段代码先用大津法做二值化,接着用闭运算把文字区域连成块。实测这种处理对扫描件中的粘连文字效果拔群,特别是处理旧文件扫描件时,比直接调OCR接口的识别率高至少两成。

标注功能支持三种模式:

  1. 闪电模式(全自动批量处理)
  2. 精细模式(单张手动微调)
  3. 混合模式(先批量处理再人工复核)

导出的标注文件支持两种格式:

//标注文件序列化
public void ExportLabel(string path, List<OcrLabel> labels)
{
    var options = new JsonSerializerOptions { WriteIndented = true };
    var json = JsonSerializer.Serialize(labels.Select(l => new {
        l.BoundingBox,
        l.TextContent,
        Confidence = l.Confidence.ToString("P1")
    }), options);
    
    //兼容上古系统
    File.WriteAllText(path, json, Encoding.GetEncoding("GB2312"));
}

注意这里特意用GB2312编码,因为很多OCR项目对接的还是老系统。实测用UTF-8的话,某些工业控制台会显示乱码。

遇到歪斜文本怎么办?工具里内置了旋转校正功能:

//文本旋转校正
public Mat CorrectSkew(Mat inputImage)
{
    var cannyEdges = new Mat();
    CvInvoke.Canny(inputImage, cannyEdges, 50, 200);
    LineSegment2D[] lines = CvInvoke.HoughLinesP(cannyEdges, 1, Math.PI / 180, 20);
    
    var angles = lines.Select(l => Math.Atan2(l.P2.Y - l.P1.Y, l.P2.X - l.P1.X))
                     .Where(a => Math.Abs(a) > 0.1)
                     .Select(a => a * 180 / Math.PI);
    
    double medianAngle = angles.Any() ? angles.Median() : 0;
    return RotationCorrection(inputImage, medianAngle);
}

这里用霍夫变换找直线,取中位数角度旋转。实测对30度以内的倾斜文本校正效果不错,超过45度的建议还是先人工处理。

工具里最骚的操作是支持标注时自动填充OCR结果,按Tab键就能把识别结果直接灌入文本框。这个交互细节让标注效率直接起飞,处理合同扫描件时比手动输入快三倍不止。

最后说下部署问题,虽然基于.NET Framework 4.6开发,但实测在Windows 7以上系统都能直接运行。有老铁在树莓派上跑起来过,不过那需要魔改编译,这里就不展开讲了。需要源码的直接去Github搜ocr-label-helper,记得点star啊!

更多推荐