文章目录链接下载模型推理库下载源码下载编译源码配置源码创建文件生成dll封装的头文件调用示例链接https://www.paddleocr.ai/latest/version3.x/pipeline_usage/OCR.html#1-ocrhttps://gitee.com/paddlepaddle下载模型https://www.paddleocr.ai/latest/version3.x/pipeline_usage/OCR.html#1-ocr选择推理模型下载即可推理库下载源码下载https://gitee.com/paddlepaddle编译源码在源码中构建build目录如果版本太低报错修改其版本创建三个文件夹把paddle_inference 的文件放入对应的里面里面的paddle和third_party 中的install 里面的libincludedll文件都放入对应即可配置源码common.lib cryptopp-static.lib paddle_inference.lib mklml.lib libiomp5md.lib glog.lib gflags_static.lib libprotobuf.lib mkldnn.lib xxhash.lib libcmt.lib libpaddle_inference.lib shlwapi.lib utf8proc_static.lib yaml-cpp.lib opencv_world4110.lib third_party\abseil-cpp\absl\status\Release\absl_statusor.lib third_party\clipper_ver6.4.2\cpp\Release\polyclipping.lib third_party\abseil-cpp\absl\Release\abseil_dll.lib-ignore:4221kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib生成cli.cc是入口文件报错下载dirent.h生成的exe文件放入模型和dll将其放入创建文件生成dll创建paddle_ocr.h和cpp文件封装的头文件#includestring#includevector#includeopencv2/opencv.hpp#defineOCR_API__declspec(dllexport)namespace ocr{structOCR_APIResult{cv::Mat image;std::string text;floatscore;cv::Rect rect;};OCR_API boolinit(conststd::stringdet_name,conststd::stringdet_dir,conststd::stringrec_name,conststd::stringrec_dir);OCR_API std::vectorResultrun_det(cv::Matinput);OCR_APIvoidrun_rec(Resultresult);}#includepaddle_ocr.h#includesrc/api/pipelines/ocr.hstaticstd::unique_ptrTextDetPredictorDet_Predictor;staticstd::unique_ptrTextRecPredictorRec_Predictor;bool ocr::init(conststd::stringdet_name,conststd::stringdet_dir,conststd::stringrec_name,conststd::stringrec_dir){try{// 1. 初始化检测预测器你的原有逻辑是对的 TextDetPredictorParams det_params;det_params.model_namedet_name;det_params.model_dirdet_dir;Det_Predictorstd::make_uniqueTextDetPredictor(det_params);// 2. 修正初始化识别预测器关键修改 TextRecPredictorParams rec_params;rec_params.model_namerec_name;rec_params.model_dirrec_dir;// 错误点修正创建 TextRecPredictor 实例而非 TextRecPredictorParamsRec_Predictorstd::make_uniqueTextRecPredictor(rec_params);// 可选验证预测器是否初始化成功避免空指针if(!Det_Predictor||!Rec_Predictor){returnfalse;}returntrue;}catch(conststd::exceptione){// 捕获初始化异常如模型路径错误、模型文件缺失std::cerrOCR初始化失败e.what()std::endl;returnfalse;}}std::vectorocr::Resultocr::run_det(cv::Matinput){std::vectorcv::Matinputs{input};Det_Predictor-ResetResult();//推理Det_Predictor-Process(inputs);//获取推理结果std::vectorTextDetPredictorResultdet_resultsDet_Predictor-PredictorResult();//det_result[0].dt_polysstd::vectorocr::Resultresult;for(inti0;idet_results.size();i){TextDetPredictorResult det_resultdet_results[i];for(intj0;jdet_result.dt_scores.size();j){ocr::Result r;r.scoredet_result.dt_scores[j];std::vectorcv::Point2fitemdet_result.dt_polys[j];r.rectcv::Rect(item[0],item[2]);//r.image input(r.rect);r.imagedet_result.input_image(r.rect).clone();result.push_back(r);}}returnresult;}voidocr::run_rec(ocr::Resultresult){std::vectorcv::Matinputs{result.image};Rec_Predictor-ResetResult();Rec_Predictor-Process(inputs);std::vectorTextRecPredictorResultrec_resultsRec_Predictor-PredictorResult();result.textrec_results[0].rec_text;result.scorerec_results[0].rec_score;}调用示例#includebuild/paddle_ocr.hintmain(){bool isokocr::init(PP-OCRv5_mobile_det,models\\PP-OCRv5_mobile_det_infer,PP-OCRv5_mobile_rec,models\\PP-OCRv5_mobile_rec_infer);if(!isok){return-1;}cv::Mat imgcv::imread(C:\\Users\\16069\\Desktop\\ho_GrayImage.bmp,cv::IMREAD_COLOR_BGR);std::vectorocr::Resultresultsocr::run_det(img);for(inti0;iresults.size();i){ocr::Result itemresults[i];ocr::run_rec(item);std::coutitem.score\t[item.rect.x,item.rect.y,item.rect.width,item.rect.height]\titem.textstd::endl;}return0;}