使用Python,OpenCV应用透视变换来获得图像的自顶向下的“鸟瞰图”

  • 1. 效果图
  • 2. 应用透视变换的步骤
  • 3. 优化:矩形角点的获取
  • 4. 源码
  • 参考

这篇博客演示了如何使用4点OpenCV getPerspectiveTransform来构建一个文档扫描仪应用程序!

1. 效果图

左图是原图,右图是应用透视变换得到的自顶向下的“鸟瞰图”


同样的“鸟瞰图”
橙色是最小外接矩形 boundingRect结果
绿色是面积最小外接矩形 minAreaRect的结果
红色是轮廓近似的结果

2. 应用透视变换的步骤

  1. 轮廓检测获取左图中矩形框的四个角点
  2. 对四个角点按(左上、右上、左下、右下进行排序)
  3. 确定新图像的宽度与高度;
  4. 获取转换矩阵;
  5. 应用透视变换获得“鸟瞰图”;

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应用透视变换来获得图像的自顶向下的“鸟瞰图”相关推荐

  1. 使用Python,OpenCV构建移动文档扫描仪

    使用Python,OpenCV构建移动文档扫描仪 1. 效果图 2. 步骤 3. 源码 参考 1. 效果图 图1,鸟瞰图 图2,角度不太一样,鸟瞰图的效果也不一致: 2. 步骤 使用OpenCV构建文 ...

  2. 使用 Python 创建自己的文档扫描仪

    介绍 对这个项目的动机很简单.我们中的许多人转向了在线工作. 随着在线工作量的增加,人们通常不得不通过电子邮件或其他方式呈现文档的数字化版本.换句话说,将任何文档转换为扫描文档. 本文,将介绍如何使用 ...

  3. 使用 OpenCV 构建文档扫描仪

    介绍 在本文中,我们将使用 OpenCV 库来开发 Python 文档扫描器. OpenCV 的简要概述: OpenCV 是一个开源库,用于各种计算机语言的图像处理,包括 Python.C++ 等.它 ...

  4. imutils基础(4)构建一个文档扫描仪

    用OpenCV构建文档扫描仪只需三个简单步骤: 1.边缘检测 2.使用图像中的边缘来找到代表被扫描纸张的轮廓. 3.应用透视变换来获得文档的自顶向下视图. 只需三步,你就可以将自己的文档扫描应用程序提 ...

  5. SwiftUI 使用Apple Visionkit构建文档扫描仪

    实战需求 SwiftUI 使用Apple Visionkit构建文档扫描仪 本文价值与收获 看完本文后,您将能够作出下面的界面 核心功能 扫描一个或多个文件 共享扫描的文档 如果不需要文件,则删除 基 ...

  6. SwiftUI OCR功能大全之 基于 SwiftUI 构建文档扫描仪

    在这篇文章中,让我们快速了解如何使用文档扫描仪扩展 SwiftUI,该扫描仪使用设备相机扫描 iOS 中的文档. 为了实现这一点,我们将使用 Apple 的Vision框架创建一个VNDocument ...

  7. 使用语义分割架构的文档扫描仪 DeepLabV3

    0 介绍 地址:https://learnopencv.com/deep-learning-based-document-segmentation-using-semantic-segmentatio ...

  8. python 搜索引擎 实验楼的源码_Python语言之简历有错别字被拒绝聘用?文档被领导说?Python实现永无错别字!...

    本文主要向大家介绍了Python语言之简历有错别字被拒绝聘用?文档被领导说?Python实现永无错别字!,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 找出中文错别字 1.5 代 ...

  9. 富士通ScanSnap的S1500文档扫描仪 - 最佳的方式去无纸化

    富士通ScanSnap的S1500文档扫描仪 - 最佳的方式去无纸化 富士通ScanSnap的S1500文档扫描仪是清理所有这些文件是很重要的一个好办法,但都塞满了你的家或办公室.这种扫描仪可以让你保 ...

最新文章

  1. webService——学习(3):使用JDK开发webService
  2. VMware虚拟机安装红帽系统无法上网解决办法(转)
  3. 第十节课-RNN介绍
  4. python 局部变量 占内存吗_Python中全局变量和局部变量的理解与区别
  5. 砂.随笔.二十.微笑
  6. java 注解入门 简书_Java基础-注解
  7. 吴孟达肝癌逝世:肝被透支的全过程曝光!
  8. 狂雨CMS小说采集规则 附教程
  9. sqlserver基本增删查语句
  10. UGNX1957安装说明视频教程
  11. 基于张正友标定法的工业机器人视觉标定
  12. python是最适合初学者的语言
  13. 如何在PowerPoint中显示,隐藏或调整幻灯片缩略图的大小
  14. 【Kanzi】1:android编译环境配置
  15. 前端的图片优化的6种方案
  16. 低信噪比MIMO SC-FDE系统中信道估计的研究与实现
  17. 【有问不答】非白色光斑的检测(单个实例)
  18. 计算机在辅助设计中的应用,计算机辅助设计在艺术设计中的应用
  19. 0x80073712_win101903版本更新错误0x80073712的解决方法 - 系统家园
  20. 如何实现css垂直居中

热门文章

  1. Django 模板4.1
  2. f是一个python内部变量类型,Python基础变量类型——List浅析
  3. Android SharedPreferences 的使用
  4. nginx环境的搭建
  5. Go 学习笔记(50)— Go 标准库之 net/url(查询转义、查询参数增/删/改/查、解析URL)
  6. oracle, group by, having, where
  7. AJAX跨域访问解决方案
  8. matlab图形绘制基础(东北大学MOOC笔记)
  9. android检测本地是否安装,在本地测试模块的安装
  10. AC自动机算法及模板