ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

对象测量

2021-02-07 12:33:14  阅读:181  来源: 互联网

标签:src binary 对象 image 测量 contour cv 255


在这里插入图片描述

在这里插入图片描述

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)

    contours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    for i, contour in enumerate(contours):
        cv.drawContours(image, contours, i, (0, 255, 255), 1)   # 画轮廓

        area = cv.contourArea(contour)  # 计算轮廓面积
        print("contour area", area)

        # 轮廓周长, 第二参数用来指定对象的形状是闭合的(True),还是打开的(一条曲线)
        perimeter = cv.arcLength(contour, True)
        print("contour perimeter:", perimeter)

        x, y, w, h = cv.boundingRect(contour)  # 用矩形框出轮廓
        cv.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)

        rate = min(w, h)/max(w, h)  # 计算矩形的宽高比
        print("rectangle rate", rate)

        # 计算图像中的中心矩(最高到三阶), 将计算得到的矩以一个字典的形式返回
        mm = cv.moments(contour)
        print("===========", mm, "============")
        # 计算图像的质心
        cx = mm["m10"]/mm["m00"]
        cy = mm["m01"]/mm["m00"]

        cv.circle(image, (np.int(cx), np.int(cy)), 2, (0, 255, 255), -1)  # 用实心圆画出质心

    cv.imshow("measure_object", image)


def contour_approx(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    print("threshold value: %s" % ret)
    # cv.imshow("binary image", binary)

    contours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    for i, contour in enumerate(contours):
        cv.drawContours(image, contours, i, (0, 0, 255), 2)  # 画轮廓

        epsilon = 0.01 * cv.arcLength(contour, True)
        # 将轮廓形状近似到另外一种由更少点组成的轮廓形状,新轮廓的点的数目由我们设定的准确度来决定.
        # 为了帮助理解,假设从一幅图像中查找一个矩形,但是由于图像的种种原因,我们不能得到一个完美的矩形,
        # 而是一个“坏形状”
        # 现在你就可以使用这个函数来近似这个形状了.
        # 这个函数的第二个参数叫 epsilon,它是从原始轮廓到近似轮廓的最大距离.
        # 它是一个准确度参数.选择一个好的 epsilon 对于得到满意结果非常重要.
        approx = cv.approxPolyDP(contour, epsilon, True)
        cv.drawContours(image, approx, -1, (255, 0, 0), 10)

    cv.imshow("contour_approx", image)


def main():

    # src = cv.imread("./images/handwriting.jpg")
    # cv.imshow("src", src)
    # measure_object(src)

    src = cv.imread("./images/approximate.png")
    cv.imshow("src", src)
    contour_approx(src)

    cv.waitKey(0)
    cv.destroyAllWindows()


if __name__ == '__main__':
    main()

在这里插入图片描述
在这里插入图片描述

标签:src,binary,对象,image,测量,contour,cv,255
来源: https://blog.csdn.net/qq_46456049/article/details/113735046

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有