文档扫描仪的构建——使用Python,OpenCV应用透视变换来获得图像的自顶向下的“鸟瞰图”
使用Python,OpenCV应用透视变换来获得图像的自顶向下的“鸟瞰图”
- 1. 效果图
- 2. 应用透视变换的步骤
- 3. 优化:矩形角点的获取
- 4. 源码
- 参考
这篇博客演示了如何使用4点OpenCV getPerspectiveTransform来构建一个文档扫描仪应用程序!
1. 效果图
左图是原图,右图是应用透视变换得到的自顶向下的“鸟瞰图”
同样的“鸟瞰图”
橙色是最小外接矩形 boundingRect结果
绿色是面积最小外接矩形 minAreaRect的结果
红色是轮廓近似的结果
2. 应用透视变换的步骤
- 轮廓检测获取左图中矩形框的四个角点
- 对四个角点按(左上、右上、左下、右下进行排序)
- 确定新图像的宽度与高度;
- 获取转换矩阵;
- 应用透视变换获得“鸟瞰图”;
3. 优化:矩形角点的获取
通过了findContours,轮廓检测来近似获取角点;
图中是矩形,因此用进来轮廓后4个点来进行判断;其他的 如三角形、圆形、正方形、多边形等的检测可以参考我之前的博客;
4. 源码
# USAGE
# python transform_example.py --image images/example_01.png --coords "[(73, 239), (356, 117), (475, 265), (187, 443)]"# 导入必要的包
import argparse
import sysimport cv2
import imutils
import numpy as np
from imutils.perspective import four_point_transform# 构建命令行参数及解析
# --image 原始图像路径
# 四点的坐标,ROI图像区域
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", default='images/example_01.png', help="path to the image file")
ap.add_argument("-c", "--coords", default='[(73, 239), (356, 117), (475, 265), (187, 443)]',help="comma seperated list of source points")
args = vars(ap.parse_args())# 加载图像 并获取其坐标List
image = cv2.imread(args["image"])pts = np.array(eval(args["coords"]), dtype="float32")
print(type(pts))
print(pts)def getROI(image):gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)blurred = cv2.GaussianBlur(gray, (5, 5), 0)edged = cv2.Canny(blurred, 75, 200)# 应用轮廓检测获取轮廓cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)cnts = imutils.grab_contours(cnts)if cnts is not None:# 外接矩形(x, y, w, h) = cv2.boundingRect(cnts[0])peri = cv2.arcLength(cnts[0], True)approx = cv2.approxPolyDP(cnts[0], 0.04 * peri, True)cv2.rectangle(image, (x - 5, y - 5), (x + w, y + h), (0, 128, 255), 0)# 面积最小外接矩形box = cv2.minAreaRect(cnts[0])box = cv2.cv.BoxPoints(box) if imutils.is_cv2() else cv2.boxPoints(box)box = np.array(box, dtype="int")cv2.drawContours(image, [box], -1, (0, 255, 0), 2)# 展示输出图像# cv2.imshow("output", image)# cv2.waitKey(0)# 轮廓是由一系列顶点组成的;如果是三角形,将拥有3个向量. 如果是正方形/矩形则具有4个向量,如果是正方形,则宽高比在0.95~1.05之间if len(approx) == 4:print('rectangele')a = np.reshape(approx, (4, 2))for i in a:print(i)x = i[0]y = i[1]cv2.circle(image, (x, y), 8, (0, 0, 255), -1)return areturn Nonepts = getROI(image)
if pts is None:print("pts is None...")sys.exit()print(pts)# 应用点变换以获取鸟瞰视图
warped = four_point_transform(image, pts)# 展示原始及变换后的图像
cv2.imshow("Original", image)
cv2.imshow("Warped", warped)
cv2.waitKey(0)
参考
- https://www.pyimagesearch.com/2014/08/25/4-point-opencv-getperspective-transform-example/
文档扫描仪的构建——使用Python,OpenCV应用透视变换来获得图像的自顶向下的“鸟瞰图”相关推荐
- 使用Python,OpenCV构建移动文档扫描仪
使用Python,OpenCV构建移动文档扫描仪 1. 效果图 2. 步骤 3. 源码 参考 1. 效果图 图1,鸟瞰图 图2,角度不太一样,鸟瞰图的效果也不一致: 2. 步骤 使用OpenCV构建文 ...
- 使用 Python 创建自己的文档扫描仪
介绍 对这个项目的动机很简单.我们中的许多人转向了在线工作. 随着在线工作量的增加,人们通常不得不通过电子邮件或其他方式呈现文档的数字化版本.换句话说,将任何文档转换为扫描文档. 本文,将介绍如何使用 ...
- 使用 OpenCV 构建文档扫描仪
介绍 在本文中,我们将使用 OpenCV 库来开发 Python 文档扫描器. OpenCV 的简要概述: OpenCV 是一个开源库,用于各种计算机语言的图像处理,包括 Python.C++ 等.它 ...
- imutils基础(4)构建一个文档扫描仪
用OpenCV构建文档扫描仪只需三个简单步骤: 1.边缘检测 2.使用图像中的边缘来找到代表被扫描纸张的轮廓. 3.应用透视变换来获得文档的自顶向下视图. 只需三步,你就可以将自己的文档扫描应用程序提 ...
- SwiftUI 使用Apple Visionkit构建文档扫描仪
实战需求 SwiftUI 使用Apple Visionkit构建文档扫描仪 本文价值与收获 看完本文后,您将能够作出下面的界面 核心功能 扫描一个或多个文件 共享扫描的文档 如果不需要文件,则删除 基 ...
- SwiftUI OCR功能大全之 基于 SwiftUI 构建文档扫描仪
在这篇文章中,让我们快速了解如何使用文档扫描仪扩展 SwiftUI,该扫描仪使用设备相机扫描 iOS 中的文档. 为了实现这一点,我们将使用 Apple 的Vision框架创建一个VNDocument ...
- 使用语义分割架构的文档扫描仪 DeepLabV3
0 介绍 地址:https://learnopencv.com/deep-learning-based-document-segmentation-using-semantic-segmentatio ...
- python 搜索引擎 实验楼的源码_Python语言之简历有错别字被拒绝聘用?文档被领导说?Python实现永无错别字!...
本文主要向大家介绍了Python语言之简历有错别字被拒绝聘用?文档被领导说?Python实现永无错别字!,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 找出中文错别字 1.5 代 ...
- 富士通ScanSnap的S1500文档扫描仪 - 最佳的方式去无纸化
富士通ScanSnap的S1500文档扫描仪 - 最佳的方式去无纸化 富士通ScanSnap的S1500文档扫描仪是清理所有这些文件是很重要的一个好办法,但都塞满了你的家或办公室.这种扫描仪可以让你保 ...
最新文章
- webService——学习(3):使用JDK开发webService
- VMware虚拟机安装红帽系统无法上网解决办法(转)
- 第十节课-RNN介绍
- python 局部变量 占内存吗_Python中全局变量和局部变量的理解与区别
- 砂.随笔.二十.微笑
- java 注解入门 简书_Java基础-注解
- 吴孟达肝癌逝世:肝被透支的全过程曝光!
- 狂雨CMS小说采集规则 附教程
- sqlserver基本增删查语句
- UGNX1957安装说明视频教程
- 基于张正友标定法的工业机器人视觉标定
- python是最适合初学者的语言
- 如何在PowerPoint中显示,隐藏或调整幻灯片缩略图的大小
- 【Kanzi】1:android编译环境配置
- 前端的图片优化的6种方案
- 低信噪比MIMO SC-FDE系统中信道估计的研究与实现
- 【有问不答】非白色光斑的检测(单个实例)
- 计算机在辅助设计中的应用,计算机辅助设计在艺术设计中的应用
- 0x80073712_win101903版本更新错误0x80073712的解决方法 - 系统家园
- 如何实现css垂直居中
热门文章
- Django 模板4.1
- f是一个python内部变量类型,Python基础变量类型——List浅析
- Android SharedPreferences 的使用
- nginx环境的搭建
- Go 学习笔记(50)— Go 标准库之 net/url(查询转义、查询参数增/删/改/查、解析URL)
- oracle, group by, having, where
- AJAX跨域访问解决方案
- matlab图形绘制基础(东北大学MOOC笔记)
- android检测本地是否安装,在本地测试模块的安装
- AC自动机算法及模板