OpenCV学习笔记(15)——更多的轮廓函数
- 凸缺陷,以及如何找到凸缺陷
- 找某一点到一个多边形的最短距离
- 不同形状的匹配
1.凸缺陷
前面已经设计了轮廓的凸包和凸性缺陷的概念。OpenCV中有一个函数cv2.convexityDefect()可以帮助我们找到凸缺陷:
hull = cv2.convexHull(cnt,returnPoints=False)#这里必须是False
defect = cv2.convexityDefects(cnt,hull)
它会返回一个数组,每一行的值为[起点,终点,最远的点,到最远点的近似距离]。我们可以在一张图上显示它。我们将起点和终点用一天绿线连接,在最远点画一个圆圈。记住返回的前三个值是点在轮廓中的索引,所以要到轮廓中去找到它们:
# -*- coding:utf-8 -*- import numpy as np
import cv2
from matplotlib import pyplot as plt im = cv2.imread('10.png')
img = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)#用这个方式转换的原因是最后输出时希望能看到彩色的的轮廓图
ret,thresh = cv2.threshold(img,127,255,0) img,contours,hierarchy = cv2.findContours(thresh,1,2)
cnt = contours[0] hull = cv2.convexHull(cnt,returnPoints=False)#这里必须是False
defect = cv2.convexityDefects(cnt,hull)
#它的输出包含很多项,可以尝试输出一下便可以知道该list的排列格式 for i in range(defect.shape[0]):
s,e,f,d = defect[i,0]
start = tuple(cnt[s][0])
end = tuple(cnt[e][0])
far = tuple(cnt[f][0])
cv2.line(im,start,end,[0,255,0],2)
cv2.circle(im,far,5,[0,0,255],-1) cv2.imshow('img',im)
cv2.waitKey(0)

2.Point Polygon Test
求解图像中的一个点到一个对象的轮廓的最短距离。如果点在轮廓外部,返回值为负。如果在轮廓上,返回值为0,。如果在轮廓外部,返回值为正。例子如下
dist = cv2.pointPolygonTest(cnt,(50,50),True)
其中第三个参数是measureDist。如果设为True,会返回最短距离;如果设为False,则只会判断这个点和轮廓之间的位置关系(返回+1,-1,0).
如果实际运转中不需要知道最短距离,建议设为False,这样可以使速度提升2到3倍。
3.形状匹配
cv2.matchShape()可以帮我们比较两个形状或轮廓的相似度。如果返回值越小,则匹配越好。它是根据Hull矩来确定的。
# -*- coding:utf-8 -*-
import numpy as np
import cv2
from matplotlib import pyplot as plt
im = cv2.imread('10.png')
im2 = cv2.imread('11.png')
img = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)#用这个方式转换的原因是最后输出时希望能看到彩色的的轮廓图
img2 = cv2.cvtColor(im2,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(img,127,255,0)
ret,thresh2 = cv2.threshold(img2,127,255,0)
img,contours,hierarchy = cv2.findContours(thresh,1,2)
cnt = contours[0]
img2,contours,hierarchy = cv2.findContours(thresh2,1,2)
cnt2 = contours[0]
ret = cv2.matchShapes(cnt,cnt2,1,0.0)#后面的两个参数有啥用暂时不知道
print(ret)
根据测试,该匹配对于某些变化如缩放,旋转,镜像映射都具有较好的匹配效果
OpenCV学习笔记(15)——更多的轮廓函数的更多相关文章
- OpenCV学习笔记(十一) 轮廓操作
在图像中寻找轮廓 首先利用Canny算子检测图像的边缘,再利用Canny算子的输出作为 寻找轮廓函数 findContours 的输入.最后用函数 drawContours 画出轮廓.边界Counto ...
- OpenCV 学习笔记03 边界框、最小矩形区域和最小闭圆的轮廓
本节代码使用的opencv-python 4.0.1,numpy 1.15.4 + mkl 使用图片为 Mjolnir_Round_Car_Magnet_300x300.jpg 代码如下: impor ...
- opencv学习笔记(二)寻找轮廓
opencv学习笔记(二)寻找轮廓 opencv中使用findContours函数来查找轮廓,这个函数的原型为: void findContours(InputOutputArray image, O ...
- OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法
函数中的代码是部分代码,详细代码在最后 1 cv2.boundingRect 作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界. cv2.boundingRect(arr ...
- OpenCV 学习笔记03 findContours函数
opencv-python 4.0.1 1 函数释义 词义:发现轮廓! 从二进制图像中查找轮廓(Finds contours in a binary image):轮廓是形状分析和物体检测和识别的 ...
- (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU
首页 视界智尚 算法技术 每日技术 来打我呀 注册 OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...
- OpenCV学习笔记3
OpenCV学习笔记3 图像平滑(低通滤波) 使用低通滤波器可以达到图像模糊的目的.这对与去除噪音很有帮助.其实就是去除图像中的高频成分(比如:噪音,边界).所以边界也会被模糊一点.(当然,也有一些模 ...
- opencv学习笔记(一)IplImage, CvMat, Mat 的关系
opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...
- paper 93:OpenCV学习笔记大集锦
整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...
随机推荐
- 第七章· MySQL的存储引擎
一.存储引擎简介 1.文件系统: 1.1 操作系统组织和存取数据的一种机制. 1.2 文件系统是一种软件. 2.文件系统类型:ext2 3 4 ,xfs 数据 2.1 不管使用什么文件系统,数据内容 ...
- Linux系统初始化脚本
#查看centos的版本号 CentOS_version=`cut -d /etc/centos-release | cut -d` #改变PS3格式 PS3="Please enter t ...
- C获取数组长度
c语言中,定义数组后可以用sizeof命令获得数组的长度(可容纳元素个数) 如: { int data[4]; int length; length=sizeof(data)/sizeof(data[ ...
- python基础:python循环、三元运算、字典、文件操作
目录: python循环 三元运算 字符串 字典 文件操作基础 一.python编程 在面向过程式编程语言的执行流程中包含: 顺序执行 选择执行 循环执行 if是条件判断语句:if的执行流程属于选择执 ...
- P3806 离线多次询问 树上距离为K的点对是否存在 点分治
询问树上距离为k的点对是否存在 直接n^2暴力处理点对 桶排记录 可以过 #include<cstdio> #include<cstring> #include<algo ...
- .NET平台的发展
.NET平台的发展.NET从1.0到.NET Core3.0:C#从1.0到8.0: ASP.NET从1.0到Core3.0: ASP.NET MVC1.0到ASP.NET MVC6.0,
- linux禁止普通用户登录
要想禁止普通用户登录 方法如下: 在 /etc下创建一个 nologin的文件 编辑这个文件,输入内容,当普通用户登录时就会提示这个文件的内容,并且禁止登陆. 执行步骤: touch /etc/nol ...
- 一分钟学会在IDEA中使用sqlite数据库
第一步:打开IDEA: 第二步: 第三步: 第四步: 第五步: 我们也使用idea来操作sqlite语法
- 关于Http协议,一片就够了
转载:http://www.jianshu.com/p/80e25cb1d81a HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从 ...
- Hadoop-No.12之数据采集的时效性
数据采集的时效性,指的是可进行数据采集的时间与Hadoop中工具可访问数量的时间之间的间隔.采集架构的时间分类会对存储媒介和采集方法造成很大的影响. 一般来说,在设计应用的采集构架之前建议使用以下分类 ...