Skip to content

Commit

Permalink
根据MistEO的3个pr,添加C库编译项
Browse files Browse the repository at this point in the history
  • Loading branch information
benjaminwan committed Oct 12, 2021
1 parent c65f500 commit fc2fca4
Show file tree
Hide file tree
Showing 12 changed files with 260 additions and 56 deletions.
17 changes: 12 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
cmake_minimum_required(VERSION 3.1)
project(OcrLiteNcnn)

option(OCR_LIB "OcrLite Jni Support" OFF)
option(OCR_JNI "OcrLite Jni Support" OFF)
option(OCR_CLIB "OcrLite CLib Support" OFF)
option(OCR_STATIC "Use Static Librarys For Build" ON)
option(OCR_OPENMP "OcrLite Enable OpenMP" ON)
option(OCR_BENCHMARK "build benchmark" ON)
option(OCR_VULKAN "OcrLite Enable Vulkan" ON)
#set(OCR_LIB ON)
#set(OCR_JNI ON)
#set(OCR_STATIC OFF)
#set(OCR_OPENMP OFF)
set(OCR_BENCHMARK ON)
Expand Down Expand Up @@ -76,7 +77,7 @@ else ()
endif (OpenCV_FOUND)

# JNI
if (OCR_LIB)
if (OCR_JNI)
find_package(JNI REQUIRED)
if (JNI_FOUND)
message("JNI FOUND")
Expand Down Expand Up @@ -104,12 +105,17 @@ if (OCR_STATIC)
endif ()
endif ()

if (OCR_LIB)
if (OCR_JNI) # JNI
add_library(OcrLiteNcnn SHARED ${OCR_COMPILE_CODE})
target_compile_definitions(OcrLiteNcnn PRIVATE __JNI__)
target_link_libraries(OcrLiteNcnn ncnn ${OpenCV_LIBS} ${JNI_LIBS} ${OpenMP_CXX_LIB_NAMES})
elseif(OCR_CLIB) # C LIB
add_library(OcrLiteNcnn SHARED ${OCR_COMPILE_CODE})
target_compile_definitions(OcrLiteNcnn PRIVATE __CLIB__)
target_link_libraries(OcrLiteNcnn ncnn ${OpenCV_LIBS} ${OpenMP_CXX_LIB_NAMES})
else ()
add_executable(OcrLiteNcnn ${OCR_COMPILE_CODE})
target_compile_definitions(OcrLiteNcnn PRIVATE __EXEC__)
target_link_libraries(OcrLiteNcnn ncnn ${OpenCV_LIBS} ${OpenMP_CXX_LIB_NAMES})
endif ()

Expand All @@ -122,7 +128,7 @@ if (OCR_VULKAN)
endif ()

# benchmark
if (OCR_BENCHMARK AND NOT OCR_LIB)
if (OCR_BENCHMARK AND NOT OCR_JNI AND NOT OCR_CLIB)
add_executable(benchmark benchmark/benchmark.cpp
src/AngleNet.cpp
src/clipper.cpp
Expand All @@ -132,6 +138,7 @@ if (OCR_BENCHMARK AND NOT OCR_LIB)
src/OcrLite.cpp
src/OcrUtils.cpp)
target_link_libraries(benchmark ncnn ${OpenCV_LIBS} ${OpenMP_CXX_LIB_NAMES})
target_compile_definitions(benchmark PRIVATE __EXEC__)
if (OCR_OPENMP)
target_compile_definitions(benchmark PRIVATE __OPENMP__)
endif ()
Expand Down
58 changes: 39 additions & 19 deletions build.bat
Original file line number Diff line number Diff line change
Expand Up @@ -43,18 +43,21 @@ else (echo "输入错误!Input Error!")
echo.

echo "请注意:如果选择2)编译为JNI动态库时,必须安装配置Oracle JDK"
echo "请选择编译输出类型并回车: 1)编译成可执行文件,2)编译成JNI动态库"
set BUILD_LIB=OFF
echo "请选择编译输出类型并回车: 1)编译成可执行文件,2)编译成JNI动态库,3)编译成C层动态库"
set BUILD_JNI=OFF
set BUILD_CLIB=OFF
set /p flag=
if %flag% == 1 (set BUILD_LIB=OFF)^
else if %flag% == 2 (set BUILD_LIB=ON)^
if %flag% == 1 (set BUILD_JNI=OFF)^
else if %flag% == 2 (set BUILD_JNI=ON)^
else if %flag% == 3 (set BUILD_CLIB=ON)^
else (echo 输入错误!Input Error!)
echo.

if %BUILD_LIB% == OFF (call :makeExe)^
else (call :makeLib)
echo cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DOCR_OPENMP=%BUILD_OPENMP% -DOCR_LIB=%BUILD_LIB% -DOCR_STATIC=%BUILD_STATIC% -DOCR_VULKAN=%BUILD_NCNN_VULKAN% ..
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DOCR_OPENMP=%BUILD_OPENMP% -DOCR_LIB=%BUILD_LIB% -DOCR_STATIC=%BUILD_STATIC% -DOCR_VULKAN=%BUILD_NCNN_VULKAN% ..
if %BUILD_JNI% == ON (call :makeJni)^
else if %BUILD_CLIB% == ON (call :makeCLib)^
else (call :makeExe)
echo cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DOCR_OPENMP=%BUILD_OPENMP% -DOCR_JNI=%BUILD_JNI% -DOCR_CLIB=%BUILD_CLIB% -DOCR_STATIC=%BUILD_STATIC% -DOCR_VULKAN=%BUILD_NCNN_VULKAN% ..
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DOCR_OPENMP=%BUILD_OPENMP% -DOCR_JNI=%BUILD_JNI% -DOCR_CLIB=%BUILD_CLIB% -DOCR_STATIC=%BUILD_STATIC% -DOCR_VULKAN=%BUILD_NCNN_VULKAN% ..
nmake
popd
GOTO:EOF
Expand All @@ -64,33 +67,50 @@ mkdir build
pushd build
GOTO:EOF

:makeLib
mkdir build-lib
pushd build-lib
:makeJni
mkdir build-jni
pushd build-jni
GOTO:EOF

:makeCLib
mkdir build-clib
pushd build-clib
GOTO:EOF

:makeAllExe
mkdir win-cpu-%VSCMD_ARG_TGT_ARCH%
pushd win-cpu-%VSCMD_ARG_TGT_ARCH%
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_LIB=OFF -DOCR_STATIC=ON -DOCR_VULKAN=OFF ..
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_JNI=OFF -DOCR_CLIB=OFF -DOCR_STATIC=ON -DOCR_VULKAN=OFF ..
nmake
popd

mkdir win-gpu-%VSCMD_ARG_TGT_ARCH%
pushd win-gpu-%VSCMD_ARG_TGT_ARCH%
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_LIB=OFF -DOCR_STATIC=ON -DOCR_VULKAN=ON ..
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_JNI=OFF -DOCR_CLIB=OFF -DOCR_STATIC=ON -DOCR_VULKAN=ON ..
nmake
popd

mkdir win-jni-cpu-%VSCMD_ARG_TGT_ARCH%
pushd win-jni-cpu-%VSCMD_ARG_TGT_ARCH%
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_JNI=ON -DOCR_CLIB=OFF -DOCR_STATIC=ON -DOCR_VULKAN=OFF ..
nmake
popd

mkdir win-jni-gpu-%VSCMD_ARG_TGT_ARCH%
pushd win-jni-gpu-%VSCMD_ARG_TGT_ARCH%
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_JNI=ON -DOCR_CLIB=OFF -DOCR_STATIC=ON -DOCR_VULKAN=ON ..
nmake
popd

mkdir win-lib-cpu-%VSCMD_ARG_TGT_ARCH%
pushd win-lib-cpu-%VSCMD_ARG_TGT_ARCH%
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_LIB=ON -DOCR_STATIC=ON -DOCR_VULKAN=OFF ..
mkdir win-clib-cpu-%VSCMD_ARG_TGT_ARCH%
pushd win-clib-cpu-%VSCMD_ARG_TGT_ARCH%
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_JNI=OFF -DOCR_CLIB=ON -DOCR_STATIC=ON -DOCR_VULKAN=OFF ..
nmake
popd

mkdir win-lib-gpu-%VSCMD_ARG_TGT_ARCH%
pushd win-lib-gpu-%VSCMD_ARG_TGT_ARCH%
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_LIB=ON -DOCR_STATIC=ON -DOCR_VULKAN=ON ..
mkdir win-clib-gpu-%VSCMD_ARG_TGT_ARCH%
pushd win-clib-gpu-%VSCMD_ARG_TGT_ARCH%
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_JNI=OFF -DOCR_CLIB=ON -DOCR_STATIC=ON -DOCR_VULKAN=ON ..
nmake
popd

Expand Down
59 changes: 39 additions & 20 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,37 @@
function buildAll() {
mkdir -p ${sysOS}-CPU
pushd ${sysOS}-CPU
cmake -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_LIB=OFF -DOCR_STATIC=ON -DOCR_VULKAN=OFF ..
cmake -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_JNI=OFF -DOCR_CLIB=OFF -DOCR_STATIC=ON -DOCR_VULKAN=OFF ..
make -j $NUM_THREADS
popd

mkdir -p ${sysOS}-GPU
pushd ${sysOS}-GPU
cmake -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_LIB=OFF -DOCR_STATIC=ON -DOCR_VULKAN=ON ..
cmake -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_JNI=OFF -DOCR_CLIB=OFF -DOCR_STATIC=ON -DOCR_VULKAN=ON ..
make -j $NUM_THREADS
popd

mkdir -p ${sysOS}-Lib-CPU
pushd ${sysOS}-Lib-CPU
cmake -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_LIB=ON -DOCR_STATIC=ON -DOCR_VULKAN=OFF ..
mkdir -p ${sysOS}-Jni-CPU
pushd ${sysOS}-Jni-CPU
cmake -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_JNI=ON -DOCR_CLIB=OFF -DOCR_STATIC=ON -DOCR_VULKAN=OFF ..
make -j $NUM_THREADS
popd

mkdir -p ${sysOS}-Lib-GPU
pushd ${sysOS}-Lib-GPU
cmake -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_LIB=ON -DOCR_STATIC=ON -DOCR_VULKAN=ON ..
mkdir -p ${sysOS}-Jni-GPU
pushd ${sysOS}-Jni-GPU
cmake -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_JNI=ON -DOCR_CLIB=OFF -DOCR_STATIC=ON -DOCR_VULKAN=ON ..
make -j $NUM_THREADS
popd

mkdir -p ${sysOS}-CLib-CPU
pushd ${sysOS}-CLib-CPU
cmake -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_JNI=OFF -DOCR_CLIB=ON -DOCR_STATIC=ON -DOCR_VULKAN=OFF ..
make -j $NUM_THREADS
popd

mkdir -p ${sysOS}-CLib-GPU
pushd ${sysOS}-CLib-GPU
cmake -DCMAKE_BUILD_TYPE=Release -DOCR_OPENMP=OFF -DOCR_JNI=OFF -DOCR_CLIB=ON -DOCR_STATIC=ON -DOCR_VULKAN=ON ..
make -j $NUM_THREADS
popd
}
Expand Down Expand Up @@ -88,25 +100,32 @@ else
fi

echo "请注意:如果选择2)编译为JNI动态库时,必须安装配置Oracle JDK"
echo "请选择编译输出类型并回车: 1)编译成可执行文件,2)编译成JNI动态库"
read -p "" BUILD_LIB
if [ $BUILD_LIB == 1 ]; then
BUILD_LIB=OFF
elif [ $BUILD_LIB == 2 ]; then
BUILD_LIB=ON
echo "请选择编译输出类型并回车: 1)编译成可执行文件,2)编译成JNI动态库,3)编译成C层动态库"
read -p "" BUILD_JNI
BUILD_CLIB=OFF
if [ $BUILD_JNI == 1 ]; then
BUILD_JNI=OFF
elif [ $BUILD_JNI == 2 ]; then
BUILD_JNI=ON
elif [ $BUILD_JNI == 3 ]; then
BUILD_JNI=OFF
BUILD_CLIB=ON
else
echo -e "输入错误!Input Error!"
fi

if [ $BUILD_LIB == OFF ]; then
if [ $BUILD_JNI == ON ]; then
mkdir -p build-jni
pushd build-jni
elif [ $BUILD_CLIB == ON ]; then
mkdir -p build-clib
pushd build-clib
else
mkdir -p build
pushd build
else
mkdir -p build-lib
pushd build-lib
fi

echo "cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DOCR_OPENMP=${BUILD_OPENMP} -DOCR_LIB=${BUILD_LIB} -DOCR_STATIC=${BUILD_STATIC} -DOCR_VULKAN=${BUILD_VULKAN} .."
cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DOCR_OPENMP=$BUILD_OPENMP -DOCR_LIB=$BUILD_LIB -DOCR_STATIC=$BUILD_STATIC -DOCR_VULKAN=$BUILD_VULKAN ..
echo "cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DOCR_OPENMP=${BUILD_OPENMP} -DOCR_JNI=${BUILD_JNI} -DOCR_CLIB=${BUILD_CLIB} -DOCR_STATIC=${BUILD_STATIC} -DOCR_VULKAN=${BUILD_VULKAN} .."
cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DOCR_OPENMP=$BUILD_OPENMP -DOCR_JNI=$BUILD_JNI -DOCR_CLIB=$BUILD_CLIB -DOCR_STATIC=$BUILD_STATIC -DOCR_VULKAN=$BUILD_VULKAN ..
make -j $NUM_THREADS
popd
18 changes: 10 additions & 8 deletions generate-vs-project.bat
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ echo "========请先参考README.md准备好编译环境========"
echo.

echo "========编译选项========"
echo "请注意:项目默认使用Release库,除非您自行编译Debug版的Onnxruntime和Opencv,否则请不要选择Debug编译"
echo "请注意:项目默认使用Release库,除非您自行编译Debug版的Ncnn和Opencv,否则请不要选择Debug编译"
echo "请输入编译选项并回车: 1)Release, 2)Debug"
set BUILD_TYPE=Release
set /p flag=
Expand All @@ -25,7 +25,7 @@ echo.

echo "使用静态库时,编译出来的可执行文件较大,但部署起来比较方便。"
echo "使用动态库时,编译出来的可执行文件较小,但部署的时候记得把dll复制到可执行文件目录"
echo "请选择要使用的OnnxRuntime和Opencv库选项并回车: 1)Static静态库,2)Shared动态库"
echo "请选择要使用的Opencv库选项并回车: 1)Static静态库,2)Shared动态库"
set BUILD_STATIC=ON
set /p flag=
if %flag% == 1 (set BUILD_STATIC=ON)^
Expand All @@ -42,11 +42,13 @@ else (echo "输入错误!Input Error!")
echo.

echo "请注意:如果选择2)编译为JNI动态库时,必须安装配置Oracle JDK"
echo "请选择编译输出类型并回车: 1)编译成可执行文件,2)编译成JNI动态库"
set BUILD_LIB=OFF
echo "请选择编译输出类型并回车: 1)编译成可执行文件,2)编译成JNI动态库,3)编译成C层动态库"
set BUILD_JNI=OFF
set BUILD_CLIB=OFF
set /p flag=
if %flag% == 1 (set BUILD_LIB=OFF)^
else if %flag% == 2 (set BUILD_LIB=ON)^
if %flag% == 1 (set BUILD_JNI=OFF)^
else if %flag% == 2 (set BUILD_JNI=ON)^
else if %flag% == 3 (set BUILD_CLIB=ON)^
else (echo 输入错误!Input Error!)
echo.

Expand Down Expand Up @@ -96,8 +98,8 @@ popd
GOTO:EOF

:cmakeParams
echo cmake -G "%~1" -A "%~2" -DOCR_OPENMP=%BUILD_OPENMP% -DOCR_LIB=%BUILD_LIB% -DOCR_STATIC=%BUILD_STATIC% -DOCR_VULKAN=%BUILD_NCNN_VULKAN% ..
cmake -G "%~1" -A "%~2" -DOCR_OPENMP=%BUILD_OPENMP% -DOCR_LIB=%BUILD_LIB% -DOCR_STATIC=%BUILD_STATIC% -DOCR_VULKAN=%BUILD_NCNN_VULKAN% ..
echo cmake -G "%~1" -A "%~2" -DOCR_OPENMP=%BUILD_OPENMP% -DOCR_JNI=%BUILD_JNI% -DOCR_CLIB=%BUILD_CLIB% -DOCR_STATIC=%BUILD_STATIC% -DOCR_VULKAN=%BUILD_NCNN_VULKAN% ..
cmake -G "%~1" -A "%~2" -DOCR_OPENMP=%BUILD_OPENMP% -DOCR_JNI=%BUILD_JNI% -DOCR_CLIB=%BUILD_CLIB% -DOCR_STATIC=%BUILD_STATIC% -DOCR_VULKAN=%BUILD_NCNN_VULKAN% ..
GOTO:EOF

@ENDLOCAL
5 changes: 4 additions & 1 deletion include/OcrLite.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,10 @@ class OcrLite {
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;
Expand Down
40 changes: 40 additions & 0 deletions include/OcrLiteCaller.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#pragma once

#include <memory>
#include <string>

#include "OcrLitePort.h"
#include "OcrStruct.h"

namespace cv
{
class Mat;
}
class OcrLite;

class OCRLITE_PORT OcrLiteCaller
{
public:
OcrLiteCaller();
~OcrLiteCaller() = default;
OcrLiteCaller(const OcrLite&) = delete;
OcrLiteCaller(OcrLite&&) = delete;

void setNumThread(int numOfThread);
void setGpuIndex(int gpuIndex);
bool initModels(const std::string& detPath, const std::string& clsPath,
const std::string& recPath, const std::string& keysPath);

OcrResult detect(const cv::Mat& mat,
int padding, int maxSideLen,
float boxScoreThresh, float boxThresh, float unClipRatio, bool doAngle, bool mostAngle);

OcrResult detect(const std::string& dir, const std::string& file,
int padding, int maxSideLen,
float boxScoreThresh, float boxThresh, float unClipRatio, bool doAngle, bool mostAngle);

OcrLiteCaller& operator=(const OcrLiteCaller&) = delete;
OcrLiteCaller& operator=(OcrLiteCaller&&) = delete;
private:
std::shared_ptr<OcrLite> m_ocrlite_ptr;
};
45 changes: 45 additions & 0 deletions include/OcrLitePort.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#pragma once

#if !defined(__JNI__) && !defined(__EXEC__)

// The way how the function is called
#if !defined(OCRLITE_CALL)
#if defined(_WIN32)
#define OCRLITE_CALL __stdcall
#else
#define OCRLITE_CALL
#endif /* _WIN32 */
#endif /* OCRLITE_CALL */

#if defined _WIN32 || defined __CYGWIN__
#define OCRLITE_EXPORT __declspec(dllexport)
#define OCRLITE_IMPORT __declspec(dllimport)
#define OCRLITE_LOCAL
#else // ! defined _WIN32 || defined __CYGWIN__
#if __GNUC__ >= 4
#define OCRLITE_EXPORT __attribute__ ((visibility ("default")))
#define OCRLITE_IMPORT __attribute__ ((visibility ("default")))
#define OCRLITE_LOCAL __attribute__ ((visibility ("hidden")))
#else // ! __GNUC__ >= 4
#define OCRLITE_EXPORT
#define OCRLITE_IMPORT
#endif // End __GNUC__ >= 4
#endif // End defined _WIN32 || defined __CYGWIN__

#ifdef __CLIB__
#define OCRLITE_PORT OCRLITE_EXPORT
#else
#define OCRLITE_PORT OCRLITE_IMPORT
#endif // OCRLITE_PORT

#define OCR_API OCRLITE_PORT OCRLITE_CALL

#define OCR_LOCAL OCRLITE_LOCAL OCRLITE_CALL

#else // __JNI__ || __EXEC__

#define OCRLITE_PORT
#define OCR_API
#define OCR_LOCAL

#endif // __JNI__ || __EXEC__
Loading

0 comments on commit fc2fca4

Please sign in to comment.