查找轮廓 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. c/c++ 获取mysql数据库以blob类型储存的图片

    简单的code如下: #include <iostream> #include <fstream> #include <sstream> #include < ...

  2. 当Python中混进一只薛定谔的猫……

    本文原创并首发于公众号[Python猫],未经授权,请勿转载. 原文地址:https://mp.weixin.qq.com/s/-fFVTgWVsydFsNu1nyxUzA Python 是一门强大的 ...

  3. 3dmax 法线重置

    从一个模型分离部位时,分离出的部分,面法线发生了混乱,左边原始模型,右边分离后 重置法线方法 对模型(比如对分离出的下半身)添加 EditoNormal修改器 选中模型部位 添加Edit Normal ...

  4. jzoj6005. 【PKUWC2019模拟2019.1.17】数学 (生成函数+FFT+抽代+高精)

    题面 题解 幸好咱不是在晚上做的否则咱就不用睡觉了--都什么年代了居然还会出高精的题-- 先考虑如果暴力怎么做,令\(G(x)\)为\(F(n,k)\)的生成函数,那么不难发现\[G^R(x)=\pr ...

  5. EOS Bios Boot Sequence

    EOS version:v1.0.5 Date:2018-06-19 Host: Centos 7 Reference :https://github.com/EOSIO/eos/wiki/Tutor ...

  6. git回退版本,已经commit过的文件丢了

    参考:https://blog.csdn.net/qq_33877149/article/details/79705611 可以用 git reset --hard fa8694b 回退到以上相应的位 ...

  7. C# 流

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. Codeforces Round #431 (Div. 2) A

    Where do odds begin, and where do they end? Where does hope emerge, and will they ever break? Given ...

  9. php:两个文件夹递归地比较,没有的文件自动复制过去

    仿站时,通常默认模板文件和新的模板文件大部分都是一样的,下面代码可以用于比较文件是否缺失(和默认模板做比较) 如果缺失自动复制过去~~ <?php /** * used:新模板和default模 ...

  10. @Column 注解详情

    @Column标记表示所持久化属性所映射表中的字段,该注释的属性定义如下: @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface ...