对象测量
弧长与面积
多边形拟合
几何矩计算
完整代码
import cv2 as cv
import numpy as np
def measure_object(image):
gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
ret,binary=cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)
print("threshold values:%s"%ret)
cv.imshow("binary image",binary)
dst=cv.cvtColor(binary,cv.COLOR_GRAY2BGR)
contours,hireachy=cv.findContours(binary,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)
for i,contour in enumerate(contours):
area=cv.contourArea(contour)#计算面积
x,y,w,h=cv.boundingRect(contour)#外接矩形
rate=min(w,h)/max(w,h)
print("rectangle rate:%s"%rate)
mm=cv.moments(contour)#原点矩
print("mm type",type(mm))
cx=mm['m10']/mm['m00']
cy=mm['m01']/mm['m00']
cv.circle(dst,(np.int(cx),np.int(cy)),3,(0,255,255),-1)#画圆心
print("contour area %s",area)
approxCurve=cv.approxPolyDP(contour,4,True)#得到多边形的输出集合
print(approxCurve.shape)
if approxCurve.shape[0]>6:#多边形的折线数大于6
cv.drawContours(dst,contours,i,(0,255,0),2)
if approxCurve.shape[0]==4:#边数等于4,矩形
cv.drawContours(dst,contours,i,(0,0,255),2)
if approxCurve.shape[0]==3:#边数等于3,三角形
cv.drawContours(dst,contours,i,(255,0,0),2)
cv.imshow("measure-contours",dst)
src = cv.imread("D:/OpenCV/opencv/sources/samples/data/detect_blob.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
measure_object(src)
cv.waitKey(0)
cv.destroyAllWindows()
print("Hi,python!")
运行结果
函数补充说明
1、x,y,w,h=cv.boundingRect(contour)
输入值contour是一个二值图,也就是它的参数;
输出值返回四个值,分别是x,y,w,h;
x,y是矩阵左上点的坐标,w,h是矩阵的宽和高
2、mm=cv.moments(contour)#原点矩
print(“mm type”,type(mm))
cx=mm[‘m10’]/mm[‘m00’]
cy=mm[‘m01’]/mm[‘m00’]
cv.circle(dst,(np.int(cx),np.int(cy)),3,(0,255,255),-1)#画圆心
void cvMoments( const CvArr* arr, CvMoments* moments, int binary=0 );
函数 cvMoments 计算最高达三阶的空间和中心矩,并且将结果存在结构 moments 中。矩用来计算形状的重心,面积,主轴和其它的形状特征,如 7 Hu 不变量等。
使用时:
m00:表示0阶矩
m01:表示1阶水平矩
m10:表示一阶垂直矩
3、approxCurve=cv.approxPolyDP(contour,4,True)
void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed)
参数有4个:
InputArray curve:输入曲线,数据类型可以为vector。
OutputArray approxCurve:输出折线,数据类型可以为vector。
double epsilon:判断点到相对应的line segment 的距离的阈值。(距离大于此阈值则舍弃,小于此阈值则保留,epsilon越小,折线的形状越“接近”曲线。)
bool closed:曲线是否闭合的标志位。