首先下载Project_RapidOcrNcnn-1.2.0.7z,解压之后,修改
D:\Project_RapidOcrNcnn-1.2.0\opencv-static\OpenCVWrapperConfig.cmake
if (WIN32)
if (CMAKE_CL_64)
message("配置WINDOWS OpenCV x64 路径: ${CMAKE_CURRENT_LIST_DIR}/windows-x64/x64/vc16/staticlib")
set(OpenCV_DIR "${CMAKE_CURRENT_LIST_DIR}/windows-x64/x64/vc16/staticlib")
else ()
message("配置WINDOWS OpenCV x86 路径: ${CMAKE_CURRENT_LIST_DIR}/windows-x86")
set(OpenCV_DIR "${CMAKE_CURRENT_LIST_DIR}/windows-x86")
endif ()
elseif (APPLE)
message("配置macOS OpenCV 路径: ${CMAKE_CURRENT_LIST_DIR}/macos/lib/cmake/opencv4")
set(OpenCV_DIR "${CMAKE_CURRENT_LIST_DIR}/macos/lib/cmake/opencv4")
elseif (UNIX)
message("配置Linux OpenCV 路径: ${CMAKE_CURRENT_LIST_DIR}/linux/lib/cmake/opencv4")
set(OpenCV_DIR "${CMAKE_CURRENT_LIST_DIR}/linux/lib/cmake/opencv4")
endif ()将对应平台的路径替换成你的opencv路径,这里以自带的opencv版本路径为例。然后安装好cmake(我用的4.12版本),安装完之后,双击generate-vs-project.bat,生成对应版本的工程,这里我也做了一些修改,仅供参考
@ECHO OFF chcp 65001 cls @SETLOCAL echo "========请先参考README.md准备好编译环境========" echo. echo "========编译选项========" echo "请注意:项目默认使用Release库,除非您自行编译Debug版的Ncnn和Opencv,否则请不要选择Debug编译" echo "请输入编译选项并回车: 1)Release, 2)Debug" set BUILD_TYPE=Release ::set /p flag= set flag=1 if %flag% == 1 (set BUILD_TYPE=Release)^ else if %flag% == 2 (set BUILD_TYPE=Debug)^ else (echo 输入错误!Input Error!) echo. echo "请选择要使用的ncnn库选项并回车: 1)ncnn(CPU),2)ncnn(vulkan)" set BUILD_NCNN_VULKAN="CPU" ::set /p flag= set flag=1 if %flag% == 1 (set BUILD_NCNN_VULKAN="CPU")^ else if %flag% == 2 (set BUILD_NCNN_VULKAN="GPU")^ else (echo "输入错误!Input Error!") echo. echo "请注意:如果选择2)JNI动态库时,必须安装配置Oracle JDK" echo "请选择编译输出类型并回车: 1)BIN可执行文件,2)JNI动态库,3)C动态库" ::set /p flag= set flag=3 if %flag% == 1 (set BUILD_OUTPUT="BIN")^ else if %flag% == 2 (set BUILD_OUTPUT="JNI")^ else if %flag% == 3 (set BUILD_OUTPUT="CLIB")^ else (echo 输入错误!Input Error!) echo. echo "引用的库类型: 1)静态CRT(mt), 2)动态CRT(md)" echo "注意:范例工程默认集成mt版库" ::set /p flag= set flag=1 if %flag% == 1 ( set MT_ENABLED="True" )^ else (set MT_ENABLED="False") echo. echo "请输入选项并回车: 0)ALL, 1)vs2017-x86, 2)vs2017-x64, 3)vs2022-x86, 4)vs2022-x64:" ::set /p flag= set flag=4 if %flag% == 0 (call :buildALL)^ else if %flag% == 1 (call :gen2017-x86)^ else if %flag% == 2 (call :gen2017-x64)^ else if %flag% == 3 (call :gen2022-x86)^ else if %flag% == 4 (call :gen2022-x64)^ else (echo "输入错误!Input Error!") GOTO:EOF :buildALL call :gen2017-x86 call :gen2017-x64 call :gen2022-x86 call :gen2022-x64 GOTO:EOF :gen2017-x86 mkdir build-win-vs2017-x86 pushd build-win-vs2017-x86 call :cmakeParams "Visual Studio 15 2017" "Win32" popd GOTO:EOF :gen2017-x64 mkdir build-win-vs2017-x64 pushd build-win-vs2017-x64 call :cmakeParams "Visual Studio 15 2017" "x64" popd GOTO:EOF :gen2022-x86 mkdir build-win-vs2022-x86 pushd build-win-vs2022-x86 call :cmakeParams "Visual Studio 17 2022" "Win32" popd GOTO:EOF :gen2022-x64 mkdir build-win-vs2022-x64 pushd build-win-vs2022-x64 call :cmakeParams "Visual Studio 17 2022" "x64" popd GOTO:EOF :cmakeParams echo cmake -G "%~1" -A "%~2" -DOCR_OUTPUT=%BUILD_OUTPUT% -DOCR_VULKAN=%BUILD_NCNN_VULKAN% -DOCR_BUILD_CRT=%MT_ENABLED% .. cmake -G "%~1" -A "%~2" -DOCR_OUTPUT=%BUILD_OUTPUT% -DOCR_VULKAN=%BUILD_NCNN_VULKAN% -DOCR_BUILD_CRT=%MT_ENABLED% .. GOTO:EOF @ENDLOCAL
修改默认release,mt,vs2022的版本,默认C版本是导出对应函数,C++版本是没有导出工具类的,需要手动修改头文件
OcrLite.h
#ifndef __OCR_LITE_H__
#define __OCR_LITE_H__
#ifdef RapidOcrNcnn_EXPORTS
#define OCR_LITE_API __declspec(dllexport)
#else
#define OCR_LITE_API __declspec(dllimport)
#endif
#include "opencv2/core.hpp"
#include "ncnn/net.h"
#include "OcrStruct.h"
#include "DbNet.h"
#include "AngleNet.h"
#include "CrnnNet.h"
class OCR_LITE_API OcrLite {
public:
OcrLite();
~OcrLite();
void setNumThread(int numOfThread);
void initLogger(bool isConsole, bool isPartImg, bool isResultImg);
void enableResultTxt(const char *path, const char *imgName);
void setGpuIndex(int gpuIndex);
bool initModels(const std::string &detPath, const std::string &clsPath,
const std::string &recPath, const std::string &keysPath);
void Logger(const char *format, ...);
OcrResult detect(const char *path, const char *imgName,
int padding, int maxSideLen,
float boxScoreThresh, float boxThresh, float unClipRatio, bool doAngle, bool mostAngle);
OcrResult detect(const cv::Mat& mat,
int padding, int maxSideLen,
float boxScoreThresh, float boxThresh, float unClipRatio, bool doAngle, bool mostAngle);
private:
bool isOutputConsole = false;
bool isOutputPartImg = false;
bool isOutputResultTxt = false;
bool isOutputResultImg = false;
FILE *resultTxt;
DbNet dbNet;
AngleNet angleNet;
CrnnNet crnnNet;
std::vector<cv::Mat> getPartImages(cv::Mat &src, std::vector<TextBox> &textBoxes,
const char *path, const char *imgName);
OcrResult detect(const char *path, const char *imgName,
cv::Mat &src, cv::Rect &originRect, ScaleParam &scale,
float boxScoreThresh = 0.6f, float boxThresh = 0.3f,
float unClipRatio = 2.0f, bool doAngle = true, bool mostAngle = true);
};
#endif //__OCR_LITE_H__DbNet.h
#ifndef __OCR_DBNET_H__
#define __OCR_DBNET_H__
#ifdef RapidOcrNcnn_EXPORTS
#define OCR_LITE_API __declspec(dllexport)
#else
#define OCR_LITE_API __declspec(dllimport)
#endif
#include "OcrStruct.h"
#include "ncnn/net.h"
#include <opencv2/opencv.hpp>
class OCR_LITE_API DbNet {
public:
~DbNet();
void setNumThread(int numOfThread);
void setGpuIndex(int gpuIndex);
bool initModel(const std::string &pathStr);
std::vector<TextBox> getTextBoxes(cv::Mat &src, ScaleParam &s, float boxScoreThresh,
float boxThresh, float unClipRatio);
private:
int numThread;
ncnn::Net net;
const float meanValues[3] = {0.485 * 255, 0.456 * 255, 0.406 * 255};
const float normValues[3] = {1.0 / 0.229 / 255.0, 1.0 / 0.224 / 255.0, 1.0 / 0.225 / 255.0};
};
#endif //__OCR_DBNET_H__-
onnx的C语言API,简单易用。就是不支持内存加载图片,只能给路径。
#include <iostream> #include <OcrLiteCApi.h> #include <chrono> int main() { SetConsoleOutputCP(65001); OCR_HANDLE h = OcrInit(DET_MODEL, CLS_MODEL, REC_MODEL, KEY_FILE, 4); if(h == NULL) { std::cout << "OCR Init Failed!" << std::endl; return -1; } // 计算消耗时间 auto start = std::chrono::high_resolution_clock::now(); OCR_PARAM param = {}; if(!OcrDetect(h, "D:\\", "test.png", ¶m)) { std::cout << "OCR Detect Failed!" << std::endl; OcrDestroy(h); return -1; } int len = OcrGetLen(h); std::string buf(len, '\0'); if(!OcrGetResult(h, buf.data(), len)) { std::cout << "OCR Get Result Failed!" << std::endl; OcrDestroy(h); return -1; } std::cout << buf << std::endl; auto end = std::chrono::high_resolution_clock::now(); std::chrono::duration<double> diff = end - start; std::cout << "Time: " << diff.count() << " s" << std::endl; OcrDestroy(h); std::cin.ignore(); return 0; } -
下面是onnx的c++使用demo,参数很重要,工程配置直接复制Project_RapidOcrOnnx-1.2.2项目的配置。使用相同的include,lib,和引用的所有.lib静态库
#include <iostream> #define DET_MODEL "models\\ch_PP-OCRv3_det_infer.onnx" #define CLS_MODEL "models\\ch_ppocr_mobile_v2.0_cls_infer.onnx" #define REC_MODEL "models\\ch_PP-OCRv3_rec_infer.onnx" #define KEY_FILE "models\\ppocr_keys_v1.txt" #pragma comment(lib, "RapidOcrOnnx.lib") #include <opencv2/opencv.hpp> // RapidOcr 依赖 OpenCV #include <OcrLite.h> // RapidOcr 的主要头文件 #include <Windows.h> // int main() { // 控制台允许输出UTF-8中文 SetConsoleOutputCP(65001); OcrLite ocr; bool result = ocr.initModels(DET_MODEL, CLS_MODEL, REC_MODEL, KEY_FILE); std::cout << "OCR Load:" << result << std::endl; cv::Mat img = cv::imread("D:/test.jpg"); if (img.empty())return -1; /* unClipRatio = 0.0 → 文本框极度收缩 → 文字区域消失 unClipRatio = 1.0 → 不扩张不收缩 unClipRatio = 2.0 → 适当扩张(推荐值) unClipRatio = 3.0+ → 过度扩张,可能合并相邻文本框 */ OcrResult ocrResult = ocr.detect(img, 50, 0, 0, 0, 2.0, false, false); std::cout << "完整文本: " << ocrResult.strRes << std::endl; cv::imshow("img", img); cv::waitKey(0); return 0; }onnxruntime_session.lib
onnxruntime_optimizer.lib
onnxruntime_providers.lib
onnxruntime_framework.lib
onnxruntime_graph.lib
onnxruntime_util.lib
onnxruntime_mlas.lib
onnxruntime_common.lib
onnxruntime_flatbuffers.lib
onnx.lib
onnx_proto.lib
libprotobuf-lite.lib
re2.lib
flatbuffers.lib
absl_base.lib
absl_throw_delegate.lib
absl_raw_hash_set.lib
absl_hash.lib
absl_city.lib
absl_low_level_hash.lib
absl_raw_logging_internal.lib
cpuinfo.lib
clog.lib
absl_cord.lib
absl_cordz_info.lib
absl_cord_internal.lib
absl_cordz_functions.lib
absl_cordz_handle.lib
absl_hashtablez_sampler.lib
absl_exponential_biased.lib
absl_synchronization.lib
absl_graphcycles_internal.lib
absl_stacktrace.lib
absl_symbolize.lib
absl_malloc_internal.lib
absl_debugging_internal.lib
absl_demangle_internal.lib
absl_time.lib
absl_civil_time.lib
absl_time_zone.lib
absl_bad_optional_access.lib
absl_strings.lib
absl_strings_internal.lib
absl_bad_variant_access.lib
absl_spinlock_wait.lib
absl_int128.lib
absl_log_severity.lib
D:\source\c++\Project_RapidOcrOnnx-1.2.2\opencv-static\windows-x64\x64\vc16\staticlib\opencv_core460.lib
D:\source\c++\Project_RapidOcrOnnx-1.2.2\opencv-static\windows-x64\x64\vc16\staticlib\opencv_features2d460.lib
D:\source\c++\Project_RapidOcrOnnx-1.2.2\opencv-static\windows-x64\x64\vc16\staticlib\opencv_highgui460.lib
D:\source\c++\Project_RapidOcrOnnx-1.2.2\opencv-static\windows-x64\x64\vc16\staticlib\opencv_imgcodecs460.lib
D:\source\c++\Project_RapidOcrOnnx-1.2.2\opencv-static\windows-x64\x64\vc16\staticlib\opencv_imgproc460.lib
D:\source\c++\Project_RapidOcrOnnx-1.2.2\opencv-static\windows-x64\x64\vc16\staticlib\opencv_photo460.lib
D:\source\c++\Project_RapidOcrOnnx-1.2.2\opencv-static\windows-x64\x64\vc16\staticlib\opencv_video460.lib
D:\source\c++\Project_RapidOcrOnnx-1.2.2\opencv-static\windows-x64\x64\vc16\staticlib\libjpeg-turbo.lib
D:\source\c++\Project_RapidOcrOnnx-1.2.2\opencv-static\windows-x64\x64\vc16\staticlib\libwebp.lib
D:\source\c++\Project_RapidOcrOnnx-1.2.2\opencv-static\windows-x64\x64\vc16\staticlib\libpng.lib
D:\source\c++\Project_RapidOcrOnnx-1.2.2\opencv-static\windows-x64\x64\vc16\staticlib\libtiff.lib
D:\source\c++\Project_RapidOcrOnnx-1.2.2\opencv-static\windows-x64\x64\vc16\staticlib\libopenjp2.lib
D:\source\c++\Project_RapidOcrOnnx-1.2.2\opencv-static\windows-x64\x64\vc16\staticlib\IlmImf.lib
D:\source\c++\Project_RapidOcrOnnx-1.2.2\opencv-static\windows-x64\x64\vc16\staticlib\zlib.lib
comctl32.lib
ole32.lib
setupapi.lib
ws2_32.lib
user32.lib
gdi32.lib
kernel32.lib
winspool.lib
shell32.lib
oleaut32.lib
uuid.lib
comdlg32.lib
advapi32.lib
- 文章2325
- 用户1338
- 访客12504844
你不射门,就永远得不了分。