从头学习opencv(21)--对象测量

对象测量

弧长与面积
多边形拟合
几何矩计算

完整代码

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:曲线是否闭合的标志位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值