Project_RapidOcrNcnn-1.2.0在windows上编译

Home / C++ MrLee 5月前 533

首先下载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__


本文链接:https://it72.com/12799.htm

推荐阅读
最新回复 (2)
  • MrLee 10小时前
    引用 2

    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", &param)) {
    		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;
    }


  • MrLee 9小时前
    引用 3

    下面是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


返回