opencv 表格识别之表格透视矫正(二)

2023-11-04

上一篇文章中给出了一种对表格进行矫正的方法,但是只能用于只有一个表格的情况,对于有多个表格的情况的矫正的方法,将在这篇文章中给出。

单个表格矫正:链接

一, 函数的介绍

(1)Homography(.....)函数返回映射关系H(3*3的矩阵)
 

CV_EXPORTS_W Mat findHomography( 
				InputArray srcPoints, 
				InputArray dstPoints,
                                int method=0, 
                                double ransacReprojThreshold=3,
                                OutputArray mask=noArray());

srcPoints,dstPoints是两视图中匹配的点
method 是计算单应矩阵所使用的方法,是一个枚举值。
ransacReprojThreshold 是允许的最大反投影错误,只在使用RANSAC方法时有效。
mask指出匹配的点是不是离群值,用来优化匹配结果。

在这里,我们只用前两个 参数,也就是待矫正的图像的四个点,与模板图像的四个点(这四个点我们取图像中最大的表格的四个角,因为最大的表格比较好找),找出这两个点的映射关系,再通过warpPerspective(....)函数对待矫正的图像进行H映射。      

(2)warpPerspective(....)对图像进行变换

void warpPerspective(InputArray src, 	//输入图像
 OutputArray dst,			//输出图像 
 lnputArray M,				//透视变换矩阵
 Size dsize, 				//输出图像的大小
 int flags=INTER_LINEAR,	        //输出图像的插值方法
 int borderMode=BORDER_CONSTANT, 	//边界的处理方法
  const Scalar& borderValue=Scalar())	//边界的颜色

透视变换矩阵就是H。

 二,具体步骤

第一张是模板图像,第二张是待矫正的图像,我们要找出模板图像的最大的表格,和待矫正的第图像的最大的表格,然后通过两个最大表格的四个顶点得到映射矩阵。

                                                                                               图一

                                                                                                图二

        //提取轮廓 
	vector<Vec4i> hierarchy;
	std::vector<std::vector<cv::Point> > contours;
	cv::findContours(bw, contours, hierarchy, CV_RETR_LIST, CHAIN_APPROX_SIMPLE);

												//逼近多边形
	vector<vector<Point2f> > contours_poly(contours.size());
        
        //最大的表格的下标和面积
	int indexMax = 0;
	double areaMax = 0;
	for (size_t i = 0; i < contours.size(); i++)
	{
		//面积
		double area = contourArea(contours[i]);

		//筛选可能存在且不代表表的单独的行的行。
		if (area < 20) // value is randomly chosen
			continue;

		//逼近区域成为一个形状
		approxPolyDP(Mat(contours[i]), contours_poly[i], 10, true);

		//找出面积最大的四边形
		if (area > areaMax)
		{
			areaMax = area;
			indexMax = i;
		}
	}
        
        //画出最大的表格的形状
	Scalar color(0, 0, 255);
	drawContours(srcClone, contours, indexMax, color, 1, 8);
	imshow("contou1", srcClone);
	waitKey();

	std::vector<cv::Point2f>  pts_dst;

        //将待矫正的表格的四个顶点按顺时针排序
	sortPoint(contours_poly[indexMax], pts_dst);
	//将模板比表格的四个顶点按照顺时针排序
        sortPoint(pts_src, pts_src);
        
        //得到映射函数
	Mat h = findHomography(pts_dst, pts_src);
        //根据映射函数进行矫正
	warpPerspective(src, dst, h, srcImageSize);

矫正后的表格:

相比于第一个方法,这个整体矫正的方法,显然更符合我们项目需要的结果。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv 表格识别之表格透视矫正(二) 的相关文章

随机推荐

  • [远程办公] 通过阿里云反向代理实现内网穿透

    准备工作 购买一台阿里云服务器 新用户第一个月免费 由于仅作数据转发用 配置要求不高 除了传输带宽外 其余配置选最低的就行 内网主机 生成ssh密匙 ssh keygen 与远程主机建立免密登录ssh copy id root ip 安装依
  • docker安装tomcat,以及常用操作

    1 安装tomcat镜像 访问docker hub仓库找出你想安装的版本 docker hub 网址 https registry hub docker com 直接在搜索框里搜tomcat就可以 如果想把自己镜像放到上边就自己注册一个账号
  • Docker 搭建sonarqube,并集成阿里P3C规则

    简介 本文安装的sonarqube是7 6 community版本 未安装最新版是因为7 9之后不再支持mysql 如果你安装的是其他版本的sonarqube 那么不要使用插件包中的插件 会有版本兼容性问题 插件 插件包 插件包中包含jav
  • Android:Action 与 Data 属性

    前言 Intent 的中文翻译就是 意图 的意思 它是 Android 程序中传输数据的核心对象 在 Android 官方文档中 对 Intent 的定义是执行某操作的一个抽象描述 一个 Intent 对象实质上是一组被捆绑的信息 它可以是
  • JAVA maven 编写UDF适用于hive和impala

    hive 内置函数很少 我们可以通过自定义的方式添加新的UDF上去 来增强hive的处理能力 比如hive没有字符串包含的UDF 我们通过Java maven的方式来编写一个字符串包含的UDF 1 新建maven工程 2 修改pom xml
  • android studio升级指定版本,Android studio升级到3.3遇到的问题

    问题一 android native 的方法无法与cpp中方法关联 问题二 External Native Build Issues Error configuring 最近由于用opencv 做物体识别的demo 然后新建一个工程 含有C
  • 日志记录的几个重要地方

    在和经理聊天之前自己对日志的打印是比较随意的 没有太多的在意细节 在聊天之后发现这几个地方的日志是必须的 1 参数配置 一般项目启动时就会加载参数 日志级别为fatal 这是一定会打印的 让我们清楚的知晓参数加载的情况 2 数据进来的时候
  • springboot接口接收数组及多个参数的解决方案

    本例为个人经历 必然存在认知局限与不足 欢迎指正以及提供更好方法 若接口中需要接受数组 那么接口应该如何写呢 一般而言我们会想到 PostMapping xxxx public String test List list do sth 假设
  • 2013年计算机试题(四),2013年计算机一级考试试题(精简版):第四套

    无忧考网为大家收集整理了 2013年计算机一级考试试题 精简版 第四套 供大家参考 希望对大家有所帮助 第一部分 单选题 每小题1分 共30分 注意 打开你的考试文件夹中的EXCEL工作簿文件 单选题答题卡D XLS 将下列选择题的答案填入
  • pytorch:本地可视化服务器的tensorboard

    摘要 由于服务器上的系统是无界面系统 无法使用tensorboard进行可视化 但是可以在本地可视化服务器上的tensorboard tensorboard的安装以及命令行的使用已经在上一篇博客介绍过 这里不再阐述 不清楚的可以访问pyto
  • 基于SSM的疫苗接种平台

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 Vue 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Maven项目 是
  • 计算方法--函数插值

    文章目录 插值多项式的存在唯一性定理 1 拉格朗日插值 Lagrange 线性插值 公式 分段线性插值函数的余项 抛物插值 公式 拉格朗日插值 插值余项定理 条件 公式 误差估计 2 Newton插值公式 差商 性质 Newton插值多项式
  • 华为OD机试 - 区间交集(Java)

    题目描述 给定一组闭区间 其中部分区间存在交集 任意两个给定区间的交集 称为公共区间 如 1 2 2 3 的公共区间为 2 2 3 5 3 6 的公共区间为 3 5 公共区间之间若存在交集 则需要合并 如 1 3 3 5 区间存在交集 3
  • 实验七-通过JDBC转移异构数据库中数据

    通过ODBC JDBC转移异构数据库中数据 实验环境 Windows 10操作系统 MySQL 8 0 SQL Server 2019 eclipse2021 09 实验内容与完成情况 实验目的 学会配置ODBC JDBC数据源 熟悉使用O
  • etcd配置参数

    成员相关配置项 name data dir wal dir snapshot count heartbeat interval election timeout listen peer urls listen client urls max
  • CSS——表格和表单

    第六章 CSS的表格和表单 文章目录 第六章 CSS的表格和表单 一 表格 二 表单 总结 一 表格 表格标签 标签 描述 lt table gt 表格标签 lt tr gt 表格行标签 lt td gt 普通单元格标签 lt th gt
  • win7计算机窗口左边被改了,win7电脑开始菜单变成经典模式?三种方法教你改回来...

    今天小编一开电脑 觉得怪怪的 怎么感觉电脑桌面不太一样了 仔细一看 原来是系统开始菜单变成经典模式了 很不习惯 那怎么恢复呢 今天小编就以win7系统为例 教大家怎么改回来 方法一 1 在桌面空白处单击鼠标右键 选择个性化 2 鼠标左键单击
  • 【app逆向】Frida-rpc 的常用python脚本

    1 1 Frida rpc常用脚本 在执行frida rpc时 会涉及到先关参数类型的处理和转换 例如 python程序调用时 传入参数 frida的JavaScript脚本如何获取参数 JavaScript的参数如何转换到 Java中所需
  • Endnote参考文献分享与导入

    Endnote参考文献分享与导入 转移 文章发给老师如何将参考文献一同发送 软件版本为X8 一 分享 首先找到Endnote library的位置 将两个文件 一个是后缀为enl的数据库文件和另一个是 data文件夹 一起复制到一个文件夹
  • opencv 表格识别之表格透视矫正(二)

    上一篇文章中给出了一种对表格进行矫正的方法 但是只能用于只有一个表格的情况 对于有多个表格的情况的矫正的方法 将在这篇文章中给出 单个表格矫正 链接 一 函数的介绍 1 Homography 函数返回映射关系H 3 3的矩阵 CV EXPO