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)轮廓属性

【参考】

  1. OpenCV官方文档

【OpenCV-Python】教程:3-9 轮廓(4)更多函数相关推荐

  1. OpenCV Python教程(2、图像元素的访问、通道分离与合并)

    OpenCV Python教程之图像元素的访问.通道分离与合并 转载请详细注明原作者及出处,谢谢! 访问像素 像素的访问和访问numpy中ndarray的方法完全一样,灰度图为: [python] v ...

  2. OpenCV Python教程(3)(4)(5): 直方图的计算与显示 形态学处理 初级滤波内

    OpenCV Python教程(3.直方图的计算与显示) 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途 ...

  3. cuda默认函数与c++冲突_好程序员Python教程系列-第8讲:函数和模块

    好程序员Python教程系列-第8讲:函数和模块,在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解. 事实上,上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种 ...

  4. python中fac函数是什么意思_好程序员Python教程系列-第8讲:函数和模块

    好程序员Python教程系列-第8讲:函数和模块,在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解. 事实上,上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种 ...

  5. opencv python教程-OpenCV4 Python 最新中文版官方教程来了(附下载)

    教程简介 OpenCV 是计算机视觉中经典的专用库,然而其中文版官方教程久久不来.近日,一款最新 OpenCV4.1 版本的完整中文版官方教程出炉,读者朋友可以更好的学习了解 OpenCV 相关细节. ...

  6. Opencv笔记(十八)——轮廓的更多函数及其层次结构

    凸缺陷 前面我们已经学习了轮廓的凸包,对象上的任何凹陷都被成为凸缺陷.OpenCV 中有一个函数 cv.convexityDefect() 可以帮助我们找到凸缺陷.函数调用如下: hull = cv2 ...

  7. opencv python教程简书_OpenCV-Python系列二:常用的图像属性

    对于图像,我们经常需要知道关于图像的特殊属性,比如宽度,高度,面积,像素点数目等等,那么在opencv-python中,这些信息如何获取呢? 本文结构: 1.基本图像属性 2. 对于opencv中的特 ...

  8. OpenCV Python教程(1、图像的载入、显示和保存)

    本文是OpenCV  2 Computer Vision Application Programming Cookbook读书笔记的第一篇.在笔记中将以Python语言改写每章的代码. PythonO ...

  9. opencv python教程简书_OpenCV-Python教程:27.图像转换

    理论 傅里叶变换用来分析多种过滤器的频率特征.对于图片,2D离散傅里叶变换(DFT)用来找频率范围.一个快速算法叫快速傅里叶变换(FFT)用来计算DFT. 对于正弦信号,x(t) = Asin(2πf ...

  10. opencv python教程简书_Python-OpenCV —— 基本操作一网打尽

    OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.MacOS操作系统上.它轻量级而且高效--由一系列 C 函数和少量C++类构成,同时提供了Pyt ...

最新文章

  1. Logstash 父子关系 配置
  2. mysql extended_explain之三:MYSQL EXPLAIN语句的extended 选项学习体会,分析诊断工具之二...
  3. pxe linux自动安装系统,通过 PXE 自动安装操作系统(1):部署 PXE Server
  4. 面试小问题——Object中有哪些常用方法?
  5. Mvc NuGet 数据迁移
  6. java+eclipse+selenium环境搭建
  7. java保存图书每日的交易记录
  8. ==、Equals 、ReferenceEquals它们的异同
  9. Oracle数据库驱动ojdbc6下载
  10. 博客页面添加动态小人,二次元人物 hexo live2d html人物公仔
  11. Python爬虫(一)——58同城租房信息
  12. 比尔盖茨10大经典语录英文版
  13. java中国象棋兵吃棋规则_中国象棋规则?
  14. 【QGIS插件安装】buildseg: QGIS plugin for building extraction
  15. 【论文阅读】Regional Semantic Contrast and Aggregation for Weakly Supervised Semantic Segmentation
  16. HTMLCSS简单学习,看这篇就够了!
  17. 程序人生 - 2021浙A区域号牌限行规定(限行时间+限行路段+限行范围图)
  18. 阿里java工资_Java开发:年薪40万,在阿里属于什么级别的员工
  19. 初始C语言——梦启程的地方
  20. vue-cli4开发手机购物商城东京大药房整站django开发数据库和接口

热门文章

  1. Proxmox ve 开启嵌套虚拟化
  2. 机器学习day12 机器学习实战adaboost集成方法与重新进行疝马病的预测
  3. 基于51单片机的衣柜鞋柜湿度控制系统proteus仿真原理图PCB
  4. 计算机术语中ICT表示__,电大《计算机文化基础》选修平台题库
  5. 22届SHEIN校招面试--JAVA开发工程师面经
  6. Oracle服务器性能优化
  7. sleep怎么用java_java怎么用sleep?java中sleep()的用法
  8. java线程没wait前调用notify,深入Java线程 之 wait和notify
  9. 沁恒CH32V307嵌入式比赛开发心得
  10. 短信黑名单app接收短信优先级权限设置