PaddleOCR-2.1.1集成到opencv项目,在C#中调用

2024-03-26 15:38

本文主要是介绍PaddleOCR-2.1.1集成到opencv项目,在C#中调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、下载这3个

 

https://github.91chifun.workers.dev//https://github.com/PaddlePaddle/PaddleOCR/archive/refs/tags/v2.1.1.zip

https://paddle-wheel.bj.bcebos.com/2.0.2/win-infer/mkl/cpu/paddle_inference.zip

PaddleOCR/quickstart.md at release/2.0 · PaddlePaddle/PaddleOCR (github.com)

二、 解压v2.1.1.zip,把这两个目录复制到你的项目中,并在源码中添加它们:

三、解压paddle_inference.zip,在项目中引用其中的.lib

 四、修改一些代码,让它能返回识别到的文本,位置盒子

 paddleocr.h

#pragma once
#if def CREATEDELL_API
#else                                                                            
#define CREATEDELL_API _declspec(dllimport) 
#endif                                         #include "opencv2/core.hpp"cv::Mat CREATEDELL_API GoOCR(cv::Mat& srcimg, std::vector<std::vector<std::vector<int>>>& boxes, std::vector<std::string>& results);

paddleocr.cpp 

// Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.#include "glog/logging.h"
#include "omp.h"
#include "opencv2/core.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"#include <include/config.h>
#include <include/paddleocr.h>
#include <include/ocr_det.h>
#include <include/ocr_rec.h>
#include "../opencvcli.h"
using namespace std;
using namespace cv;
using namespace PaddleOCR;
using namespace opencvcli;void  GOCW::GoOCR(Mat& srcimg, std::vector<std::vector<std::vector<int>>>& boxes, std::vector<std::string>& results)
{OCRConfig config("config.txt");//config.PrintConfigInfo();DBDetector det(config.det_model_dir, config.use_gpu, config.gpu_id,config.gpu_mem, config.cpu_math_library_num_threads,config.use_mkldnn, config.max_side_len, config.det_db_thresh,config.det_db_box_thresh, config.det_db_unclip_ratio,config.use_polygon_score, config.visualize,config.use_tensorrt, config.use_fp16);Classifier* cls = nullptr;if (config.use_angle_cls == true) {cls = new Classifier(config.cls_model_dir, config.use_gpu, config.gpu_id,config.gpu_mem, config.cpu_math_library_num_threads,config.use_mkldnn, config.cls_thresh,config.use_tensorrt, config.use_fp16);}CRNNRecognizer rec(config.rec_model_dir, config.use_gpu, config.gpu_id,config.gpu_mem, config.cpu_math_library_num_threads,config.use_mkldnn, config.char_list_file,config.use_tensorrt, config.use_fp16);det.Run(srcimg, boxes);rec.Run(boxes, srcimg, cls, results);for (int i = 0; i < boxes.size(); i++){cv::Point p1 = cv::Point(boxes[i][0][0], boxes[i][0][1]);cv::Point p2 = cv::Point(boxes[i][1][0], boxes[i][1][1]);cv::Point p3 = cv::Point(boxes[i][2][0], boxes[i][2][1]);cv::Point p4 = cv::Point(boxes[i][3][0], boxes[i][3][1]);line(srcimg, p1, p2, Scalar(0, 0, 255));line(srcimg, p2, p3, Scalar(0, 0, 255));line(srcimg, p3, p4, Scalar(0, 0, 255));line(srcimg, p4, p1, Scalar(0, 0, 255));}
}

五、模型和运行时

 从PaddleOCR-2.1.1\deploy\cpp_infer\tools拿到config.txt 修改里面的内容,指定模型和字典:

从paddle_inference里取出所有的dll文件,主要有这几个


把以上所有文件放入运行目录,完成。

在我的开源项目中演示了C# 调用paddleocr的方法,欢迎关注;

OpenCVSharpHelper: 使用opencvsharp搭建的测试工具,可以方便地从海康相机,USB相机采集图像,测试各个函数不同参数的处理效果。 - Gitee.com

 

这篇关于PaddleOCR-2.1.1集成到opencv项目,在C#中调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/848983

相关文章

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

c# checked和unchecked关键字的使用

《c#checked和unchecked关键字的使用》C#中的checked关键字用于启用整数运算的溢出检查,可以捕获并抛出System.OverflowException异常,而unchecked... 目录在 C# 中,checked 关键字用于启用整数运算的溢出检查。默认情况下,C# 的整数运算不会自

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

C#中图片如何自适应pictureBox大小

《C#中图片如何自适应pictureBox大小》文章描述了如何在C#中实现图片自适应pictureBox大小,并展示修改前后的效果,修改步骤包括两步,作者分享了个人经验,希望对大家有所帮助... 目录C#图片自适应pictureBox大小编程修改步骤总结C#图片自适应pictureBox大小上图中“z轴

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如