对象测量

弧长与面积

轮廓发现

多边形发现

approxPloyDP()

几何矩的计算

可以用来进行数字的边界查找,进行区域的划分

相关代码

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 value : %s" % ret)
    # 显示二值图像
    cv.imshow("binary image", binary)

    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):
        # 求轮廓面积
        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(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)
        # 绘制外接矩形 参数:图像 起点 终点 颜色 线宽
        cv.rectangle(dst, (x, y), (x+w, y+h), (0, 0, 255), 2)
        print("contour area %s" % area)
        # 多边形逼近 参数: 轮廓 epsilon close
        approxCurve = cv.approxPolyDP(contour, 4, True)
        print(approxCurve.shape)
        # approxCurve.shape[0] 表示的是逼近的多边形的边数
        if approxCurve.shape[0] > 6: # 多边形 可以看作圆形
            cv.drawContours(dst, contours, i, (0, 255, 0), 2)
        if approxCurve.shape[0] == 4: # 四边形
            cv.drawContours(dst, contours, i, (0, 0, 255), 2)
        if approxCurve.shape[0] == 3: # 三角形
            cv.drawContours(dst, contours, i, (255, 0, 0), 2)
    cv.imshow("measure-contours", dst)


src = cv.imread("image24.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
measure_object(src)
cv.waitKey(0)

cv.destroyAllWindows()

结果展示