您当前的位置: 首页 >  Python
  • 0浏览

    0关注

    2393博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

CV之cv2:基于python语言利用cv2库对几何形状图像边界进行识别检测并计算周长/面积以及输出颜色/形状类型之详细攻略

一个处女座的程序猿 发布时间:2019-07-04 09:48:10 ,浏览量:0

CV之cv2:基于python语言利用cv2库对几何形状图像边界进行识别检测并计算周长/面积以及输出颜色/形状类型之详细攻略

目录

基于python语言利用cv2库对几何形状图像边界进行识别检测并计算周长/面积以及输出颜色/形状类型

OpenCV实现检测几何形状并进行识别、输出周长、面积、颜色、形状类型的设计思路

(1)、轮廓提取

(2)、多边形逼近

(3)、几何距计算

输出结果

实现代码

基于python语言利用cv2库对几何形状图像边界进行识别检测并计算周长/面积以及输出颜色/形状类型 OpenCV实现检测几何形状并进行识别、输出周长、面积、颜色、形状类型的设计思路 (1)、轮廓提取

在OpenCV中使用轮廓发现相关函数时候要求输入图像是二值图像,这样便于轮廓提取、边缘提取等操作。轮廓发现的函数与参数解释如下:   findContours ( image ,  mode ,  method ,  contours = None ,  hierarchy = None ,  offset = None )  (image 输入/输出的二值图像;mode  返回轮廓的结构、可以是 List 、 Tree 、 External ;method  轮廓点的编码方式,基本是基于链式编码 ;contours  返回的轮廓集合 ;hieracrchy  返回的轮廓层次关系 ;offset  点是否有位移)

(2)、多边形逼近

是通过对轮廓外形无限逼近,删除非关键点、得到轮廓的关键点,不断逼近轮廓真实形状的方法,OpenCV中多边形逼近的函数与参数解释如下:   approxPolyDP ( curve ,  epsilon ,  closed ,  approxCurve = None )  (curve  表示输入的轮廓点集合 ;epsilon  表示逼近曲率,越小表示相似逼近越厉害;close 是否闭合)

(3)、几何距计算

图像几何距是图像的几何特征,高阶几何距中心化之后具有特征不变性,可以产生Hu距输出,用于形状匹配等操作,这里我们通过计算一阶几何距得到指定轮廓的中心位置,计算几何距的函数与参数解释如下:   moments ( array ,  binaryImage = None ) (array 表示指定输入轮廓 ;binaryImage 默认为 None)

输出结果

实现代码
# -*- coding: utf-8 -*-

#OpenCV实现检测几何形状并进行识别、输出周长、面积、颜色、形状类型——Jason niu
import cv2 as cv
import numpy as np


class ShapeAnalysis:  #定义形状分析的类
    def __init__(self):
        self.shapes = {'triangle': 0, 'rectangle': 0, 'polygons': 0, 'circles': 0}

    def analysis(self, frame):
        h, w, ch = frame.shape
        result = np.zeros((h, w, ch), dtype=np.uint8)
        # 二值化图像
        print("start to detect lines...\n")
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
        cv.imshow("input image", frame)

        out_binary, contours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
        
        for cnt in range(len(contours)):
            # 提取与绘制轮廓
            cv.drawContours(result, contours, cnt, (0, 255, 0), 2)

            # 轮廓逼近
            epsilon = 0.01 * cv.arcLength(contours[cnt], True)
            approx = cv.approxPolyDP(contours[cnt], epsilon, True)

            # 分析几何形状
            corners = len(approx)
            shape_type = ""
            if corners == 3:
                count = self.shapes['triangle']
                count = count+1
                self.shapes['triangle'] = count
                shape_type = "三角形"
            if corners == 4:
                count = self.shapes['rectangle']
                count = count + 1
                self.shapes['rectangle'] = count
                shape_type = "矩形"
            if corners >= 10:
                count = self.shapes['circles']
                count = count + 1
                self.shapes['circles'] = count
                shape_type = "圆形"
            if 4 < corners < 10:
                count = self.shapes['polygons']
                count = count + 1
                self.shapes['polygons'] = count
                shape_type = "多边形"

            # 求解中心位置
            mm = cv.moments(contours[cnt])
            cx = int(mm['m10'] / mm['m00'])
            cy = int(mm['m01'] / mm['m00'])
            cv.circle(result, (cx, cy), 3, (0, 0, 255), -1)

            # 颜色分析和提取
            color = frame[cy][cx]
            color_str = "(" + str(color[0]) + ", " + str(color[1]) + ", " + str(color[2]) + ")"

            # 计算面积与周长
            p = cv.arcLength(contours[cnt], True)
            area = cv.contourArea(contours[cnt])
            print("周长: %.3f, 面积: %.3f 颜色: %s 形状: %s "% (p, area, color_str, shape_type))


        cv.imshow("Analysis Result", self.draw_text_info(result))
        return self.shapes
if __name__ == "__main__":
    src = cv.imread("F:/File_Python/Resources/004.png")
    ld = ShapeAnalysis()
    ld.analysis(src)
    cv.waitKey(0)
    cv.destroyAllWindows()

关注
打赏
1664196048
查看更多评论
立即登录/注册

微信扫码登录

0.1330s