表格线识别通用库是一款基于传统算法的图像处理工具,旨在为开发者提供便捷高效的表格线识别功能。
| 模块名 | 组件 | 中文名 | 说明 |
|---|---|---|---|
| "base" | 基础模块 | 包含了基本的数据结构和算法功能 | |
| "point" | 点 | 实现了一个二维空间中的坐标点 | |
| "line" | 线 | 写成实现了连接两个点的直线段 | |
| "rectangle" | 矩形 | 实现了由左上角点坐标和宽高所构成的矩形框 | |
| "interval" | 区间 | 实现了表示一段连续的数值区间 | |
| "disjoint set" | 并查集 | 实现了处理不相交集合的数据结构 | |
| "scope" | 作用域 | 实现了值存储和管理的作用域机制 | |
| "percent" | 百分比 | 实现了百分比和非百分比值的混合运算 | |
| "list" | 列表 | 实现了在固定时间内访问任意顺序单个元素的列表容器 | |
| "list" | 列表模块 | 包含了列表相关的操作和功能 | |
| "lines" | 线列表 | 实现了包含多条线段的列表 | |
| "rectangles" | 矩形列表 | 实现了包含多个矩形的列表 | |
| "intervals" | 区间列表 | 实现了包含多个数值区间的列表 | |
| "feature" | 功能模块 | 提供了具体功能实现的模块 | |
| "horizontal lines" | 横线列表 | 实现了包含多条水平线的列表 | |
| "vertical lines" | 竖线列表 | 实现了包含多条垂直线的列表 | |
| "image" | 图像 | 实现了图像的存储、内存管理以及数据处理等功能 | |
| "projection" | 投影 | 实现了图像投影及相关处理操作 | |
| "image preprocess" | 图像预处理 | 实现了一系列图像预处理操作 | |
| "debug" | 调试模块 | 包含了调试相关的工具和函数 | |
| "color" | 颜色 | 实现了终端文本样式和颜色设置 | |
| "printer" | 打印器 | 实现了复杂场景下的输出打印 | |
| "complex printer" | 复杂打印器 | 实现了复杂场景下的详细输出打印 | |
| "debug" | 调试器 | 实现了终端、文件形式的调试信息输出 | |
| "utils" | 工具模块 | 包含了各种常用工具函数 | |
| "binary" | 二进制 | 实现了与二进制数据相关的操作和转换 | |
| "file" | 文件 | 实现了与文件相关的操作 | |
| "inout" | 输入输出 | 实现了对文件的批量输入输出操作 | |
| "string" | 字符串 | 实现了与字符串相关的操作 |
可以在程序的任何位置通过调试器进行交互,令其打印内部数据,或是批量输出内部图片。当程序出现各种程序异常,如:断言、异常等,将会在控制台中打印完整的错误信息。这极大地降低了调试难度,提升了开发效率和调试体验。
// 调试器
const cm::Debug debug("/path/to", "test_image");
// 根据区域处理图片
cv::Mat ModifyImage(const cv::Mat image, cm::Rect area) {
...
// 借助宏打印调试信息
Cm_DebugPrint(area, image.size());
// 借助宏打印调试信息
Cm_DebugCPrint(cv::countNonZero(cm::Projection(image).Image(cm::HDIR, area)), cm::Projection(image).Row(area.x, {area.y, area.y + area.height));
}
// 测试函数1
void Test1(cm::Rect area, cv::Mat image) {
area.Translate(9, 10);
// 开启一个新的输出图片计数器,同时设置默认的输出图片名后缀,并输出 Test1 函数第一步操作执行结果
debug.CounterStart("test1").NamedStart("Test1").OutputImage(ModifyImage(image, area));
area.Scale(0.9);
// 输出 Test1 函数第二步操作执行结果,并切回到上一个计数器,同时自动切回到上一个已设置的默认的输出图片名后缀
debug.OutputImage(ModifyImage(image, area)).CounterEnd().NamedEnd();
// 不定参数、不定类型打印变量及其参数名
debug.CPrint(area, image.size());
}
// 测试函数2
void Test2(cv::Mat image, const std::vectro<double>& scale_list) {
cm::Rect area(67, 23, 281, 382);
for(int i = 0; i < scale_list.size(); ++i) {
cm::Rect new_area(area);
new_area.Scale(scale_list[i]);
// 开启一个新的输出图片计数器,同时设置默认的输出图片名后缀,并输出 Test2 函数第一步操作执行结果
debug.CounterStart("test2").NamedStart("Test2").OutputImage(ModifyImage(image, new_area));
Test1(new_area, image);
// 输出 Test2 函数第二步操作执行结果,并关闭计数器,同时撤销默认的输出图片名后缀的设置
debug.OutputImage(ModifyImage(image, new_area)).CounterEnd().NamedEnd();
// 不定参数、不定类型打印变量,设置控制台输出没有颜色
debug.Print("__NO_COLOR__", i, area, new_area, scale_list[i]);
}
}
// 假设输入的 scale_list = {1.2, 1.5},按照执行顺序,输出的图片目录如下:
// /path/to/test_image_Test2_0.jpg
// /path/to/test_image_Test1_0.jpg
// /path/to/test_image_Test1_1.jpg
// /path/to/test_image_Test2_1.jpg
// /path/to/test_image_Test2_2.jpg
// /path/to/test_image_Test1_2.jpg
// /path/to/test_image_Test1_3.jpg
// /path/to/test_image_Test2_3.jpg- Linux 系统或 Windows 系统;
- C++11 以上。
-
安装 Cmake
1. 安装 bzip2、unzip、mlocate 和 gcc
yum -y install bzip2 yum –y install unzip yum install mlocate sudo yum install gcc sudo yum install gcc-c++
2. 安装或升级 cmake
- 下载
wget https://cmake.org/files/v3.6/cmake-3.6.3.tar.gz
- 解压
tar xvf cmake-3.6.3.tar.gz
- 删除旧版本
如果系统中存在 cmake 旧版本,则删除旧版本。
yum remove cmake -y
- 编译安装
cd cmake-3.6.3 ./bootstrap gmake sudo gmake install- 测试
cmake --version ## 输出 `cmake version 3.6.3` 即可 -
安装下载 OpenCV
-
方法一:从官网下载 OpenCV
-
方法二:通过 wget 下载,自行解压编译安装
wget https://codeload.github.com/opencv/opencv/zip/4.0.0
以下介绍不做特别说明时,均以安装 OpenCV 4.0.0 为例。
-
编译
- 安装依赖库
sudo yum install gtk2-devel python-devel numpy libdc1394-devel libv4l-devel gstreamer-plugins-base-devel ant libpng-devel jasper-devel openexr-devel libwebp-devel libjpeg-turbo-devel libtiff-devel
- 解压 OpenCV
unzip 4.0.0.zip
- 创建并进入 build 目录
cd opencv-4.0.0 mkdir build cd build
- cmake
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_SHARED_LIBS=OFF -D BUILD_PNG=ON -D BUILD_JASPER=ON -D BUILD_JPEG=ON -D BUILD_TIFF=ON -D BUILD_ZLIB=ON -D BUILD_OPENEXR=ON -D BUILD_IPP_IW=ON -D BUILD_ITT=ON -D BUILD_IPP_IW=ON -D BUILD_TBB=ON -D BUILD_WEBP=ON -D WITH_JPEG=ON -D WITH_PNG=ON -D WITH_JASPER=ON -D WITH_TIFF=ON WITH_OPENEXR=ON -D WITH_WEBP=ON -D WITH_ITT=ON -D WITH_IPP=ON -D WITH_GTK=ON -D WITH_GTK_2_X=ON ..
- make
make -j8 sudo make install
-
-
将库源代码引入到项目之中
- 拷贝 "include" 将源代码中的 "include" 文件夹下的 "common" 目录以及 "common.h" 文件复制到工程的 include 目录下。
- 拷贝 "src" 将源代码中的 "src" 文件夹下的 "common" 复制到工程的 src 目录下。
-
编写 CmakeList.txt 将库文件加入到编译过程之中
- 创建一个名为
DEBUG_VALUE的变量,在进行整个项目的 CMake 编译时,当CMAKE_BUILD_TYPE变量为Debug时,将该变量设为 1。在本库的某些模块中,例如 "debug" 模块的特定方法调用时,需要启用该变量
#[[设定编译器选项]] if(CMAKE_BUILD_TYPE MATCHES "Debug") message("-- Mode: ${CMAKE_BUILD_TYPE}") # Debug add_definitions(-DDEBUG_VALUE=1) else() message("-- Mode: ${CMAKE_BUILD_TYPE}") # Release add_definitions(-DDEBUG_VALUE=0) endif()
- 导入 OpenCV 的库,找到系统安装的 OpenCV 的库位置
#[[设定头文件搜索路径]] include_directories(/usr/local/include/opencv4)
- 定位到项目 CmakeList.txt 中的 include_directories 和 file 下将文件自动加入编译之中
#[[设定头文件搜索路径]] include_directories(${PROJECT_SOURCE_DIR}/include) #[[获取 src/common 目录中的需要使用的 .cpp 文件]] file(GLOB_RECURSE COMMON_SOURCE_FILES ${PROJECT_SOURCE_DIR}/src/common/*.cpp) #[[源文件添加到可执行文件]] add_executable(cpp_project ${COMMON_SOURCE_FILES})
- 创建一个名为
-
调用库模块
项目的使用,可以导入头文件
#include "common.h"快速使用,注意需要声明命名空间cm比如(具体请参考文档)
// 使用自定义的点 cm::Point<int> pt(1,1);
-
版本要求 >= 4.0.0
-
依赖库
模块名 说明 项目是否必须 核心模块(core) 提供了图像处理、数组操作、矩阵运算等基本功能, Eigen 、zlib 、 libjpeg 等 必须 图像 I/O 模块(imgcodecs) 用于读取和写入不同格式的图像文件,比如 libpng 、libjpeg 、 libtiff、libwebp 等 必须 绘图模块(imgproc) 提供了各种图像处理和绘图函数,如滤波、边缘检测、形态学操作、直方图等 必须 特征检测和描述子模块(features2d) 包括了各种特征点检测、描述子提取和匹配算法,如 SIFT、SURF、ORB 等 非必须 目标检测模块(objdetect) 提供了各种目标检测和识别算法,如 Haar 特征和级联分类器 非必须 机器学习模块(ml) 实现了一些常见的机器学习算法,如 k-最近邻、支持向量机等 非必须 深度学习模块(dnn) 集成了深度学习模型,可以使用预训练的神经网络进行图像分类、目标检测等 非必须 摄像机标定模块(calib3d) 提供了相机标定和立体视觉相关的函数和算法 非必须 视频 I/O 模块(videoio) 用于读取和写入视频文件,以及视频流的捕获和播放 非必须 图像配准和重建模块(stitching) 用于图像拼接和全景图像生成 非必须 计算机视觉工具箱模块(cv) 提供了各种计算机视觉的工具函数和类 必须 -
安装教程
详细参考 "准备" 中安装下载 OpenCV