openCV编程基础21--对象测量

主要功能:

1.找目标的轮廓

2.计算轮廓的面积

3.计算轮廓外接矩形并把绘制出来

4.计算长宽比

5.计算轮廓的几何矩

6.找轮廓的中心位置并绘制出来

7.多边形拟合

import cv2 as cv
import numpy as np


# 对象测量
# 计算每个轮廓的弧长和面积 单位是像素
# 多边形拟合
def measure_object(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) #图像转灰度图
    # 将灰度图转为二值图 ret是阈值 binary是二值图
    ret, binary = cv.threshold(gray, 0 ,255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    print('threshold value: %s'%ret)  # 把阈值打印出来
    cv.imshow('binary image',binary)  # 把二值图显示出来
    # 找目标的轮廓
    contours, hireachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    for i , contour in enumerate(contours):
        area = cv.contourArea(contour)  # 计算轮廓的面积
        print('area',area)
        x, y, w, h = cv.boundingRect(contour) # 计算轮廓外接矩形
        rate = min(w, h)/max(w,h)  # 计算长宽比
        print('rate',rate)
        mm = cv.moments(contour) # 计算轮廓的几何矩
        print(type(mm))
        # 找轮廓的中心位置
        cx = mm['m10']/mm['m00']
        cy = mm['m01']/mm['m00']
        # 用个黄色小圆圈把几何图形的中心位置绘制出来
        cv.circle(image, (np.int(cx) , np.int(cy)), 3, (0,255,255), -1)
        # 用红色框框把外接矩形绘制出来
        cv.rectangle(image, (x,y), (x+w, y+h),(0,0,255), 2)
    cv.imshow('measure_contours',image)

# 多边形拟合(为了看起来方便,画到二值图上)
def haha_object(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) #图像转灰度图
    # 将灰度图转为二值图 ret是阈值 binary是二值图
    ret, binary = cv.threshold(gray, 0 ,255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    dst = cv.cvtColor(binary, cv.COLOR_GRAY2BGR)  # 二值图上就可以画彩色的了
    # 找目标的轮廓
    contours, hireachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    for i , contour in enumerate(contours):
        mm = cv.moments(contour) # 计算轮廓的几何矩
        print(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)
        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, (255,0,0), 2)
        if approxCurve.shape[0] == 6:
            cv.drawContours(dst, contours, i, (0,0,255), 2)
    cv.imshow('binin_contours',dst)


src = cv.imread('F:0909.png')
#cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE)
cv.imshow("0", src)
measure_object(src)
# haha_object(src)
cv.waitKey(0)
cv.destroyAllWindows()

输出结果:

openCV编程基础21--对象测量_第1张图片

openCV编程基础21--对象测量_第2张图片

你可能感兴趣的:(openCV编程基础)