首先抛出一个问题,给定一系列二维平面上的的点,这些点是可以组成一个封闭的二维图形。因为这些点是矩形区域拍摄图像后识别得到的图形的边界点,所以我们要抽象出来这个矩形,也就是我们要反映出这个矩形。问题是在拍照的时候摄像头可能不是正对着图形的,那么矩形就必然在图像上反映为一个四边形, 如下图所示。

那怎么得到这个四边形的四个顶点呢?使用经典图像处理的算法的话可以使用OpenCV提供了几个和矩形相关的函数接口。另一类就是使用机器学习类算法检测定位四个角点。首先来看看使用经典图像处理的算法来进行解决。

1.最小包络正矩形

Rect boundingRect(InputArray points)函数会给我们传入的边界点计算得到一个最小的包络正矩形,并输出这个正矩形的顶点。

import cv2
from matplotlib import pyplot as plt
import numpy as np
image = cv2.imread("0.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(image, contours, -1, (255, 0, 0), 2)x, y, w, h = cv2.boundingRect(contours[0])
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)plt.imshow(image)
plt.show()

2.最小包络矩形

RotatedRect minAreaRect(InputArray points)和上面的使用方法一样,但是这次我们得到的是一个带有旋转角度的矩形,这个就更贴近实际的形状。

import cv2
from matplotlib import pyplot as plt
import numpy as np
image = cv2.imread("0.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(image, contours, -1, (255, 0, 0), 2)rect = cv2.minAreaRect(contours[0])
#box = cv2.cv.BoxPoints(rect)  # for OpenCV 2.x
box = cv2.boxPoints(rect)      # for OpenCV 3.x
box = np.int0(box)
cv2.drawContours(image, [box], 0, (0, 0, 255), 2)plt.imshow(image)
plt.show()

3.使用边界点进行拟合得到四边形

这种方法是将边界点进行拟合,将边界点减少到4个点,这样就得到了一个四边形了。这个方法来自于opencv官方给出的example里面的find_squares.

import cv2
from matplotlib import pyplot as plt
import numpy as np
image = cv2.imread("0.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(image, contours, -1, (255, 0, 0), 2)cnt_len = cv2.arcLength(contours[0], True)
cnt = cv2.approxPolyDP(contours[0], 0.02*cnt_len, True)
if len(cnt) == 4:cv2.drawContours(image, [cnt], -1, (255, 255, 0), 3 )
plt.imshow(image)
plt.show()

4.最小包络四边形

第三种办法可以解决大多数情况下的问题,但是如果说我们的四边形的图像中一个角缺少很小的一块,那么得到的四边形很可能就完全和想象中不同了。原因就是拟合的过程将图形“变小”了。那么有没有一种最小包络四边形的算法呢?有!凸多边形最小面积四边形包围盒算法这个论文里面提供了一种计算的方法,而且A suite of minimal bounding objects-minboundquad()
实现了这个方法。但是这个算法的复杂度是O(n^4), n表示的是边界点构成的边的个数。相比第三种办法中的拟合方法复杂度显然是有点太高,特别是当我们的边界点比较多的时候。不过它能解决第三种方法中缺少角出现的问题。

谈谈OpenCV中的四边形相关推荐

  1. 分段线性插值c语言程序_【短道速滑】OpenCV中cvResize函数使用双线性插值缩小图像长宽大小一半时速度飞快(比最近邻还快)之异象解析和自我实现。...

    点击上方↑↑↑"OpenCV学堂"关注我 作者网名:laviewpbt 是图像处理,算法实现与加速优化方面的大神!其开发的imageshop软件大小只有1MB,却实现了非常丰富与复 ...

  2. OpenCV中的「透视变换 / 投影变换 / 单应性」—cv.warpPerspective、cv.findHomography

    文章目录 引言 透视变换(projective transform) 单应性(Homography) opencv代码 仿射变换相关函数 投影变换相关的函数 鸟瞰图代码示例 小结 引言 图像的几何变换 ...

  3. [OpenCV实战]39 在OpenCV中使用ArUco标记的增强现实

    文章目录 1 什么是ArUco标记? 2 在OpenCV中生成ArUco标记 3 检测Aruco标记 4 增强现实应用 5 总结和代码 5.1 生成aruco标记 5.2 使用aruco增强现实 6 ...

  4. OpenCV进阶(10)在 OpenCV 中使用 ArUco 标记的增强现实

    在这篇文章中,我们将解释什么是 ArUco 标记,以及如何使用 OpenCV 将它们用于简单的增强现实任务. ArUco 标记已经在增强现实.相机姿态估计和相机校准中使用了一段时间.让我们更多地了解它 ...

  5. OpenCV学习笔记(12)——OpenCV中的轮廓

    什么是轮廓 找轮廓.绘制轮廓等 1.什么是轮廓 轮廓可看做将连续的点(连着边界)连在一起的曲线,具有相同的颜色和灰度.轮廓在形态分析和物体的检测和识别中很有用. 为了更加准确,要使用二值化图像.在寻找 ...

  6. OpenCV中的光流及视频特征点追踪

    OpenCV中的光流及视频特征点追踪 1. 效果图 2. 原理 2.1 什么是光流?光流追踪的前提.原理 2.2 光流的应用 2.3 光流的2种方法 3. 源码 3.2 稀疏光流追踪 3.2 优化版稀 ...

  7. Python,OpenCV中的图像修复——cv2.inpaint()

    Python,OpenCV中的图像修复--cv2.inpaint 1. 效果图 2. 原理 3. 源码 参考 image inpainting 图像修改 这篇博客将介绍如何通过OpenCV中图像修复的 ...

  8. Python,OpenCV中的K均值聚类——K-Means Cluster

    Python,OpenCV中的K均值聚类 1. 效果图 2. 原理 2.1 什么是K均值聚类? 2.2 K均值聚类过程 2.3 cv2.kmeans(z, 2, None, criteria, 10, ...

  9. OpenCV中的SURF(Speeded-Up Robust Features 加速鲁棒特征)

    OpenCV中的SURF(加速健壮功能) 1. 效果图 2. 原理 2.1 为什么SURF比SIFT快? 2.3 怎样获取SIFT与SURF? 3. 源码 参考 上一篇博客介绍了用于关键点检测和描述的 ...

最新文章

  1. 阿里AI labs发布两大天猫精灵新品,将与平头哥共同定制智能语音芯片
  2. javascript中的constructor
  3. 连续低频脑电图解码手臂运动,实现机械手臂的闭环自然控制
  4. MYSQL基础语法的使用
  5. 下列不可以判断网页是否正常打开的是_打开视频卡、无法加载原因查找
  6. 数据链路层协议_数据链路层 基本数据链路协议
  7. 设计模式三之抽象工厂模式
  8. python内存管理和释放_《python解释器源码剖析》第17章--python的内存管理与垃圾回收...
  9. 云计算设计模式(一)缓存预留模式
  10. 十个问题理解Linux epoll工作原理:惊群,
  11. JAVA线程池_并发队列工作笔记0003---线程池的分类_可缓存线程池_定长线程池_定时线程池_单例线程池
  12. JFrame小练习1
  13. java web 插件式开发_Java Web 后台开发效率提高:插件讲解
  14. python怎么使用-如何使用 Python 开始建立
  15. 我在开发中所遇到的iOS7新特性以及iOS7与iOS6的适配问题总结
  16. lvs的dr和nat模式配置备忘
  17. 分享一个vue项目“脚手架”项目的实现步骤
  18. Differential Privacy差分隐私
  19. Git之git pull【warning】Pulling without specifying how to reconcile divergent branches is
  20. 软件项目中的角色以及英文简称

热门文章

  1. 学习笔记之-----H5API
  2. App推广渠道追踪技术更新及应用
  3. 三级网络技术(七.路由器)
  4. proxmark3 复制 M1 卡和 CUID卡的方法
  5. qq录屏怎么弄?图文教程,教你如何使用qq录屏
  6. 东方甄选三个月直播带货20亿
  7. 物联网开发框架Niagara - Part1概述
  8. ug在哪看服务器运行,ug的服务器怎么打开?
  9. Python+OpenCV进行人脸检测(调用笔记本摄像头)
  10. 科研绘图素材计算机,科研图表作图素材.pptx