码迷,mamicode.com
首页 > 其他好文 > 详细

Contour Features 边界特征

时间:2018-10-10 11:59:18      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:point   radius   psi   最小   import   ret   rect   circle   输入   

查找轮廓 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)

 

Contour Features 边界特征

标签:point   radius   psi   最小   import   ret   rect   circle   输入   

原文地址:https://www.cnblogs.com/aoru45/p/9765262.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!