轮廓特征:面积、周长、重心、边界框。
矩
- 作用:计算图像的质心、面积。
- cv2.moments() ——解释:将计算得到的矩以一个字典的形式返回。
- cv2.contourArea() ——解释:求轮廓面积。
- cv2.arcLength() ——解释:求轮廓周长,第二参数 True闭合 False张开
- cv2.approxPolyDP(轮廓图,epsilon,True) ——解释:近似目标形状。第二参数决定效果。
- cv2.convexHull(points[,hull[,clockwise[,returnPoints]]]) ——解释:检测曲线是否具有凸性缺陷,并纠正缺陷,1、传入轮廓; 2、输出; 3、方向标志; True为顺时针; 4、返回与凸包点对应轮廓上点。False可得到凸性缺陷。
- cv2.isContourConvex() ——解释:检测曲线是否凸。
- x,y,w,h=cv2.boundingRect() ——解释:直边界矩形。xy为矩形左上角坐标,wh为矩形宽高。面积不是最小。
- cv2.minAreaRect() ——解释:旋转边界矩形。面积最小。考虑对象旋转。返回Box2D结构。
- cv2.minEnclosingCircle() ——解释:最小外切圆。
- cv2.ellipse() ——解释:椭圆拟合。返回值为旋转边界矩形的内切圆。
- 直线拟合:根据一组点拟合出一条直线,同时为图像中的白色点拟合出一条直线。
代码演示
#coding=utf8
import cv2
import numpy as np
img=cv2.imread('juzi.jpg',0)
ret,thresh=cv2.threshold(img,127,255,0)
contours,hierarchy=cv2.findContours(thresh,1,2)
cnt=contours[0]
M=cv2.moments(cnt)
print(M)
cx=int(M['m10']/M['m00']) #求重心
cy=int(M['m01']/M['m00'])
area=cv2.contourArea(cnt)
perimeter=cv2.arcLength(cnt,True)
epsilon=0.1*cv2.arcLength(cnt,True)
approx=cv2.approxPolyDP(cnt,epsilon,True)
hull=cv2.convexHull(cnt)
k=cv2.isContourConvex(cnt)
x,y,w,h=cv2.boundingRect(cnt)
img=cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
(x,y),radius=cv2.minEnclosingCircle(cnt)
center=(int(x),int(y))
radius=int(radius)
img=cv2.circle(img,center,radius,(0,255,0),2)
ellipse=cv2.fitEllipse(cnt) #椭圆拟合
im=cv2.ellipse(im,ellispe,(0,255,0),2)
rows,cols=img.shape[:2]
[vx,vy,x,y]=cv2.fitLine(cnt,cv2.DIST_L2,0,0.01,0.01)
lefty=int((-x*vy/vx)+y)
righty=int((cols-x)*vy/vx+y)
img=cv2.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)