Skip to content

dreamy-xay/TableLineDetectionToolkit

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

介绍

表格线识别通用库是一款基于传统算法的图像处理工具,旨在为开发者提供便捷高效的表格线识别功能。

特点

1. 有丰富的开发组件

模块名 组件 中文名 说明
"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" 字符串 实现了与字符串相关的操作

2. 灵活的调试功能

可以在程序的任何位置通过调试器进行交互,令其打印内部数据,或是批量输出内部图片。当程序出现各种程序异常,如:断言、异常等,将会在控制台中打印完整的错误信息。这极大地降低了调试难度,提升了开发效率和调试体验。

// 调试器
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

使用 Cmake 编译

  • 将库源代码引入到项目之中

    • 拷贝 "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);

外部库依赖

OpenCV

  • 版本要求 >= 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

About

An image processing library for table line detection

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors