paddlepaddle(二) 文字识别 PaddleOCR C++部署

该文章详细介绍了如何在Windows环境下,使用Visual Studio 2019结合C++将PaddleOCR应用于摄像头实时文字检测。通过cmake-gui编译PaddleOCR源码,然后在新建的VS项目中配置相关属性,引入PaddleOCR、OpenCV库。主要步骤包括模型加载、摄像头读取、图像识别与边界框绘制。代码示例展示了实时显示识别结果的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文章记录,如何将PaddleOCR应用到window下的C++项目中,实现利用摄像头实时显示输出,上述即为实际的检测效果。看得出来,对不同大小语言文字检测性能都还不错。

主要过程包括:①PaddleOCR的编译,②VS2019的属性配置,③cpp文件修改用来显示图像

一、PaddleOCR编译

官方给出在VS中cmake,https://gitee.com/paddlepaddle/PaddleOCR/blob/release/2.0/deploy/cpp_infer/docs/windows_vs2019_build.md

本文采用cmake-gui中进行编译。

1.1 这里需要准备好3种资源

①PaddleOCR源码:https://github.com/PaddlePaddle/PaddleOCR

PaddlePaddle C++ 预测库 fluid_inference:https://www.paddlepaddle.org.cn/documentation/docs/en/guides/05_inference_deployment/inference/windows_cpp_inference_en.html

③OpenCV,用于读图、画图等操作

1.2 cmake

配置好cmake选项,congfigure,generate。

1.3 编译生成

二、新建PaddleOCR项目进行预测

2.1 新建项目

新建VS2019项目,将PaddleOCR源文件和头文件(见下图)全部添加到项目中。并配置项目属性。

2.2 PaddleOCR项目的配置文件

2.2.1 加载OCR预测模型

下载链接https://github.com/PaddlePaddle/PaddleOCR,此处用的是mobile形式的。

config.txt将作为项目main.cpp的输入参数,务必将文件中的模型文件路径填写正确。

2 main.cpp修改

修改部分见代码,主要包括输入参数、摄像头取帧、识别文字标记边界。

int main()
{
	OCRConfig config("D:/E/z_pp/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.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);

	cv::Mat srcimg;
	VideoCapture capture;
	capture.open(0, CAP_DSHOW);
	while (capture.read(srcimg))
	{
		//auto start = std::chrono::system_clock::now();
		std::vector<std::vector<std::vector<int>>> boxes;	//vector: [][0](x1,y1),  [][1](x2,y1),  [][2](x2,y2),[][3](x1,y2), 顺时针四个角
		det.Run(srcimg, boxes);

		rec.Run(boxes, srcimg, cls);
		//auto end = std::chrono::system_clock::now();
		//auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
		//std::cout << "Cost  "
		//	<< double(duration.count()) *
		//	std::chrono::microseconds::period::num /
		//	std::chrono::microseconds::period::den
		//	<< "s" << std::endl;

		for (int i = 0; i < boxes.size(); i++)
		{
			printf("%d %d %d %d\n", boxes[i][0][0], boxes[i][0][1], boxes[i][2][0], boxes[i][2][1]);

			line(srcimg, Point(boxes[i][0][0], boxes[i][0][1]), Point(boxes[i][1][0], boxes[i][1][1]), Scalar(0, 255, 0), 3);
			line(srcimg, Point(boxes[i][1][0], boxes[i][1][1]), Point(boxes[i][2][0], boxes[i][2][1]), Scalar(0, 255, 0), 3);
			line(srcimg, Point(boxes[i][2][0], boxes[i][2][1]), Point(boxes[i][3][0], boxes[i][3][1]), Scalar(0, 255, 0), 3);
			line(srcimg, Point(boxes[i][3][0], boxes[i][3][1]), Point(boxes[i][0][0], boxes[i][0][1]), Scalar(0, 255, 0), 3);
		}

		cv::imshow("PaddleOCR", srcimg);
		char ch = waitKey(1);	if (ch == 27)break;
	}

	return 0;
}

系列之(一)

paddlepaddle(一)文字识别 - PaddleOCR简单使用

<think>我们被要求使用C++在离线环境下部署和调用PaddleOCR模型进行文字识别。根据引用[2],我们知道PaddleOCRSharp是一个基于PaddleOCR的.NET版本,但用户需要C++版本。实际上,PaddleOCR本身是用C++编写的,因此我们可以直接使用PaddleOCRC++版本进行离线部署。 步骤: 1. 准备环境:确保系统满足PaddleOCRC++部署要求,包括安装必要的依赖库(如OpenCV、PaddlePaddle推理库等)。 2. 下载PaddleOCR模型:从PaddleOCR的官方仓库下载预训练的OCR模型(包括文本检测、文本识别和方向分类模型)。 3. 编译PaddleOCRC++推理代码:使用CMake编译PaddleOCR提供的C++推理代码。 4. 编写调用代码:编写C++程序调用编译好的推理库进行文字识别。 详细步骤: 一、环境准备 - 安装CMake(版本要求根据PaddleOCR文档) - 安装OpenCV(用于图像处理) - 下载PaddlePaddleC++推理库(根据系统环境选择版本,如Linux/Windows,CPU/GPU版本) - 下载PaddleOCR的源代码(包含C++推理代码) 、下载预训练模型 - 从PaddleOCR的模型库中下载需要的模型,例如: - 文本检测模型(如ch_PP-OCRv3_det_infer) - 文本识别模型(如ch_PP-OCRv3_rec_infer) - 方向分类模型(如ch_ppocr_mobile_v2.0_cls_infer)[可选,用于文本方向分类] 三、编译PaddleOCR C++推理代码 - 进入PaddleOCR部署目录(`deploy/cpp_infer`) - 创建build目录,使用CMake生成构建文件 - 编译项目 四、编写调用代码(实际上PaddleOCR已经提供了示例代码,我们只需要配置参数并运行) 以下是一个简化的步骤说明和示例代码: 1. 克隆PaddleOCR仓库: ```bash git clone https://github.com/PaddlePaddle/PaddleOCR cd PaddleOCR/deploy/cpp_infer ``` 2. 下载推理库和模型: - 从PaddlePaddle官网下载对应系统的C++推理库(如paddle_inference.tgz),并解压到`cpp_infer`目录下。 - 下载模型并解压到`./inference`目录下,目录结构如下: ``` inference/ ├── ch_PP-OCRv3_det_infer ├── ch_PP-OCRv3_rec_infer └── ch_ppocr_mobile_v2.0_cls_infer # 可选 ``` 3. 修改编译配置(`tools/build.sh`): 根据你的系统环境设置OpenCV路径、Paddle推理库路径等。 4. 编译: ```bash sh tools/build.sh ``` 5. 编译完成后,在`build`目录下会生成可执行文件`ocr_system`。然后,你可以通过配置文件`config.txt`(或使用命令行参数)来设置模型路径、图像路径等参数。 6. 运行示例: ```bash ./build/ocr_system --config=config.txt --image_path=./doc/imgs/11.jpg ``` 配置文件`config.txt`示例内容: ``` use_gpu 0 # 0表示使用CPU,1表示使用GPU gpu_id 0 gpu_mem 4000 # 模型路径 det_model_dir ./inference/ch_PP-OCRv3_det_infer/ rec_model_dir ./inference/ch_PP-OCRv3_rec_infer/ cls_model_dir ./inference/ch_ppocr_mobile_v2.0_cls_infer/ # 如果没有分类模型,可以留空或删除此行 # 其他参数(如字典路径) char_list_file ./ppocr_keys_v1.txt # 文本识别使用的字典文件,在PaddleOCR仓库中提供 ``` 注意:字典文件`ppocr_keys_v1.txt`可以在PaddleOCR仓库的`ppocr/utils`目录下找到,复制到`cpp_infer`目录下。 如果你希望在自己的C++项目中集成,可以将PaddleOCR的推理代码封装成函数,然后调用。以下是一个简化的调用流程: 1. 初始化OCR系统: ```cpp #include "ocr_system.h" // ... 其他头文件 // 初始化 OCRConfig config; config.use_gpu = false; // 使用CPU config.det_model_dir = "path/to/det_model"; config.rec_model_dir = "path/to/rec_model"; config.rec_char_dict_path = "path/to/ppocr_keys_v1.txt"; // ... 设置其他配置 OCRSystem ocr_system(config); ``` 2. 读取图像并识别: ```cpp cv::Mat img = cv::imread("path/to/image.jpg"); std::vector<OCRPredictResult> results = ocr_system.ocr(img, true); // 第个参数表示是否进行方向分类 ``` 3. 处理识别结果: ```cpp for (auto& result : results) { // 输出每个文本框的识别结果 std::cout << "Text: " << result.text << " Confidence: " << result.score << std::endl; // 还可以获取文本框坐标等 } ``` 注意事项: - 确保所有依赖库的版本兼容,特别是PaddlePaddle推理库和OpenCV。 - 如果遇到问题,请参考PaddleOCR的官方文档:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/deploy/cpp_infer/readme.md 以上就是在C++离线环境下部署调用PaddleOCR模型进行文字识别的基本步骤。 生成相关问题: 1. 如何为PaddleOCRC++部署编译OpenCV? 2. PaddleOCRC++推理支持哪些模型格式? 3. 如何优化PaddleOCRC++端的推理速度? 4. 如何处理PaddleOCR识别结果中的后处理(如非极大值抑制)? 5. PaddleOCRC++部署在Windows和Linux下有什么不同?</think>### C++ 离线环境部署调用 PaddleOCR 模型实现 OCR 文字识别 以下是完整的部署流程和代码实现: #### 1. **环境准备** - **系统要求**:Linux (推荐 Ubuntu 18.04+) 或 Windows - **依赖项**: ```bash # Ubuntu 示例 sudo apt install gcc g++ make cmake git libopencv-dev ``` - **下载资源**: - PaddleOCR C++ 推理库:[PaddleOCR 官方 GitHub](https://github.com/PaddlePaddle/PaddleOCR) - 预训练模型([模型库](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/doc/doc_ch/models_list.md)): - 文本检测模型:`ch_PP-OCRv3_det_infer` - 文本识别模型:`ch_PP-OCRv3_rec_infer` #### 2. **部署步骤** ##### (1) 编译 Paddle Inference 库 ```bash git clone https://github.com/PaddlePaddle/PaddleOCR.git cd PaddleOCR/deploy/cpp_infer mkdir build && cd build cmake .. -DPADDLE_LIB=path/to/paddle_inference_install_dir \ -DOPENCV_DIR=path/to/opencv \ -DCUDA_LIB=path/to/cuda/lib # 若使用 GPU make -j8 ``` ##### (2) 目录结构准备 ``` cpp_infer/ ├── build/ ├── config.txt # 配置文件 ├── images/ # 测试图片 ├── inference/ │ ├── det_model/ # 检测模型 │ └── rec_model/ # 识别模型 └── ppocr_keys_v1.txt # 字典文件 ``` ##### (3) 配置文件 `config.txt` ```ini use_gpu=0 # 0=CPU, 1=GPU gpu_id=0 gpu_mem=4000 det_model_dir=./inference/det_model/ rec_model_dir=./inference/rec_model/ char_list_file=./ppocr_keys_v1.txt # 可视化参数(可选) visualize=1 output=./results/ ``` #### 3. **C++ 调用示例代码** ```cpp #include "ocr_system.h" #include <iostream> int main() { // 初始化 OCR 系统 OCRConfig config("config.txt"); OCRSystem ocr_system(config); // 读取图像 cv::Mat img = cv::imread("test.jpg"); if (img.empty()) { std::cerr << "Image load failed!" << std::endl; return -1; } // 执行 OCR std::vector<OCRResult> results; ocr_system.Run(img, results); // 输出结果 for (auto& res : results) { std::cout << "Text: " << res.text << " | Confidence: " << res.score << " | Position: "; for (auto& pt : res.box) { std::cout << "(" << pt.x << "," << pt.y << ") "; } std::cout << std::endl; } return 0; } ``` #### 4. **编译与运行** ```bash # 编译 g++ main.cpp -I/path/to/PaddleOCR/deploy/cpp_infer/include \ -L/path/to/PaddleOCR/deploy/cpp_infer/build \ -locr_system -lopencv_core -lopencv_imgproc -lopencv_highgui # 运行(需将模型和字典放入指定路径) ./a.out ``` #### 5. **优化建议** 1. **性能提升**: - 启用 GPU:`use_gpu=1` 并安装 CUDA/cuDNN - 使用量化模型(如 `ch_PP-OCRv3_det_quant_infer`) 2. **多语言支持**: - 替换字典文件为其他语言(如 `en_dict.txt`) 3. **错误处理**: - 添加模型加载检查:`if (!ocr_system.IsInitialized()) { /* handle error */ }` #### 注意事项 - **模型兼容性**:确保模型版本与 PaddleOCR 代码版本匹配 - **内存管理**:大图像需分块处理,避免内存溢出 - **离线验证**:部署完成后断开网络测试功能完整性 > 部署过程参考 PaddleOCR 官方 C++ 推理文档[^1],核心组件基于 Paddle Inference 引擎实现高效离线推理[^2]。 --- ### 相关问题 1. **如何优化 PaddleOCR 在嵌入式设备上的运行效率?** 2. **如何处理 PaddleOCR 对倾斜文本的识别问题?** 3. **PaddleOCR 与 Tesseract 在离线环境下的性能对比如何?** 4. **如何实现 PaddleOCR 的多线程批量图片处理?** 5. **PaddleOCR 是否支持手写体文字识别?准确率如何?** [^1]: PaddleOCR 官方文档:C++ 推理部署指南 [^2]: Paddle Inference 引擎技术架构解析
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值