• 基于百度OCR的图片文字识别


      先上图,有图有真相

          

      首先在百度开通ORC服务,目前是免费的,普通识别每天50000次免费,非常棒!

           百度文档:http://ai.baidu.com/docs#/OCR-API/top

      下载百度SDK神马的就不多说了,需要包含CURL和JSON库,注意版本要求

      windows下的openssl 32位和64位一键安装包顺便分享下,自己安装太麻烦

      链接:https://pan.baidu.com/s/1HAuplB3deQGFk2eO8zC13A
      提取码:mh34 

      CURL和JSON库就不贴出来了,网上随便都能找到,需要的朋友可以找我,我私发给你。

      接下来进入正题,贴代码:

    ImageRecogition.h

     1 #pragma once
     2 
     3 #include "json/json.h"
     4 
     5 class CImageRecogition
     6 {
     7 public:
     8     CImageRecogition();
     9     ~CImageRecogition();
    10 
    11 public:
    12     /*accurate_basic*/
    13     Json::Value static accurate_basic(std::string szFile);
    14     /*general_basic*/
    15     Json::Value static general_basic(std::string szFile);
    16     /*general_enhanced*/
    17     Json::Value static general_enhanced(std::string szFile);
    18     /*receipt*/
    19     Json::Value static receipt(std::string szFile);
    20     /*custom*/
    21     Json::Value static custom(std::string szFile);24     /*save result to file*/
    25     void static SaveResultToFile(Json::Value & result, std::string szFile);
    26 private:
    27 };

    ImageRecogition.cpp

    #include "stdafx.h"
    #include "ImageRecogition.h"
    
    #include "baiduapi/ocr.h"
    
    #define APP_ID        "xxxxxxx"
    #define API_KEY        "xxxxxxx"
    #define SECRET_KEY    "xxxxx"
    
    CImageRecogition::CImageRecogition()
    {
    
    }
    
    CImageRecogition::~CImageRecogition()
    {
    
    }
    
    Json::Value CImageRecogition::accurate_basic(std::string szFile)
    {
        aip::Ocr client(APP_ID, API_KEY, SECRET_KEY);
    
        std::string image;
        aip::get_file_content(szFile.c_str(), &image);
        std::map<std::string, std::string> options;
        options["detect_direction"] = "true";
        options["probability"] = "true";
    
        std::cout << "高精识别开始:";
        return client.accurate_basic(image, options);
    }
    
    Json::Value CImageRecogition::general_basic(std::string szFile)
    {
        aip::Ocr client(APP_ID, API_KEY, SECRET_KEY);
    
        std::string image;
        aip::get_file_content(szFile.c_str(), &image);
        std::map<std::string, std::string> options;
        //options["language_type"] = "KOR";
        options["detect_direction"] = "true";
        options["detect_language"] = "true";
        options["probability"] = "true";
    
        std::cout << "普通识别开始:";
        return client.general_basic(image, options);
    }
    
    Json::Value CImageRecogition::general_enhanced(std::string szFile)
    {
        aip::Ocr client(APP_ID, API_KEY, SECRET_KEY);
    
        std::string image;
        aip::get_file_content(szFile.c_str(), &image);
        std::map<std::string, std::string> options;
        //options["language_type"] = "KOR";
        options["detect_direction"] = "true";
        options["detect_language"] = "true";
        options["probability"] = "true";
    
        std::cout << "生僻字识别开始:";
        return client.general_enhanced(image, options);
    }
    
    Json::Value CImageRecogition::receipt(std::string szFile)
    {
        aip::Ocr client(APP_ID, API_KEY, SECRET_KEY);
    
        std::string image;
        aip::get_file_content(szFile.c_str(), &image);
        std::map<std::string, std::string> options;
        //options["recognize_granularity"] = "small";
        options["probability"] = "true";
        //options["accuracy"] = "normal";
        options["detect_direction"] = "true";
    
        std::cout << "通用票据识别开始:";
        return client.receipt(image, options);
    }
    
    Json::Value CImageRecogition::custom(std::string szFile)
    {
        aip::Ocr client(APP_ID, API_KEY, SECRET_KEY);
    
        std::string image;
        aip::get_file_content(szFile.c_str(), &image);
        std::map<std::string, std::string> options;
        std::string templateSign = "354b9b4fd9b0e4b38aedb8096260c6de";
    
        std::cout << "自定义模板识别开始:";
        return client.custom(image, templateSign, options);
    }
    
    void CImageRecogition::SaveResultToFile(Json::Value & result, std::string szFile)
    {
        FILE* fp = nullptr;
        auto error_no = fopen_s(&fp, szFile.c_str(), "a+");
        if (fp != nullptr)
        {        
            fprintf_s(fp, "==============================================================================
    ");
            SYSTEMTIME st;
            ::GetLocalTime(&st);
            fprintf_s(fp, "%04d-%02d-%02d %02d:%02d:%02d
    ", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
            fprintf_s(fp, "log_id : %d
    ", result["log_id"].asInt64());
    
            auto result_num = result["words_result"].size();
    
            if (result_num > 0)
                std::cout << "识别成功,识别行数:" << result_num << std::endl;
            else
                std::cout << "识别失败,未识别数据" << std::endl;
    
            for (int i = 0; i < result_num; ++i)
                fprintf_s(fp, "%s
    ", result["words_result"][i]["words"].asString().c_str());
    
            fprintf_s(fp, "==============================================================================
    ");
            fprintf_s(fp, "
    ");
            fclose(fp);
        }
    }
     

     然后就是main函数的调用了

    #include "stdafx.h"
    #include <iostream>
    
    #include "ServiceLogic/ImageRecogition.h"
    #include "curl/curl.h"
    #include "DirFile/DirFile.h"
    
    int _tmain(int argc, char* argv[])
    {
        std::vector<std::string> vecFiles;
        DirFile::ListFiles(".", vecFiles, FILETYPE_JPG | FILETYPE_PNG | FILETYPE_JPEG);
        for (auto it : vecFiles)
        {
            std::cout << it << std::endl;
            std::string szFileName = it.substr(0, it.rfind("."));
            std::string szPath = "./Log_" + szFileName + "/";
            DirFile::CreatePath(szPath);
    
            //CImageRecogition::SaveResultToFile(CImageRecogition::accurate_basic(it), szPath + "accurate_basic.log");
            CImageRecogition::SaveResultToFile(CImageRecogition::general_basic(it), szPath + "general_basic.log");
            //CImageRecogition::SaveResultToFile(CImageRecogition::general_enhanced(it), szPath + "general_enhanced.log");
            //CImageRecogition::SaveResultToFile(CImageRecogition::receipt(it), szPath + "receipt.log");
            //CImageRecogition::SaveResultToFile(CImageRecogition::custom(it), szPath + "custom.log");
        }
        
        system("pause");
        return 0;
    }

     DirFile.h是遍历当前目录下对应格式的文件,以及Log目录的创建的,这里就不贴出来了,毕竟不是这次的主题。

     百度ORC的识别率,对图片要求还是比较高的,本人给朝鲜族的朋友测试韩文的发票,效果还是挺差强人意的。看大家的需求吧。

  • 相关阅读:
    阿里云 Serverless 异步任务处理系统在数据分析领域的应用
    主流定时任务解决方案全横评
    传统单节点网站的 Serverless 上云
    从函数计算到 Serverless 架构
    阿里云丁宇:以领先的云原生技术,激活应用构建新范式
    [Django] 创建python virtual environment 虚拟环境 并激活 | 安装配置Django
    在PPT里“露脸”
    Excel VBA中的“复制”和“粘帖”(Excel代码集团)
    提取学校名
    190010显示成
  • 原文地址:https://www.cnblogs.com/yzhuang/p/10981609.html
Copyright © 2020-2023  润新知