最近为了让python语言能够直接调用PaddleOCR的C++的动态链接库,针对本人已经开源的PaddleOCR项目https://gitee.com/raoyutian/paddle-ocrsharp使用的PaddleOCR的C++动态库,进行了大量代码修改,修改后PaddleOCR,导出标准C函数接口,极大地方便了其他语言直接调用并进行OCR文字识别。

__declspec(dllexport) void Initializejson(char* modelPath_det_infer, char* modelPath_cls_infer, char* modelPath_rec_infer, char* keys, char* parameterjson);
__declspec(dllexport) char* Detect(char* imagefile);
__declspec(dllexport) char* DetectByte(char* imagebytedata, size_t* size);
__declspec(dllexport) char* DetectBase64(char* imagebase64);
__declspec(dllexport) char* DetectByteData(const char* img, int nWidth, int nHeight, int nChannel);
__declspec(dllexport) void FreeEngine();

  本文将介绍python ,go ,c#几种开发语言的识别结果。

一 、pyhon:

import os
import ctypes
import Parameter
from ctypes import *
import json
from datetime import datetime
import numpy as np
paddleOCR=cdll.LoadLibrary(".\PaddleOCR.dll")#加载C++动态库
encode="gbk"
#传入OCR模型参数
root="./"
cls_infer =root+"/inference/ch_ppocr_mobile_v2.0_cls_infer"
rec_infer = root+"/inference/ch_PP-OCRv3_rec_infer"
det_infer = root+"/inference/ch_PP-OCRv3_det_infer"
ocrkeys = root+"/inference/ppocr_keys.txt"
#OCR识别参数对象,后面序列化为json字符串
parameter=Parameter.Parameter()
p_cls_infer=cls_infer.encode(encode)
p_rec_infer=rec_infer.encode(encode)
p_det_infer=det_infer.encode(encode)
p_ocrkeys=ocrkeys.encode(encode)
def main():
#序列化参数为json字符串
parameterjson= json.dumps(parameter,default=Parameter.Parameter2dict)
#初始化OCR引擎,一次即可
paddleOCR.Initializejson( p_det_infer, p_cls_infer, p_rec_infer, p_ocrkeys, parameterjson.encode(encode))
result=""
paddleOCR.Detect.restype = ctypes.c_wchar_p #识别结果是宽字节编码,
imagepath=os.path.abspath('.')+"\\image\\"
imagefiles=os.listdir(imagepath)
total=[]
for image in imagefiles:
imagefile=imagepath+image
t1= datetime.utcnow()
#调用OCR识别接口,调用的是文件路径接口
result= paddleOCR.Detect(imagefile.encode(encode))
t2=datetime.utcnow()
c=t2-t1
total.append(c)
print("time:",c)
print(result)
print("平均时间:", np.mean(total))
if __name__=="__main__":
main()
input()

  Python直接调用C++的动态库进行OCR识别,相比python调用python的预测库进行OCR,性能提升了不少。

二、Go:

package main
import (
"fmt"
"syscall"
"unsafe"
"os"
"bufio"
"C"
)
// 获取字符串的长度指针
func lenPtr(s string) uintptr {
return uintptr(len(s))
}
// 获取数字的指针
func intPtr(n int) uintptr {
return uintptr(n)
}
// 获取字符串的指针
func strPtr(s string) uintptr {
return uintptr(unsafe.Pointer(syscall.StringBytePtr(s)))
}
func main() {
dll,err:= syscall.LoadDLL("PaddleOCR.dll")
if err!=nil {
fmt.Println(err)
return
}
Initjson,err:=dll.FindProc("Initializejson")
if err!=nil {
fmt.Println(err)
return
}
detect,err:=dll.FindProc("Detect")
if err!=nil {
fmt.Println(err)
return
}
Initjson.Call(strPtr("D:\\PaddleOCR\\deploy\\Go\\inference\\ch_PP-OCRv3_det_infer"),
strPtr("D:\\PaddleOCR\\deploy\\Go\\inference\\ch_ppocr_mobile_v2.0_cls_infer"),
strPtr("D:\\PaddleOCR\\deploy\\Go\\inference\\ch_PP-OCRv3_rec_infer"),
strPtr("D:\\PaddleOCR\\deploy\\Go\\inference\\ppocr_keys.txt"),strPtr("{}")) res, _, _:=detect.Call(strPtr("D:\\PaddleOCR\\deploy\\Go\\image\\test.jpg"))
p_result := (*C.char)(unsafe.Pointer(res))
ocrresult:= C.GoString(p_result)
fmt.Println(ocrresult) input := bufio.NewScanner(os.Stdin)
input.Scan()
}

  

go语言现学现卖。Go实现,主要采用CGo,syscall.LoadDLL("PaddleOCR.dll")

使用syscall.LoadDLL加载PaddleOCR.dll动态链接库。

三、C#

c#语言调用C++动态库,直接采用DllImport方法。


        [DllImport(PaddleOCRdllName, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
internal static extern void Initialize(string det_infer, string cls_infer, string rec_infer, string keys, OCRParameter parameter);
[DllImport(PaddleOCRdllName, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
internal static extern void Initializejson(string det_infer, string cls_infer, string rec_infer, string keys, string parameterjson); [DllImport(PaddleOCRdllName, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
internal static extern IntPtr Detect(string imagefile); [DllImport(PaddleOCRdllName, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
internal static extern IntPtr DetectByte(byte[] imagebytedata, long size); [DllImport(PaddleOCRdllName, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
internal static extern IntPtr DetectBase64(string imagebase64); [DllImport(PaddleOCRdllName, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
internal static extern int FreeEngine();

  

开源项目地址: https://gitee.com/raoyutian/paddle-ocrsharp

更多内容,欢迎关注公众号,加入QQ群,了解更多内容。

PaddleOCR之高性能Go语言实现OCR识别的更多相关文章

  1. 【Win10 应用开发】OCR识别

    OCR,即Optical Character Recognition,光学字符识别.以下介绍来自搜索: OCR(Optical Character Recognition,光学字符识别)是指电子设备( ...

  2. Atitit  ocr识别原理 与概论 attilax总结

    Atitit  ocr识别原理 与概论 attilax总结 1.1. Ocr的过程与流程1 1.2. OCR不同技术细分略有不同,但大概原理是一样的. 即主要技术过程是:二值化(又叫归一化)----- ...

  3. 基于Python实现对PDF文件的OCR识别

    http://www.jb51.net/article/89955.htm https://pythontips.com/2016/02/25/ocr-on-pdf-files-using-pytho ...

  4. OCR识别-python版(一)

    需求:识别图片中的文字信息环境:windows系统 开发语言:python 使用工具类:1.pyocr 2.PIL 3.tesseract-ocr 步骤: 1.pyocr 网络通直接使用命令:pip ...

  5. 以API方式调用C# dll,使用OneNote2013 sp1实现OCR识别本地图片

    http://www.cnblogs.com/Charltsing/p/OneNoteOCRAPI.html OneNote2013 OCR API调用使用说明2019.4.17 使用说明:1.安装干 ...

  6. AI时代的OCR识别技术浅析

    人工智能这个词可谓是耳熟能详,近几年人工智能热潮再次席卷而来,引起轰动的要数google的AlphaGo,相继打败了围棋界的韩国选手李世石以及世界冠军柯洁,见证了人工智能发展的里程碑式的变革,人工智能 ...

  7. OCR识别-python3.5版

    刚接触,啥子都不会,按着教程走 需求:识别图片中的文字信息环境:windows系统 开发语言:python3.5 使用工具类:1.pyocr 2.PIL 3.tesseract-ocr 步骤: 1.p ...

  8. 基于百度云的OCR识别(Python)

    2019年7月3日早上,在百度AI开发者大会上,一个来自山西的青年,将一瓶矿泉水浇在了同样来自山西的李彦宏身上. 可以回顾一下 https://b23.tv/av57665929/p1 ,着实让人一惊 ...

  9. 百度DMLC分布式深度机器学习开源项目(简称“深盟”)上线了如xgboost(速度快效果好的Boosting模型)、CXXNET(极致的C++深度学习库)、Minerva(高效灵活的并行深度学习引擎)以及Parameter Server(一小时训练600T数据)等产品,在语音识别、OCR识别、人脸识别以及计算效率提升上发布了多个成熟产品。

    百度为何开源深度机器学习平台?   有一系列领先优势的百度却选择开源其深度机器学习平台,为何交底自己的核心技术?深思之下,却是在面对业界无奈时的远见之举.   5月20日,百度在github上开源了其 ...

  10. 基于Tesseract的OCR识别小程序

    一.背景 先说下开发背景,今年有次搬家找房子(2020了应该叫去年了),发现每天都要对着各种租房广告打很多电话.(当然网上也找了实地也找),每次基本都是对着墙面看电话号码然后拨打,次数一多就感觉非常麻 ...

随机推荐

  1. k8s 深入篇———— Job与CronJob[十]

    开篇 简要演练一下job 和 cronjob 正文 实际上,它们主要编排的对象,都是"在线业务",即:Long Running Task(长作业).比如,我在前面举例时常用的 Ng ...

  2. 面向切面编程AOP[二](java @EnableAspectJAutoProxy 代码原理)

    前言 @EnableAspectJAutoProxy 是启动aop功能的意思,那么里面是什么呢? 正文 @Target({ElementType.TYPE}) @Retention(Retention ...

  3. MVC 下拉选项实现的几种方式

    主要介绍4种方式 硬编码方式: ViewBag.hard_value = new List<SelectListItem>() { new SelectListItem(){Value=& ...

  4. arp 的基础概念

    前言 打算整理网络这一块,先把概念写完. 就是有一个问题,那就是为什么有ip地址还有mac地址呢? 原因是这样子的,我们知道ip协议是第三层,那么有一个问题了,如果只有第三层的ip是否能过识别到主机? ...

  5. 给picgo上传的图片加个水印

    之前给大家介绍了picgo和免费的图床神器.我们本可以开开心心的进行markdown写作了. 但是总是会有那么一些爬虫网站过来爬你的文章,还把你的文章标明是他们的原著.咋办呢?这里有一个好的办法就是把 ...

  6. 高效生产管理:选择顺通鞋业ERP系统派单的理由

    显然,传统的生产管理模式已经难以满足现代企业的需求,因此选择一款适合自身业务特点的生产管理软件成为了企业的当务之急.顺通鞋业ERP系统作为一款功能强大的生产管理软件,凭借其出色的派单功能,正逐渐成为众 ...

  7. 探秘RocketMQ源码——Series1:Producer视角看事务消息

    简介: 探秘RocketMQ源码--Series1:Producer视角看事务消息 1. 前言 Apache RocketMQ作为广为人知的开源消息中间件,诞生于阿里巴巴,于2016年捐赠给了Apac ...

  8. DataWorks 功能实践速览

    ​简介: DataWorks功能实践系列,帮助您解析业务实现过程中的痛点,提高业务功能使用效率! 功能推荐:独享数据集成资源组 如上期数据同步解决方案介绍,数据集成的批数据同步任务运行时,需要占用一定 ...

  9. SpringBoot项目添加2FA双因素身份认证

    什么是 2FA(双因素身份验证)? 双因素身份验证(2FA)是一种安全系统,要求用户提供两种不同的身份验证方式才能访问某个系统或服务.国内普遍做短信验证码这种的用的比较少,不过在国外的网站中使用双因素 ...

  10. vue中使用vue-b2wordcloud创建词云

    安装使用 安装:使用npm install vue-b2wordcloud --save或者直接在vue ui中添加vue-b2wordcloud运行依赖 使用:在main.js中导入使用 impor ...