查找轮廓 findContours
 
 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()
 
 cv2.contourArea(contour[, oriented]) → retval
 
计算图像的矩 cv2.moments()
 
 cv2.moments(array[, binaryImage]) → retval
 
具体见代码
 
 import cv2
 import numpy as np

 img = cv2.imread('star.jpg',0)
 ret,thresh = cv2.threshold(img,127,255,0)
 contours,hierarchy = cv2.findContours(thresh, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

 cnt = contours[0]
 M = cv2.moments(cnt)
 print(cv2.contourArea(cnt))
 print(M)

 #得到{'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}

 #我们利用这个可以得到重心
 cx = int(M['m10']/M['m00'])
 cy = int(M['m01']/M['m00'])
 #contourArea的结果和m00的结果一致
  
轮廓周长计算  cv2.arcLength()
 
 perimeter = cv2.arcLength(cnt,True)
 
  • 第一个参数是contour
  • 第二个参数指定形状是不是闭合轮廓,true就是闭合的,否则是曲线
 
轮廓近似
 
 cv2.approxPolyDP(curve, epsilon, closed[, approxCurve]) → approxCurve
 
参数解释
  • curve:输入的2D点,比如findContours得到的contour
  • epsilon:精度
  • closed:是否闭合,跟之前说的一样
 
输出的是近似之后的Contour
 
轮廓线拟合
 
 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:定点坐标中小数位数
 import cv2 as cv
 import numpy as np
 img = cv.imread("test.jpg",0)
 _,contours,_ = cv.findContours(img,2,1)
 cnt = contours[0]
 epsilon = 0.01 * cv.arcLength(cnt,True)#这里用arcLength得到轮廓周长或者曲线长度
 approx = cv.approxPolyDP(cnt,epsilon,True)
 out_img = cv.polylines(img,[approx],True,(0,0,255),2)
 cv.imshow("image",out_img)
 k  = cv.waitKey(1) & 0xFF
 if k== 27:
     cv.destroyAllWindows()
    
 
 
凸包检测
 
 cv2.convexHull(points[, hull[, clockwise[, returnPoints]]]) → hull


 
参数解释
  • points:输入的2D点集,如findContours得到的contour
  • hull:输出凸包
  • clockwise:如果是True,则输出凸包顺序为顺时针方向,否则为逆时针方向
     
函数返回的是凸包(点集)
 
 import cv2 as cv
 import numpy as np
 img = cv.imread("test.jpg",0)
 _,contours,_ = cv.findContours(img,2,1)
 cnt = contours[1]
 hull = cv.convexHull(cnt)
 out_img = cv.polylines(img,[hull],True,(0,255,255),2)
 cv.imshow("image",out_img)
 cv.waitKey(0)
 
边界矩形
 
得到直边界矩形
 
 cv2.boundingRect(points) → retval
 
参数解释
  • points:给出的需要确定边界的点集,例如contour
 
函数返回的是得到的边界矩形的四个顶点坐标
 
得到旋转矩形
 
 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)#向下取整
 
最小封闭圆
 
 cv2.minEnclosingCircle(points) → center, radius


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


 
参数解释
  • points:输入点集,如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]
 circle = cv.minEnclosingCircle(cnt)
 ellipse = cv.fitEllipse(cnt)
 out_1 = cv.circle(img,circle,(0,255,255),2)
 out_2 =cv.ellipse(img,ellipse,(0,255,255),2)
 cv.imshow("img1",out_1)
 cv.imshow("img2",out_2)
 cv.waitKey(0)

Contour Features 边界特征的更多相关文章

  1. Spark连续特征转化成离散特征

    当数据量很大的时候,分类任务通常使用[离散特征+LR]集成[连续特征+xgboost],如果把连续特征加入到LR.决策树中,容易造成overfit. 如果想用上连续型特征,使用集成学习集成多种算法是一 ...

  2. Viola–Jones object detection framework--Rapid Object Detection using a Boosted Cascade of Simple Features中文翻译 及 matlab实现(见文末链接)

    ACCEPTED CONFERENCE ON COMPUTER VISION AND PATTERN RECOGNITION 2001 Rapid Object Detection using a B ...

  3. DNS Tunnel隧道隐蔽通信实验 && 尝试复现特征向量化思维方式检测

    1. DNS隧道简介 DNS隧道技术是指利用 DNS协议建立隐蔽信 道,实现隐蔽数据传输.最早是在2004年 DanKaminsky 在 Defcon大会上发布的基于 NSTX 的 DNS隐蔽 隧道工 ...

  4. 原来CNN是这样提取图像特征的。。。

    对于即将到来的人工智能时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的领域,会不会感觉马上就out了?作为机器学习的一个分支,深度学习同样需要计算机获得强大的学 ...

  5. 机器学习入门-随机森林温度预测的案例 1.datetime.datetime.datetime(将字符串转为为日期格式) 2.pd.get_dummies(将文本标签转换为one-hot编码) 3.rf.feature_importances_(研究样本特征的重要性) 4.fig.autofmt_xdate(rotation=60) 对标签进行翻转

    在这个案例中: 1. datetime.datetime.strptime(data, '%Y-%m-%d') # 由字符串格式转换为日期格式 2. pd.get_dummies(features)  ...

  6. 【特征匹配】SIFT原理之KD树+BBF算法解析

    转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/47606159 继上一篇中已经介绍了SIFT原理与C源代码剖析,最后得到了一系列 ...

  7. OpenCV开发笔记(六十五):红胖子8分钟带你深入了解ORB特征点(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  8. SaccadeNet:使用角点特征进行two-stage预测框精调 | CVPR 2020

    SaccadeNet基于中心点特征进行初步的目标定位,然后利用初步预测框的角点特征以及中心点特征进行预测框的精调,整体思想类似于two-stage目标检测算法,将第二阶段的预测框精调用的区域特征转化为 ...

  9. face detection[DSFD]

    本文来自<DSFD: Dual Shot Face Detector>,时间线为2018年10月,是南理工Jian Li在腾讯优图实验室实习时候的作品.在WIDER FACE,FDDB上效 ...

随机推荐

  1. json字符串与json对象之间的转换

    字符串转对象(strJSON代表json字符串)   var obj = eval(strJSON); (运用时候需要除了eval()以外需要json.js包)  var obj = strJSON. ...

  2. malloc,alloc,realloc之间的相似与区别

    三个函数的申明分别是: void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* calloc(si ...

  3. 牛客月赛 G-many sum(筛因子)

    many sum 链接:https://ac.nowcoder.com/acm/contest/879/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K, ...

  4. js如何判断当前文本的输入状态——中文输入法的那些坑

    相信各位在平时接需求的时候肯定会遇到这样的一些需求,例如,要求输入框限制输入长度,限制输入类型,限制只能英文输入,限制只能输入大写字母等等,这时候我们一般的思路无非两种,一种是弹出特定的键盘,第二种是 ...

  5. DropDownlist数据SelectedIndexChanged触发问题解决

    1.设置DropDownlist的AutoPostBack为True 2.绑定DropDownlist数据时出现了重复项, 在载入数据时保存数据状态应该写在Load事件中的if (!IsPostBac ...

  6. 使用HTML辅助方法载入分部视图

    在webform中我们用过user control可以减少重复代码也利于将页面模组化, 在mvc中 叫分部视图 Partial View.   也就是一个片段的view.可以利用Partial vie ...

  7. 宽度设置百分比 高度跟宽度一样css解决方案

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Codeforces 319D Have You Ever Heard About the Word?

    首先会想到|x|是不递减的. 于是可以枚举长度L. 再每个L设一个断点,xx必定经过两个断点. 两两断点间求最长公共前后缀,这里用hash+二分会快. 然后一波扫过去就好了. 如果找到了,hash就要 ...

  9. Ubuntu 16.04 LTS安装Docker

    一.安装Docker的先决条件 1.运行64位CPU构架的计算机(目前只能是x86_64和amd64),请注意,Docker目前不支持32位CPU.2.运行Linux 3.8或更高版本内核.一些老版本 ...

  10. SpringBoot---Web开发---WebSocket

    [广播式] 1. <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht ...