OpenCV凸包检测和凸缺陷学习示例

目录
  • 1、凸包检测与凸缺陷定义
  • 2、opencv相关实现函数
  • 3、代码实践
  • 4、总结

1、凸包检测与凸缺陷定义

凸包是将最外层的点连接起来构成的凸多边形,它能包含点击中所有的点。物体的凸包检测常应用在物体识别、手势识别及边界检测等领域。

凸包检测常常用在轮廓分析之后。对二值图像进行轮廓分析之后,可以构建每个轮廓的凸包,构建完成之后会返回该凸包包含的点集。根据返回的凸包点集可以绘制该轮廓对应的凸包。一般来说,凸性曲线总是凸出来的,至少是平的。如果有地方凹进去了就被叫做凸性缺陷。

下图可以更加直接的了解凸包和凸缺陷的定义:

2、opencv相关实现函数

OpenCV中提供了函数convexHull 用于对物体轮廓凸包进行检测,函数convexityDefect进行凸缺陷的检测。首先来了解一下各参数意义:

hull = cv2.convexHull(points, clockwise, returnpoints)

各参数意义:

points:输入的轮廓点集

clockwise:方向标志,如果设置为True,输出的凸包是顺时针方向的,否则为逆时针方向。

returnPoints:是否返回点集

hull : 输出凸包结果,当参数returnPoints为ture的时候返回凸包的顶点坐标是个点集、returnPoints为false的是返回与凸包点对应的轮廓上的点对应的index

下面这个函数可以帮助我们找到凸缺陷:

convexityDefects = cv2.convexityDefect(contour, convexhull)

注意:

进行凸检测时,凸包检测中的returnPoints要设置为False

凸缺陷返回一个数组,每一行包含值是起点,终点,最远的点,到最远点的近似距离,返回的前三个点都是轮廓索引。

contour: 检测到的轮廓,可以调用findContours函数得到

convexhull:检测到的凸包,可以调用convexHull函数得到。

convexityDefects:输出参数,检测到的最终结果,返回一个数组,其中每一行包含的值是[起点,终点,最远的点,到最远点的近似距离]。前三个点都是轮廓索引。

前三个值得含义分别为:凸缺陷的起始点,凸缺陷的终点,凸缺陷的最深点(即边缘点到凸包距离最大点)

3、代码实践

我们可以在一张图上显示轮廓的凸包和凸缺陷。

我们将起点和终点用一条红线 连接,在最远点画一个蓝色的圆圈,要记住的是返回结果的前三个值是轮廓点的索引。 所以我们还要到轮廓点中去找它们。

前三个值得含义分别为:凸缺陷的起始点,凸缺陷的终点,凸缺陷的最深点(即边缘点到凸包距离最大点)。

凸包检测和凸缺陷检测的代码如下:

# 凸包检测和凸缺陷
import cv2 as cv
# 读取图像
src1 = cv.imread("000.jpg")
# 转换为灰度图像
gray = cv.cvtColor(src1, cv.COLOR_BGR2GRAY)
# 二值化
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
# 获取结构元素
k = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
# 开操作
binary = cv.morphologyEx(binary, cv.MORPH_OPEN, k)
# 轮廓发现
contours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
# 在原图上绘制轮廓,以方便和凸包对比,发现凸缺陷
cv.drawContours(src1, contours, -1, (0, 225, 0), 3)
for c in range(len(contours)):
    # 是否为凸包
    ret = cv.isContourConvex(contours[c])
    # 凸缺陷
    # 凸包检测,returnPoints为false的是返回与凸包点对应的轮廓上的点对应的index
    hull = cv.convexHull(contours[c], returnPoints=False)
    defects = cv.convexityDefects(contours[c], hull)
    print('defects', defects)
    for j in range(defects.shape[0]):
        s, e, f, d = defects[j, 0]
        start = tuple(contours[c][s][0])
        end = tuple(contours[c][e][0])
        far = tuple(contours[c][f][0])
        # 用红色连接凸缺陷的起始点和终止点
        cv.line(src1, start, end, (0, 0, 225), 2)
        # 用蓝色最远点画一个圆圈
        cv.circle(src1, far, 5, (225, 0, 0), -1)
# 显示
cv.imshow("result", src1)
cv.waitKey(0)
cv.destroyAllWindows()

凸缺陷的部分输出:前三个为凸缺陷的起始点,凸缺陷的终点,凸缺陷的最深点(即边缘点到凸包距离最大点)。凸包检测输出的也是轮廓上的点的索引。

凸缺陷检测的效果图:

红色为凸包,蓝色点为凸缺陷的最深点(即边缘点到凸包距离最大点),绿色是轮廓。红色与绿色之间的区域即为凸缺陷。

4、总结

(1)cv2.convexityDefect函数进行凸缺陷检测时,凸包检测函数中cv2.convexHull中的returnPoints要设置为False,返回轮廓中与凸包点对应的轮廓点的index。

(2)cv2.convexityDefect函数的返回值是一系列数组,[凸缺陷的起点,凸缺陷的终点,凸缺陷的最深的点,到最远点的近似距离],前三个是索引值,终点和起点连接即得到凸包。

(3)凸缺陷的最深的点:即边缘点到凸包距离最大点到最远点的近似距离:边缘点到凸包的最大距离。

(4)利用凸包检测可以得到进一步的轮廓信息,可进行边界检测,结合凸缺陷可以实现手势识别和物体识别。

以上就是OpenCV凸包检测和凸缺陷学习示例的详细内容,更多关于OpenCV凸包检测和凸缺陷的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python-OpenCV实现图像缺陷检测的实例

    在Jupyter Notebook上使用Python+opencv实现如下图像缺陷检测.关于opencv库的安装可以参考:Python下opencv库的安装过程与一些问题汇总. 1.实现代码 import cv2 import numpy from PIL import Image, ImageDraw, ImageFont #用于给图片添加中文字符 def ImgText_CN(img, text, left, top, textColor=(0, 255, 0), textSize=20):

  • python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)

    一.利用直方图的方式进行批量的图片缺陷检测(方法简单) 二.步骤(完整代码见最后) 2.1灰度转换(将原图和要检测对比的图分开灰度化) 灰度化的作用是因为后面的直方图比较需要以像素256为基准进行相关性比较 img = cv2.imread("0.bmp") #原图灰度转换 gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) #循环要检测的图,均灰度化 for i in range(1, 6): t1=cv2.cvtColor(cv2.imread

  • Python opencv缺陷检测的实现及问题解决

    题目描述 利用opencv或其他工具编写程序实现缺陷检测. 实现过程 # -*- coding: utf-8 -*- ''' 作者 : 丁毅 开发时间 : 2021/4/21 15:30 ''' import cv2 import numpy as np from PIL import Image, ImageDraw, ImageFont import matplotlib.pyplot as plt #用于给图片添加中文字符的函数 def cv2ImgAddText(img, text, l

  • OpenCV-Python实现凸包的获取

    前言 逼近多边形是某个图像轮廓的高度近似,而凸包的提出是为了简化逼近多边形的.其实,凸包跟逼近多边形很像,只不过它是物体最外层的"凸"多边形. 简单的概括,凸包是指完全包含原有轮廓,并且仅由轮廓上的点所构成的多边形.凸包的特点是每一处都是凸的,即在凸包内连接任意两点的直线都在凸包的内部,并且任意连续3个点的内角小于180度. 在OpenCV中,它给我们提供cv2.convexHull()来获取轮廓的凸包.其完整定义如下: def convexHull(points, hull=None

  • OpenCV凸包检测和凸缺陷学习示例

    目录 1.凸包检测与凸缺陷定义 2.opencv相关实现函数 3.代码实践 4.总结 1.凸包检测与凸缺陷定义 凸包是将最外层的点连接起来构成的凸多边形,它能包含点击中所有的点.物体的凸包检测常应用在物体识别.手势识别及边界检测等领域. 凸包检测常常用在轮廓分析之后.对二值图像进行轮廓分析之后,可以构建每个轮廓的凸包,构建完成之后会返回该凸包包含的点集.根据返回的凸包点集可以绘制该轮廓对应的凸包.一般来说,凸性曲线总是凸出来的,至少是平的.如果有地方凹进去了就被叫做凸性缺陷. 下图可以更加直接的

  • OpenCV实现物体的凸包检测的示例代码

    目录 1. 凸包 2.寻找凸包:convexHull()函数 3.函数解析之theRNG() 4 .circle()函数[回忆] 5.基础示例程序:凸包检测基础 1. 凸包 什么是凸包? 解释:给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸边形,它是包含点集中所有的点. 如下:用人手图来举例说明凸缺陷概念.手周围深色的线描画出凸包,A到H被标出的区域是凸包的各个“缺陷”,这些凸度缺陷提供了手以及手状态的特征表现的方法. 2.寻找凸包:convexHull()函数 说明:convexH

  • OpenCV连通域数量统计学习示例

    目录 学习目标: 核心代码 代码执行说明 学习目标: 1.输入图像为分割结果图像 2.根据种子填充法思路,遍历图像,得到每个连通域外接矩形坐标信息.面积信息 核心代码 /* Input: src: 待检测连通域的二值化图像 Output: dst: 标记后的图像 featherList: 连通域特征的清单(可自行查阅文档) return: 连通域数量. */ int connectionDetect(Mat &src, Mat &dst, vector<Feather> &am

  • python opencv肤色检测的实现示例

    1 椭圆肤色检测模型 原理:将RGB图像转换到YCRCB空间,肤色像素点会聚集到一个椭圆区域.先定义一个椭圆模型,然后将每个RGB像素点转换到YCRCB空间比对是否再椭圆区域,是的话判断为皮肤. YCRCB颜色空间 椭圆模型 代码 def ellipse_detect(image): """ :param image: 图片路径 :return: None """ img = cv2.imread(image,cv2.IMREAD_COLOR)

  • OpenCV根据面积筛选连通域学习示例

    目录 学习目标: 示例代码 学习目标: 对二值图进行分析,设定最大最小面积区间 保留该面积区间内的区域 示例代码 //src为二值图,minArea.maxArea为面积阈值,dest为结果图像 void connectionAreaSelect(Mat src, int minArea, int maxArea, Mat &dest) { Mat labels, stats, centroids, img_color; //连通域计算 int nccomps = connectedCompon

  • OpenCV形状检测的示例详解

    目录 1.基于OpenCV的形状检测Python版本 1.1.定义我们的形状检测器类ShapeDetector 1.2.基于OpenCV的形状检测器 2.基于OpenCV的形状检测C++版本 2.1代码实现 2.2主要函数解析 2.3结果展示 1.基于OpenCV的形状检测Python版本 目录结构 1.1.定义我们的形状检测器类ShapeDetector 开始定义我们的 ShapeDetector 类.我们将跳过这里的 init 构造函数,因为不需要初始化任何东西. # 导入必要的包 impo

  • 10个步骤Opencv轻松检测出图片中条形码

    本文为大家分享了Opencv轻松检测出图片中条形码的步骤,供大家参考,具体内容如下 1. 原图像大小调整,提高运算效率 2. 转化为灰度图 3. 高斯平滑滤波 4.求得水平和垂直方向灰度图像的梯度差,使用Sobel算子 5.均值滤波,消除高频噪声 6.二值化 7.闭运算,填充条形码间隙 8. 腐蚀,去除孤立的点 9. 膨胀,填充条形码间空隙,根据核的大小,有可能需要2~3次膨胀操作 10.通过findContours找到条形码区域的矩形边界 实现: #include "core/core.hpp

  • Python+Opencv文本检测的实现

    目录 EAST 深度学习文本检测器 项目结构 实施说明 使用 OpenCV 实现我们的文本检测器 OpenCV 文本检测结果 视频文字检测结果 在本教程中,您将学习如何使用 OpenCV 使用 EAST 文本检测器检测图像中的文本. EAST 文本检测器要求我们在我们的系统上运行 OpenCV 3.4.2 或 OpenCV 4 . 论文原文 代码地址 原文 在今天教程的第一部分中,我将讨论为什么在自然场景图像中检测文本会如此具有挑战性. 从那里我将简要讨论 EAST 文本检测器,我们为什么使用它

  • python+opencv实现的简单人脸识别代码示例

    # 源码如下: #!/usr/bin/env python #coding=utf-8 import os from PIL import Image, ImageDraw import cv def detect_object(image): '''检测图片,获取人脸在图片中的坐标''' grayscale = cv.CreateImage((image.width, image.height), 8, 1) cv.CvtColor(image, grayscale, cv.CV_BGR2GR

  • 使用OpenCV实现检测和追踪车辆

    本文实例为大家分享了OpenCV实现检测和追踪车辆的具体代码,供大家参考,具体内容如下 完整源码GitHub 使用高斯混合模型(BackgroundSubtractorMOG2)对背景建模,提取出前景 使用中值滤波去掉椒盐噪声,再闭运算和开运算填充空洞 使用cvBlob库追踪车辆,我稍微修改了cvBlob源码来通过编译 由于要对背景建模,这个方法要求背景是静止的 另外不同车辆白色区域不能连通,否则会认为是同一物体 void processVideo(char* videoFilename) {

随机推荐