查找轮廓 findContours
1 cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) → image, contours, hierarchy

参数解释
  • image:原图像,可以事先由compare()、inRange()、threshold()等得到binary的image图像
  • mode:轮廓检索模式
  • method:轮廓近似方法
mode参数可取值为
  1. CV_RETR_EXTERNAL 仅检索外部轮廓。
  2. CV_RETR_LIST 检索所有轮廓但是不建立层次关系。
  3. CV_RETR_CCOMP 检索所有轮廓并建立两级层次结构。
  4. CV_RETR_TREE 检索所有轮廓并建立嵌套轮廓层次结构。
method参数可取
  1. CV_CHAIN_APPROX_NONE 存储所有轮廓点。
  2. CV_CHAIN_APPROX_SIMPLE 压缩水平、垂直和对角线,仅留下其端点。
  3. CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS  应用了Teh-Chin链式近似算法的一种风格
计算图像的轮廓面积 cv2.contourArea()
1 cv2.contourArea(contour[, oriented]) → retval

计算图像的矩 cv2.moments()
1 cv2.moments(array[, binaryImage]) → retval

具体见代码
 1 import cv2
 2 import numpy as np
 3
 4 img = cv2.imread('star.jpg',0)
 5 ret,thresh = cv2.threshold(img,127,255,0)
 6 contours,hierarchy = cv2.findContours(thresh, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
 7
 8 cnt = contours[0]
 9 M = cv2.moments(cnt)
10 print(cv2.contourArea(cnt))
11 print(M)
12
13 #得到{'m00': 0.5, 'm10': 53.83333333333333, 'm01': 367.3333333333333, 'm20': 5796.083333333333, 'm11': 39549.541666666664, 'm02': 269867.5833333333, 'm30': 624050.9500000001, 'm21': 4258186.233333333, 'm12': 29055722.733333334, 'm03': 198262758.70000002, 'mu20': 0.027777777778283053, 'mu11': -0.01388888888322981, 'mu02': 0.027777777810115367, 'mu30': -0.003703703638166189, 'mu21': 0.0018518519221615293, 'mu12': 0.001851847569924292, 'mu03': -0.0037037134170532227, 'nu20': 0.11111111111313221, 'nu11': -0.05555555553291924, 'nu02': 0.11111111124046147, 'nu30': -0.020951311664420796, 'nu21': 0.01047565641531008, 'nu12': 0.010475631795338369, 'nu03': -0.020951366982159467}
14
15 #我们利用这个可以得到重心
16 cx = int(M['m10']/M['m00'])
17 cy = int(M['m01']/M['m00'])
18 #contourArea的结果和m00的结果一致
19  

轮廓周长计算  cv2.arcLength()
1 perimeter = cv2.arcLength(cnt,True)

  • 第一个参数是contour
  • 第二个参数指定形状是不是闭合轮廓,true就是闭合的,否则是曲线
轮廓近似
1 cv2.approxPolyDP(curve, epsilon, closed[, approxCurve]) → approxCurve

参数解释
  • curve:输入的2D点,比如findContours得到的contour
  • epsilon:精度
  • closed:是否闭合,跟之前说的一样
输出的是近似之后的Contour
轮廓线拟合
1 cv2.polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]]) → img

参数解释
  • img:输入图像
  • pts:要拟合的轮廓的集合,例如[contours[1],contours[2]]
  • isClosed:是否闭合,跟之前说的一样
  • color:颜色,例如(0,0,255)
  • thickness:厚度,1 2 3等等
  • linetype:线的类型
  • shift:定点坐标中小数位数
 1 import cv2 as cv
 2 import numpy as np
 3 img = cv.imread("test.jpg",0)
 4 _,contours,_ = cv.findContours(img,2,1)
 5 cnt = contours[0]
 6 epsilon = 0.01 * cv.arcLength(cnt,True)#这里用arcLength得到轮廓周长或者曲线长度
 7 approx = cv.approxPolyDP(cnt,epsilon,True)
 8 out_img = cv.polylines(img,[approx],True,(0,0,255),2)
 9 cv.imshow("image",out_img)
10 k  = cv.waitKey(1) & 0xFF
11 if k== 27:
12     cv.destroyAllWindows()

凸包检测
1 cv2.convexHull(points[, hull[, clockwise[, returnPoints]]]) → hull


参数解释
  • points:输入的2D点集,如findContours得到的contour
  • hull:输出凸包
  • clockwise:如果是True,则输出凸包顺序为顺时针方向,否则为逆时针方向
函数返回的是凸包(点集)

1 import cv2 as cv
2 import numpy as np
3 img = cv.imread("test.jpg",0)
4 _,contours,_ = cv.findContours(img,2,1)
5 cnt = contours[1]
6 hull = cv.convexHull(cnt)
7 out_img = cv.polylines(img,[hull],True,(0,255,255),2)
8 cv.imshow("image",out_img)
9 cv.waitKey(0)

边界矩形
得到直边界矩形
1 cv2.boundingRect(points) → retval

参数解释
  • points:给出的需要确定边界的点集,例如contour
函数返回的是得到的边界矩形的四个顶点坐标
得到旋转矩形
1 cv2.minAreaRect(points) → retval

参数说明:
  • points :是findCountours得到的contour
使用
import cv2 as cv
import numpy as np
img = cv.imread("test.jpg",0)
_,contours,_ = cv.findContours(img,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)
cnt = contours[0]
rect_vertical = cv.boundingRect(cnt)
rect = cv.minAreaRect(cnt)#这里得到的是旋转矩形
box = cv.cv.BoxPoints(rect)#得到端点
box = np.int0(box)#向下取整

最小封闭圆
 
1 cv2.minEnclosingCircle(points) → center, radius


 
参数解释
  • points:输入点集,如contour
输出为圆中心点坐标和半径
 
椭圆拟合
 
1 cv2.fitEllipse(points) → retval


 
参数解释
  • points:输入点集,如contour
 
输出为椭圆,其属性有中心点坐标、两轴长、偏转角度
 
使用
 1 import cv2 as cv
 2 import numpy as np
 3 img = cv.imread("test.jpg",0)
 4 _,contours,_ = cv.findContours(img,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)
 5 cnt = contours[0]
 6 circle = cv.minEnclosingCircle(cnt)
 7 ellipse = cv.fitEllipse(cnt)
 8 out_1 = cv.circle(img,circle,(0,255,255),2)
 9 out_2 =cv.ellipse(img,ellipse,(0,255,255),2)
10 cv.imshow("img1",out_1)
11 cv.imshow("img2",out_2)
12 cv.waitKey(0)

转载于:https://www.cnblogs.com/aoru45/p/9765262.html

Contour Features 边界特征相关推荐

  1. ECCV 2020 Oral | BorderDet : 用边界特征做检测

    本文转载自知乎,介绍了今天新公布的目标检测算法BorderDet,作者为旷视科技算法工程师马宇宸. https://zhuanlan.zhihu.com/p/163044323 加入旷厂科(ban)研 ...

  2. 什么是features(特征)

    什么是features(特征) 因为之前有人问道这个,所以写一下,特征是什么: 我仍然用之前桃子好不好的例子 桃子梗是绿色的 桃子表面没有破损 桃子闻起来是香的 ←\leftarrow←这一行就叫特征 ...

  3. 基于3D边界特征的视觉定位技术

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:计算机视觉life 3D空间中的边界特征线是机器视觉感知 ...

  4. OpenCV线特征Line Features

    OpenCV线特征Line Features 线特征Line Features 简介 行提取和描述符计算 描述符之间的匹配 查询内部数据库 线特征Line Features 简介 在本教程中,将显示如 ...

  5. Analog Trunk Features (模拟中继特征)

    Analog Trunk Features (模拟中继特征) usedistinctiveringdetection: Whether or not to attempt to recognize d ...

  6. 特征工程——Tabular Data Features multimodal features

    一.前言 机器学习时期,要花费大量的时间在特征设计上,好的输入数据可以让训练事半功倍.而有了深度学习后,神经网络可以自动实现特征提取,解放了手工(理论上是这样,实际也是要进行特征筛选的,因为在应用中特 ...

  7. 工业检测:基于密集尺度特征融合像素级不平衡学习框架(论文下载)

    关注并星标 从此不迷路 计算机视觉研究院 公众号ID|ComputerVisionGzq 学习群|扫码在主页获取加入方式 论文地址:https://arxiv.org/pdf/2203.09387v1 ...

  8. PCL:点云数据基于法线的边界提取(从最初的法线估计理论推导到最终的边界提取)

    该边界提取采用PCL库里边的方法,基于法线估计来实现的边界检测与提取: 首先从原始点云上计算出法线,再由法线结合数据估计出边界.(这样解释还是特别抽像吧) ------------法线求解:(平面的法 ...

  9. 深度学习(十七)基于改进Coarse-to-fine CNN网络的人脸特征点定位

    基于改进Coarse-to-fine CNN网络的人脸特征点定位 原文地址:http://blog.csdn.net/hjimce/article/details/50099115 作者:hjimce ...

最新文章

  1. java stream 转 file_java 中 byte[]、File、InputStream 互相转换
  2. Unity(1)控制反转
  3. python常用英语单词-python – 获取英语单词的基本形式
  4. 中國批准英特爾在東北投建晶片廠
  5. vim does not map customized key?
  6. 学习c++的优秀博客(转)
  7. UIControl IOS控件编程
  8. 【Python】简单实现显示图片的高斯和中值滤波效果
  9. C语言 AI智能,五子棋 人机对战,人人对战
  10. zookeeper 客户端常用命令_看完这篇文章,还说自己不会使用Zookeeper命令吗?
  11. dotnet core项目升级到 .net core 2.0
  12. IT项目管理之第7章 项目质量管理习题之案例分析汇总
  13. 习题8-5 折纸痕(Paper Folding, UVa177)
  14. cb.conjunction()的意思
  15. ipad iphone开发_如何在iPhone或iPad上“不信任”计算机
  16. java md5库_Java常用类库API之MD5简单使用
  17. nginx同一个地址端口代理多个页面
  18. SpringBoot项目打jar后执行jar包提示:xx没有主属性清单 解决
  19. Qt Linguist 介绍
  20. 微信支付apiv3全教程

热门文章

  1. 前端之网站结构语义化
  2. 相机选型与远心镜头选型
  3. (十六)记录 -- 1. 数据记录的概念
  4. JMeter 调试取样器(Debug Sampler)简介
  5. Microsoft SQL Server 2008 R2(Microsoft SQL Server,错误: 2)
  6. 【题目】一根长度为M厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为每秒1厘米。当两只蚂蚁对撞时,二者同时掉头(掉头时间忽略不计)。给出每只蚂蚁的初始位置和朝向,计算T秒后每只蚂蚁的位置
  7. 【永远的二八定律】☆【永远的二八定律】
  8. 《电子测量与仪器学报》杂志投稿总结
  9. AVFrame相关api内存管理
  10. 详解border-radius属性