Python-OpenCV 笔记6 – 轮廓(Contours)


参考文档: https://docs.opencv.org/3.4/dd/d49/tutorial_py_contour_features.html


1、查找轮廓 findContours


函数原型

image, contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

参数:

  • image:8位单通道二值图,如果为灰度图非0值为1
  • mode:轮廓的检索模式
    • cv2.RETR_EXTERNAL:表示只检测外轮廓
    • cv2.RETR_LIST:检测的轮廓不建立等级关系
    • cv2.RETR_CCOMP:建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层
    • cv2.RETR_TREE:建立一个等级树结构的轮廓
  • method:轮廓的近似办法
    • cv2.CHAIN_APPROX_NONE:存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))== 1
    • cv2.CHAIN_APPROX_SIMPLE:压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
    • cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

返回值:

  • image:被处理的图片,正常没用
  • contours:numpy的ndarray,每个元素都是图像中的一个轮廓,每个元素包括多个点
  • hierarchy:numpy的ndarray,元素个数和轮廓个数相同,轮廓 contours[i] 对应于hierarchy[i],每个 hierarchy 元素包括四个元素 hierarchy[i][0] ~ hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。
# 实例
img = cv2.imread('1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  _, contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

2、绘制轮廓 findContours


函数原型

cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])

参数:

  • image:输入图像
  • contours:轮廓,一个轮廓2个点的维数为(1,1,2,1,2)
  • contourIdx:绘制contours中的哪条轮廓,如果是-1,则绘制其中的所有轮廓
  • color:绘制的轮廓的颜色
  • thickness:轮廓线的宽度,如果是 -1(cv2.FILLED),则为填充模式
# 实例
cv2.drawContours(img,contours,-1,(0,0,255),3)
cv2.imshow("img", img)
cv2.waitKey(0)

3、轮廓的特征 Contour Features


3.1、矩:cv2.moments()

函数原型:

cv2.moments(array[, binaryImage])
  • array:单个轮廓,1xNx1x2维的数组,即N个二维点
  • binaryImage:如果为True,非0的像素值=1,默认为False
  • 返回轮廓区域的矩的字典

实例:

import numpy as np
import cv2img = cv2.imread('star.jpg',0)
ret, thresh = cv2.threshold(img,127,255,0)
im2,contours,hierarchy = cv2.findContours(thresh, 1, 2)
cnt = contours[0]
M = cv2.moments(cnt)# 计算x,y轴的矩
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])

3.2、面积:cv2.contourArea()

函数原型:

cv2.contourArea(contour[, oriented])
  • contour:单个轮廓,1xNx1x2维的数组,即N个二维点
  • oriented:如果为True,可以获得轮廓的方向标志,默认为False
  • 返回轮廓区域的面积

实例:

area = cv2.contourArea(cnt)

3.3、周长:cv2.arcLength()

函数原型:

cv2.arcLength(curve, closed)
  • curve:单个轮廓,1xNx1x2维的数组,即N个二维点
  • closed:指示曲线是否闭合的标志
  • 返回轮廓区域的周长

实例:

perimeter = cv2.arcLength(cnt, True)

3.4、凸性检测:cv2.isContourConvex()

函数原型:

cv2.isContourConvex(contour)
  • contour:单个轮廓,1xNx1x2维的数组,即N个二维点
  • 返回轮廓是否为凸性的,是为True,否为False

实例:

k = cv2.isContourConvex(cnt)

4、轮廓近似 Contour Approximation


4.1、多边形近似:cv2.approxPolyDP()

函数原型:

cv2.approxPolyDP(curve, epsilon, closed[, approxCurve])
  • curve:单个轮廓,1xNx1x2维的数组,即N个二维点
  • epsilon:点的最大距离
  • closed:设置曲线是否闭合,即得到首尾两点是否为同一点
  • 返回近似轮廓的二维点集

实例:

epsilon = 0.1*cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, epsilon, True)

4.2、凸包近似:cv2.convexHull()

函数原型:

cv2.convexHull(points[, hull[, clockwise[, returnPoints]]])
  • points:单个轮廓,1xNx1x2维的数组,即N个二维点
  • hull:输出数组,正常不用
  • clockwise:如果True,输出的凸包是顺时针方向,否则为默认的逆时针。
  • returnPoints:默认值为True,返回凸包上点的坐标,如果为False,返回与凸包点对应的轮廓上的点。
  • 返回近似轮廓的二维点集

实例:

hull = cv2.convexHull(cnt)

4.3、矩形近似:Bounding Rectangle

函数原型:

# 普通矩形
cv2.boundingRect(points)  # 1# 可旋转矩形,即最小的外包矩形
cv2.minAreaRect(points)  # 2# 矩形表达形式的装换
cv2.boxPoints(box)  # 3
  • points:单个轮廓,1xNx1x2维的数组,即N个二维点
  • box:四个二维点的数组
  • 返回:
    • 1:近似矩形的左上角点坐标、矩形的宽和高(x,y,w,h)
    • 2:近似矩形的最上角点坐标(x,y),矩形的宽和高(w,h)及旋转角度θ(°)
    • 3:转换为矩形的四个角点坐标

实例:

# 普通矩形
x,y,w,h = cv2.boundingRect(cnt)
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)# 可旋转矩形,即最小的外包矩形
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(img,[box],0,(0,0,255),2)

4.4、其它近似

# 最小外接圆
(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
cv2.circle(img,center,radius,(0,255,0),2)# 最小外接椭圆
ellipse = cv2.fitEllipse(cnt)
cv2.ellipse(img,ellipse,(0,255,0),2)# 拟合直线
rows,cols = img.shape[:2]
[vx,vy,x,y] = cv2.fitLine(cnt, cv.DIST_L2,0,0.01,0.01)
lefty = int((-x*vy/vx) + y)
righty = int(((cols-x)*vy/vx)+y)
cv2.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)

Python-OpenCV 笔记6 -- 轮廓(Contours)相关推荐

  1. Python+OpenCV:图像轮廓

    Python+OpenCV:图像轮廓 轮廓是什么? 轮廓可以简单地解释为一条连接所有连续点(沿边界)的曲线,具有相同的颜色和强度. 轮廓线是形状分析.目标检测和识别的重要工具. 为了获得更好的精度,可 ...

  2. python+OpenCV笔记(二十四):Shi-Tomasi角点检测

    Shi-Tomasi角点检测 原理 python+OpenCV笔记(二十二):角点检测原理(Harris角点检测原理.Shi-Tomasi角点检测原理)https://blog.csdn.net/qq ...

  3. python+OpenCv笔记(十三):边缘检测——Sobel检测算子

    Sobel检测算子 概述: Sobel边缘检测算法比较简单,实际应用中效率比canny边缘检测效率要高,但是边缘不如Canny检测的准确,但是很多实际应用的场合,sobel边缘却是首选,Sobel算子 ...

  4. python+OpenCV笔记(三十七):检测运动物体——使用MOG/KNN背景差分器

    目录 一.基本背景差分器 二.MOG背景差分器 流程 代码编写 三.KNN背景差分器 目前,许多运动检测技术都是基于简单的背景差分概念的,即假设摄像头(视频)的曝光和场景中的光照条件是稳定的,当摄像头 ...

  5. OpenCV笔记-对轮廓进行平滑处理

    项目背景 有一个像素数较少的图像,在上面找轮廓,显示轮廓锯齿严重: 如何将轮廓进行平滑? 一开始是想着将轮廓上的拐点拟合出一个贝塞尔曲线,由于要绘制回原图像上,且贝塞尔曲线的生成也没有找到很好的办法: ...

  6. python+OpenCv笔记(七):图像的形态学操作(腐蚀与膨胀、开闭运算、礼帽与黑帽)

    一.腐蚀与膨胀 腐蚀就是原图中高亮的部分被蚕食,效果图拥有比原图更小的高亮区域. 腐蚀的作用是:消除物体边界点,使目标缩小,可以消除小于结构元素的噪声点. 膨胀就是使原图中高亮的部分扩张,效果图拥有比 ...

  7. python+OpenCV笔记(三十五):特征匹配——基于FLANN的匹配、基于FLANN进行单应性匹配

    目录 一.基于FLANN的匹配 FLANN匹配流程: 代码编写 二.基于FLANN进行单应性匹配 什么是单应性? FLANN进行单应性匹配流程 代码编写 FLANN库全称是Fast Library f ...

  8. python+OpenCv笔记(六):图像的几何变换(缩放、平移、旋转、仿射、透射、金字塔)

    一.图像的缩放 OpenCv API: cv2.resize(src, dsize, fx, fy, interpolation) 参数: src:输入的图像 dsize:绝对尺寸,直接将图像调整为指 ...

  9. python+OpenCv笔记(十七):模板匹配

    模板匹配 OpenCV框架提供了用于对象检测.跟踪和计数的许多不同方法.其中,模板匹配是OpenCV中最基本的对象检测方法之一. OpenCV API: res = cv.matchTemplate( ...

  10. python+OpenCv笔记(二):绘制几何图形

    一.绘制直线 cv.line(img,pt1,pt2,color,thickness,lineType) 参数: img:要绘制的图像 pt1 pt2:绘制的起点与终点 color:颜色 thickn ...

最新文章

  1. 2020 CCPC-Wannafly Winter Camp Day1 总结
  2. android文本自动添加图片格式,Android中多行文本末尾添加图片排版问题的解决方法...
  3. android app电量分析,如何计算android app的耗电量?
  4. 用金万维怎么设置路由器_家用路由器怎么设置 家庭路由器设置方法【图文】...
  5. 车票?工作?对象?Python 教你优雅解决年关三大难题!
  6. CRM WEB UI 01 BOL向导创建的搜索
  7. 蓝牙条码扫描枪如何选购
  8. xjoi9235区间翻转
  9. 【微信支付】微信支付之 Native 支付
  10. 【高等数学】空间直线的参数方程详解以及其参数t的意义
  11. 1024,20个入行故事,浮世中见证着程序员的奋斗
  12. 海洋cms模板免费下载
  13. oracle查询注意点,Oracle_spatial的常见错误与注意事项
  14. 滴滴Uber又打起来了!外卖领域C位花落谁家?
  15. R语言25-Prosper 贷款数据分析1
  16. 2010中国互联网哈哈榜
  17. Java初转型-Maven入门
  18. 8B / 10B Encode/Decode详解
  19. 打开ArcMap、ArcCatalog、ArcScene、ArcGlobe、ArcEngine出现All ArcGIS for Desktop Advanced licenses are in use
  20. Windows PowerShell学习笔记(一)

热门文章

  1. P2014 选课 (树形动规)
  2. TortoiseGit- 创建本地新分支,提交推送到远程,本地新分支合并到工作分支,提交到远程工作分支等。...
  3. Tomcat无法访问中文路径的解决办法
  4. grunt 0.4.1构建工具入门实践(转)
  5. 使用HTML5技术开发的超酷颜色选择器
  6. 关于利用VS2008创建项目遇到的小困惑备忘
  7. java——maven依赖版本冲突
  8. 找出一个文件夹下后缀名为.jpg的文件
  9. 20161104面试题-面试常问问题
  10. [ASP.NET Core] Static File Middleware