opencv19:轮廓凸包,距离与匹配
目标
在本章中,将学习
- 凸起缺陷检测
- 寻找点到多边形的最短距离
- 匹配不同的形状
理论和代码
凸性缺陷(Convexity Defects)
上一节学习了如何寻找轮廓, 凸包上的任何偏差都可以被认为是有凸性缺陷。
OpenCV中有一个函数来寻找凸包,cv2.convexityDefects()
。
hull = cv2.convexHull(cnt, returnPoints = False)
defects = cv2.convexityDefects(cnt, hull)
注意
必须在发现凸包时,传递returnPoints= False, 返回的是cnt中点的下标,如果是True时候,返回的是点的坐标。
cv2.convexityDefects
返回一个数组,其中每行包含这些值[起点、终点、最远点、到最远点的近似距离]
。可以用图像把它形象化。画一条连接起点和终点的线,然后在最远处画一个圆。记住,返回的前三个值是cnt的索引。必须从cnt中获取这些值。
import cv2
import numpy as np
img = cv2.imread('star.png')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(img_gray, 127, 255,0)
contours,hierarchy = cv2.findContours(thresh,2,1)
cnt = contours[0]
hull = cv2.convexHull(cnt, returnPoints=False)
defects = cv2.convexityDefects(cnt, hull)
for i in range(defects.shape[0]):s,e,f,d = defects[i,0]start = tuple(cnt[s][0])end = tuple(cnt[e][0])far = tuple(cnt[f][0])cv2.line(img,start,end,[0,255,0],2)cv2.circle(img,far,5,[0,0,255],-1)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
点到多边形测试
cv2.pointPolygonTest
函数找出图像中一点到轮廓线的最短距离。它返回的是符号距离距离(signed distance),点在轮廓线外时为负,点在轮廓线内时为正,点在轮廓线上时为零。
可以检查点(50,50)如下:
dist = cv2.pointPolygonTest(cnt,(50,50),True)
# -38.8329756778952
在函数中,第三个参数是measureDist
。如果它是True
,它会找到有符号的距离。如果为False
,则查找该点是在轮廓线内部还是外部(分别返回 1、-1和0)
注意
如果不想知道具体距离,请确保第三个参数为False,因为计算距离是一个耗时的过程, 设置为False可使速度提高2-3倍。
形状匹配
OpenCV附带一个函数cv2.matchShapes()
,该函数能够比较两个形状或两个轮廓,并返回一个显示相似性的度量。结果越低,匹配越好。它是根据矩值(hu-moment)计算出来的。不同的测量方法在文档中有解释。
# 形状匹配
import cv2
import numpy as npimg1 = cv2.imread('star.png', 0)
img2 = cv2.imread('star2.png', 0)
img3 = cv2.imread('approx.png', 0)
ret, thresh = cv2.threshold(img1, 127, 250, 0)
ret2, thresh2 = cv2.threshold(img2, 127, 250, 0)
ret3, thresh3 = cv2.threshold(img3, 127, 250, 0)contours1, hierarchy1 = cv2.findContours(thresh, 2, 1)
cnt1 = contours1[0]contours2, hierarchy2 = cv2.findContours(thresh2, 2, 1)
cnt2 = contours2[0]contours3, hierarchy3 = cv2.findContours(thresh3, 2, 1)
cnt3 = contours3[0]ret1 = cv2.matchShapes(cnt1, cnt2, 1, 0.0)
print(ret1) # 0.0101502123705427ret2 = cv2.matchShapes(cnt2, cnt3, 1, 0.0)
print(ret2) # 0.9202466744178138
尝试过匹配下面给出的不同形状的形状:
得到以下结果:
- 匹配的图像A与本身= 0.0
- 匹配图像A与图像B =0.0101502123705427
- 匹配图像A与图像C = 0.9202466744178138
可以看到,即使是图像旋转也不会对其匹配度产生比较大的影响
说明
Hu Moments(或者相反Hu moment invariants)是一种使用不变的图像转换的中央矩计算的一组7个数字。前6个moments被证明是不变的变换,缩放和旋转和反转。第7个moment表示符号变化。
附加资源
- https://docs.opencv.org/4.1.2/d5/d45/tutorial_py_contours_more_functions.html
- https://www.jianshu.com/p/42eb9b3957d5
- https://www.cnblogs.com/jclian91/p/9728488.html
- https://learnopencv.com/shape-matching-using-hu-moments-c-python/
opencv19:轮廓凸包,距离与匹配相关推荐
- OpenCV图像的轮廓的匹配
一个跟轮廓相关的最常用到的功能是匹配两个轮廓.如果有两个轮廓,如何比较它们;或者如何比较一个轮廓和另一个抽象模板. 矩 比较两个轮廓最简洁的方式是比较他们的轮廓矩.这里先简短介绍一个矩的含义.简单的说 ...
- Opencv(六)模板匹配、轮廓检测、轮廓周围绘制矩形框和圆形框
模板匹配介绍 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域. 所以模板匹配首先需要一个模板图像T(给定的子图像) 另外需要一个待检测的图像-源图像S 工作方法,在带检测图像上,从左到右,从 ...
- OpenCV之imgproc 模块. 图像处理(5)在图像中寻找轮廓 计算物体的凸包 创建包围轮廓的矩形和圆形边界框 为轮廓创建可倾斜的边界框和椭圆 轮廓矩 多边形测试
在图像中寻找轮廓 目标 在这个教程中你将学到如何: 使用OpenCV函数 findContours 使用OpenCV函数 drawContours 原理 例程 教程的代码在下面给出. 你也可以从 这里 ...
- 【opencv】轮廓特征(质心,面积,周长,近似轮廓,凸包,凸度,边界矩形,直角矩形,旋转矩形,最小闭合圈,拟合椭圆、直线)
4_9_2_轮廓特征 - OpenCV中文官方文档 找到轮廓的不同特征,例如面积,周长,质心,边界框等. 1. 特征矩 特征矩可以帮助您计算一些特征,例如物体的质心,物体的面积等.请查看特征矩上的维基 ...
- 图像或轮廓的Hu矩的定义、优缺点、适用范围,并利用OpenCV的函数HuMoments()和matchShapes()实现Hu矩的计算和轮廓匹配
本文承接博主的上一篇博文: 什么叫图像或轮廓的空间矩.中心矩.归一化中心矩?并利用OpenCV的类Moments计算轮廓的这几个矩和质心位置 继续介绍Hu矩的相关知识. Hu矩是由二阶和三阶中心距计算 ...
- Python+OpenCV:图像轮廓
Python+OpenCV:图像轮廓 轮廓是什么? 轮廓可以简单地解释为一条连接所有连续点(沿边界)的曲线,具有相同的颜色和强度. 轮廓线是形状分析.目标检测和识别的重要工具. 为了获得更好的精度,可 ...
- 不规则物体形状匹配综述
不规则物体形状匹配综述 物体识别是计算机视觉应用的一项基本任务.识别通常基于目标物体的灰度信息.颜色信息或形状信息.物体识别的目的就是要找到一个包含可以区分不同目标物体的有效信息的描述.由于要识别的物 ...
- (三)OpenCV中的图像处理之轮廓
注释:本文翻译自OpenCV3.0.0 document->OpenCV-Python Tutorials,包括对原文档种错误代码的纠正 该章节分为以下四个小节: (一) Contour ...
- 利用OpenCV的convexHull和convexityDefects做凸包(凸壳)检测及凸包(凸壳)的缺陷检测
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 要理解凸包(凸壳)检测,首无要知道什么是凸包(凸 ...
- 基于vc的freetype字体轮廓解析_MulayCap:基于多层表达的单目彩色相机的人体动作捕捉新方案...
MulayCap: Multi-layer Human Performance Capture Using A Monocular Video Camera 最近几年,深度学习的发展为基于单目RGB相 ...
最新文章
- java内存溢出怎么排查_【转】Java学习---内存溢出的排查经历
- 哪里可以学python编程-Python编程适合哪些人学?老男孩Python教程
- 修改hosts文件使apache绑定域名指向本机
- php 调用 perl,在PHP中使用与Perl兼容的正则表达式
- python3(十四)Python 异常处理
- PHP7.2的安装与配置(win7)
- 28.2. AndroidManifest.xml
- 杭电2112(SPFA)
- 台电t30_数码:台电发布T30平板电脑,10.1英寸/p70处理器/4+64GB内存组合
- 网站页面直接显示html代码 转义html代码 excel导入题库 解决方法
- cher怎么翻译中文_中文翻译法语收费标准是怎么定的
- cad导入mysql_CAD插入一个数据库
- 产品经理的职责有哪些?到底该做什么?
- 如何用Flutter实现跨平台移动开发
- [poj3130][半平面交]How I Mathematician Wonder What You Are!
- 1星《微信软文营销实战技巧》:标题党,作者没有实战经验
- 2020第二届长安杯
- 20行Python代码爬取网站美女图,哇太多了,我U盘装满了
- uni-app 实现打开第三方app
- 通俗易懂的epoll