【OpenCV-Python】教程:3-9 轮廓(4)更多函数
OpenCV Python 轮廓
【目标】
- 凸性缺陷查找
- 点与多边形的关系
- 不同形状的匹配
【代码】
左图中红色点为凸性检测的缺陷点,即凹点
右图为了验证点与多边形关系而做的图,也是官网要求做的练习。
import cv2
import numpy as np img = cv2.imread('star.png', 0)
colorimg = cv2.imread('star.png', 1)
convexHullImg = colorimg.copy()
ret, thresh = cv2.threshold(img, 128, 255, cv2.THRESH_BINARY)# 寻找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnt = contours[0]# 凸包
hull = cv2.convexHull(cnt, returnPoints=False)
defects = cv2.convexityDefects(cnt, hull)# 画出缺陷凹点
for i in range(defects.shape[0]):startptidx, endptidx, farptidx, dis = defects[i, 0]startpt = tuple(cnt[startptidx][0])endpt = tuple(cnt[endptidx][0])farpt = tuple(cnt[farptidx][0]) cv2.line(convexHullImg, startpt, endpt, (0, 255, 255))cv2.circle(convexHullImg, farpt, 3, (0, 0, 255), 3)# 根据点在图像中和轮廓中的位置,画出颜色图
polygonTestImg = colorimg.copy()
# cv2.circle(polygonTestImg, (280, 180), 3, (0, 0, 255), 3)
dist = cv2.pointPolygonTest(cnt, (50, 50), True)
h, w, _ = polygonTestImg.shape# 在轮廓上,为白色
bluevalue = 255
redvalue = 255
for j in range(h):for i in range(w):dist = cv2.pointPolygonTest(cnt, (i, j), True)if dist > 127:dist = 127if dist < -127:dist = -127if dist > 0:colorshow = (255 - dist * 2, 255 - dist * 2, 0)elif dist < 0:colorshow = (0, 255 + dist * 2, 255 + dist * 2)elif dist == 0:colorshow = (255, 255, 255)cv2.circle(polygonTestImg, (i, j), 2, colorshow, 2)cv2.imshow('convexHullImg', convexHullImg)
cv2.imshow('polygonTestImg', polygonTestImg)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 测试形状匹配
import cv2
import numpy as np img1 = cv2.imread('star.png', 0)
img2 = cv2.imread('box.png', 0)
img3 = cv2.imread('testfit.png', 0)ret1, thresh1 = cv2.threshold(img1, 127, 255, cv2.THRESH_BINARY)
ret2, thresh2 = cv2.threshold(img2, 127, 255, cv2.THRESH_BINARY)
ret3, thresh3 = cv2.threshold(img3, 127, 255, cv2.THRESH_BINARY)con1, hir1 = cv2.findContours(thresh1, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
con2, hir2 = cv2.findContours(thresh2, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
con3, hir3 = cv2.findContours(thresh3, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)cnt1 = con1[0]
cnt2 = con2[0]
cnt3 = con3[0]ret12 = cv2.matchShapes(cnt1, cnt2, cv2.CONTOURS_MATCH_I2, 0.0)
ret13 = cv2.matchShapes(cnt1, cnt3, cv2.CONTOURS_MATCH_I2, 0.0)
ret23 = cv2.matchShapes(cnt2, cnt3, cv2.CONTOURS_MATCH_I2, 0.0)print(ret12, ret13, ret23)cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果如下:
0.05888818307213595 0.2987404256696341 1.6190198650037022
【接口】
- convexityDefects
void cv::convexityDefects ( InputArray contour,
InputArray convexhull,
OutputArray convexityDefects
);
cv2.convexityDefects( contour, convexhull[, convexityDefects] ) -> convexityDefects
计算查找一个轮廓的凸性缺陷
- contour: 输入的轮廓
- convexhull: 轮廓的凸包,用
convexHull
- convexityDefects: 凸性缺陷输出向量, 每个缺陷是 4个整型元素的 vector。
- pointPolygonTest
double cv::pointPolygonTest ( InputArray contour,
Point2f pt,
bool measureDist
);
cv2.pointPolygonTest( contour, pt, measureDist ) -> retval
判断一个点是否在轮廓内或边缘上,计算其距离;正数在内部,负数在外部;
如果measureDist=false
则返回1, -1, 0
- contour: 输入的轮廓
- pt: 测试点
- measureDist: 如果为真,则计算距离,否则不用计算,只判断是否在内部还是外部;
- matchShapes
double cv::matchShapes ( InputArray contour1,
InputArray contour2,
int method,
double parameter
);
cv2.matchShapes( contour1, contour2, method, parameter ) -> retval
比较两个形状
- contour1: 第一个轮廓
- contour2: 第二个轮廓
- method: 比较的方法 见下 ShapeMatchModes
- parameter: 方法的特殊参数(暂时不支持)
- ShapeMatchModes
【OpenCV-Python】教程:3-9 轮廓(1)开始
【OpenCV-Python】教程:3-9 轮廓(2)轮廓特征
【OpenCV-Python】教程:3-9 轮廓(3)轮廓属性
【参考】
- OpenCV官方文档
【OpenCV-Python】教程:3-9 轮廓(4)更多函数相关推荐
- OpenCV Python教程(2、图像元素的访问、通道分离与合并)
OpenCV Python教程之图像元素的访问.通道分离与合并 转载请详细注明原作者及出处,谢谢! 访问像素 像素的访问和访问numpy中ndarray的方法完全一样,灰度图为: [python] v ...
- OpenCV Python教程(3)(4)(5): 直方图的计算与显示 形态学处理 初级滤波内
OpenCV Python教程(3.直方图的计算与显示) 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途 ...
- cuda默认函数与c++冲突_好程序员Python教程系列-第8讲:函数和模块
好程序员Python教程系列-第8讲:函数和模块,在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解. 事实上,上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种 ...
- python中fac函数是什么意思_好程序员Python教程系列-第8讲:函数和模块
好程序员Python教程系列-第8讲:函数和模块,在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解. 事实上,上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种 ...
- opencv python教程-OpenCV4 Python 最新中文版官方教程来了(附下载)
教程简介 OpenCV 是计算机视觉中经典的专用库,然而其中文版官方教程久久不来.近日,一款最新 OpenCV4.1 版本的完整中文版官方教程出炉,读者朋友可以更好的学习了解 OpenCV 相关细节. ...
- Opencv笔记(十八)——轮廓的更多函数及其层次结构
凸缺陷 前面我们已经学习了轮廓的凸包,对象上的任何凹陷都被成为凸缺陷.OpenCV 中有一个函数 cv.convexityDefect() 可以帮助我们找到凸缺陷.函数调用如下: hull = cv2 ...
- opencv python教程简书_OpenCV-Python系列二:常用的图像属性
对于图像,我们经常需要知道关于图像的特殊属性,比如宽度,高度,面积,像素点数目等等,那么在opencv-python中,这些信息如何获取呢? 本文结构: 1.基本图像属性 2. 对于opencv中的特 ...
- OpenCV Python教程(1、图像的载入、显示和保存)
本文是OpenCV 2 Computer Vision Application Programming Cookbook读书笔记的第一篇.在笔记中将以Python语言改写每章的代码. PythonO ...
- opencv python教程简书_OpenCV-Python教程:27.图像转换
理论 傅里叶变换用来分析多种过滤器的频率特征.对于图片,2D离散傅里叶变换(DFT)用来找频率范围.一个快速算法叫快速傅里叶变换(FFT)用来计算DFT. 对于正弦信号,x(t) = Asin(2πf ...
- opencv python教程简书_Python-OpenCV —— 基本操作一网打尽
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.MacOS操作系统上.它轻量级而且高效--由一系列 C 函数和少量C++类构成,同时提供了Pyt ...
最新文章
- Logstash 父子关系 配置
- mysql extended_explain之三:MYSQL EXPLAIN语句的extended 选项学习体会,分析诊断工具之二...
- pxe linux自动安装系统,通过 PXE 自动安装操作系统(1):部署 PXE Server
- 面试小问题——Object中有哪些常用方法?
- Mvc NuGet 数据迁移
- java+eclipse+selenium环境搭建
- java保存图书每日的交易记录
- ==、Equals 、ReferenceEquals它们的异同
- Oracle数据库驱动ojdbc6下载
- 博客页面添加动态小人,二次元人物 hexo live2d html人物公仔
- Python爬虫(一)——58同城租房信息
- 比尔盖茨10大经典语录英文版
- java中国象棋兵吃棋规则_中国象棋规则?
- 【QGIS插件安装】buildseg: QGIS plugin for building extraction
- 【论文阅读】Regional Semantic Contrast and Aggregation for Weakly Supervised Semantic Segmentation
- HTMLCSS简单学习,看这篇就够了!
- 程序人生 - 2021浙A区域号牌限行规定(限行时间+限行路段+限行范围图)
- 阿里java工资_Java开发:年薪40万,在阿里属于什么级别的员工
- 初始C语言——梦启程的地方
- vue-cli4开发手机购物商城东京大药房整站django开发数据库和接口
热门文章
- Proxmox ve 开启嵌套虚拟化
- 机器学习day12 机器学习实战adaboost集成方法与重新进行疝马病的预测
- 基于51单片机的衣柜鞋柜湿度控制系统proteus仿真原理图PCB
- 计算机术语中ICT表示__,电大《计算机文化基础》选修平台题库
- 22届SHEIN校招面试--JAVA开发工程师面经
- Oracle服务器性能优化
- sleep怎么用java_java怎么用sleep?java中sleep()的用法
- java线程没wait前调用notify,深入Java线程 之 wait和notify
- 沁恒CH32V307嵌入式比赛开发心得
- 短信黑名单app接收短信优先级权限设置