Project_RapidOcrNcnn-1.2.0在windows上编译

Home / C++ MrLee 15小时前 14

首先下载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")
        set(OpenCV_DIR "D:/source/c++/Project_RapidOcrNcnn-1.2.0/opencv-static/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 OCR_LITE_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__


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

推荐阅读
最新回复 (0)
返回