C# 图片识别信息

最近由于项目需要,需要对传入的图片进行图片识别其中的文字 在网上找了一些资料

介绍两种比较主流和成熟的识别方式:

方式一、Asprise-OCR实现。

方式二、Microsoft Office Document Imaging(Office 2007) 组件实现。

方式三、PaddleOCRSharp 最推荐的一款 图片识别支持多种不同的模型共选择 而且的是开源、离线、免费支持多种语言上地址 https://gitee.com/raoyutian/paddle-ocrsharp

目前只支持window调用,无法在linux上调用
但是可以直接在PaddleOCR 使用python形式的 docker镜像部署 这一套很成熟了

 

经测试:

Asprise-OCR:使用正常大小的纯文字的图片,进行识别,若无背景干涉,能识别出80%以上的内容,但有背景图片干扰,识别率不到40%并且有大量乱码

PaddleOCRSharp:可支持各种情况下的识别,准确率很高,不受背景影响,支持自行部署,多模型切换

Asprise-OCR 官方文档:https://gitee.com/raoyutian/paddle-ocrsharp

Asprise-OCR此项目不仅包含文字,还可识别其他信息,具体的可以看官方文档

 

1.首先安装nuget asprise_ocr_api包其次在项目中调用,调用方式也很简单

// See https://aka.ms/new-console-template for more information
using asprise_ocr_api;
using System.Reflection.Emit;

Console.WriteLine("Hello, World!");
Main main = new Main();
main.Start();
public class Main
{
    public void Start()
    {
        AspriseOCR.SetUp();
        AspriseOCR ocr = new AspriseOCR();
        ocr.StartEngine("eng", AspriseOCR.SPEED_FASTEST);
        System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
        string s = ocr.Recognize("C:\\Users\\Administrator\\Desktop\\图片识别\\图片验证码01.png", -1, -1, -1, -1, -1, AspriseOCR.RECOGNIZE_TYPE_ALL, AspriseOCR.OUTPUT_FORMAT_PLAINTEXT);
        Console.WriteLine("我是输出字符串:" + s);
        ocr.StopEngine();
    }
}

图片内容为

 其中img_path:为图片路径,startX、startY坐标均为0即可,width、height图片的宽和高。

输出的内容为

对比图片上的内容看,准确率还不能达到百分百了,但准确率依旧很高

 

Microsoft Office Document Imaging(Office 2007) 组件实现

在使用之前需要给大家说的是Imaging 组件的兼容性不是很好,使用win 7 office 2007的时必须打上office 2007 sp1或者sp2补丁,读取中文才行。 

sp1补丁地址(226M) :

http://download.microsoft.com/download/1/6/5/1659d607-8696-4001-8072-efaedd70dd30/office2007sp1-kb936982-fullfile-zh-cn.exe

sp2补丁地址(301 MB):

http://download.microsoft.com/download/A/3/9/A39E919E-AFA8-4128-9249-51629206C70F/office2007sp2-kb953195-fullfile-zh-cn.exe 

 

给项目添加组件引用,如图:

使用代码:

MODI.Document doc = new MODI.Document();

doc.Create(img_Path);

MODI.Image image;

MODI.Layout layout;

doc.OCR(MODI.MiLANGUAGES.miLANG_CHINESE_SIMPLIFIED, true, true);  // 识别简体中文

for (int i = 0; i < doc.Images.Count; i++)

{

    image = (MODI.Image)doc.Images[i];

    layout = image.Layout;

    sb.Append(layout.Text);

}

MessageBox.Show(sb.ToString());

其中img_Path为图片路径,MODI.MiLANGUAGES为读取图片的文字类型枚举。

 PaddleOCRSharp 调用也及其简单 这个是安装  nuget:using PaddleOCRSharp;

这里我直接把图片剪切和图片识别直接实现了  SixLabors.ImageSharp  兼容linux和windows

using asprise_ocr_api;
using PaddleOCRSharp;
using SixLabors.ImageSharp.Formats.Jpeg;
using SixLabors.ImageSharp.Formats;
using System.Reflection.Emit;
using SixLabors.ImageSharp.Formats.Gif;
using System.IO;

Console.WriteLine("----------以下为输出内容----------");
Main main = new Main();
main.Start01();
Console.WriteLine("----------以上为输出内容----------");
public class Main
{
    public void Start01()
    {
        //兼容linux和window的图片截取工具
        //读取图片
        //按照指定坐标经行图片剪裁

        //等比例缩放图片大小
        //using (Image image = Image.Load("C:\\Users\\Administrator\\Desktop\\图片识别\\图片.png"))
        //{
        //    // Resize the image in place and return it for chaining.
        //    // 'x' signifies the current image processing context.
        //    image.Mutate(x => x.Resize(42, 50));

        //    // The library automatically picks an encoder based on the file extensions then encodes and write the data to disk.
        //    image.Save("bar.jpg");
        //} // Dispose - releasing memory into a memory pool ready for the next image you wish to process.


        //图片剪切
        string path = $@"C:\\Users\\Administrator\\Desktop\\文件夹\\剪切后的图片\\{DateTime.Now.ToString("yyyyMMddHHmmss")}.png";
        Image<Rgba64> image = Image.Load<Rgba64>("C:\\Users\\Administrator\\Desktop\\图片识别\\图片.png");
        //x:x的起始坐标 y:y的起始坐标 截取的长度 截取的宽度
        Rectangle rectangle = new Rectangle(2820, 1090, 1200, 650);
        //最后生成的图片大小,比列不对会被拉伸
        image.Mutate(x => x.Crop(rectangle).Resize(1200, 650));
        image.Save(path);
     //剪出来的图片只保留需要识别的内容

        PaddleOCREngine engine;

        //英文和数字模型V3 这个需要自己去下载对应的模型然后放到bin目录下 下载地址:https://gitee.com/paddlepaddle/PaddleOCR/blob/dygraph/doc/doc_ch/models_list.md#https://gitee.com/link?target=https%3A%2F%2Fpaddleocr.bj.bcebos.com%2Fdygraph_v2.0%2Fch%2Fch_ppocr_server_v2.0_rec_infer.tar
        OCRModelConfig config = new OCRModelConfig();
        string root = PaddleOCRSharp.EngineBase.GetRootDirectory();
        string modelPathroot = root + @"\en_v3";
        config.det_infer = modelPathroot + @"\en_PP-OCRv3_det_infer";
        config.cls_infer = modelPathroot + @"\ch_ppocr_mobile_v2.0_cls_infer";
        config.rec_infer = modelPathroot + @"\en_PP-OCRv3_rec_infer";
        config.keys = modelPathroot + @"\en_dict.txt";

        //OCR参数
        OCRParameter oCRParameter = new OCRParameter();
        oCRParameter.cpu_math_library_num_threads = 6;//预测并发线程数
        oCRParameter.enable_mkldnn = true;//是否使用mkldnn模型
        oCRParameter.cls = false; //是否执行文字方向分类
        oCRParameter.use_angle_cls = false;//是否开启方向检测
        oCRParameter.det_db_score_mode = true;//是否使用多段线,即文字区域是用多段线还是用矩形,
        oCRParameter.det_db_unclip_ratio = 1.6f;
        oCRParameter.max_side_len = 2000;

        //初始化OCR引擎
        engine = new PaddleOCREngine(config, oCRParameter);

        var imagebyte03 = File.ReadAllBytes(path);
        OCRResult ocrResult03 = engine.DetectText(imagebyte03);
        Console.WriteLine(ocrResult03.Text);
        Console.Read();
    }
}

 

当然也可以自行部署成服务

也可以直接把代码copy下来运行

 

posted on 2023-09-05 10:03  白码一号  阅读(812)  评论(0编辑  收藏  举报