资源简介

图形识别代码,可以识别多种颜色与形状,还可以计算面积与周长,形状包括三角形,正方形,长方形,梯形,平行四边形,菱形,其他四边形,五边形,五角星,六边形和其他多边形,椭圆,圆等,颜色包括蓝色,紫色,红色,橙色等 python,opencv。如果没有办法运行,请私信我。

资源截图

代码片段和文件信息

import cv2 as cv
import numpy as np
import math
“““
    功能:实现多种几何图形的形状及颜色的识别,并计算面积及周长
    可以识别的图形:三角形,任意四边形(梯形,平行四边形,菱形,正方形,矩形,不特殊四边形),
                    五边形,五角星,六边形,多边形,椭圆,半圆,圆
    可以识别的颜色:红色,绿色,蓝色,黄色,黑色,紫色,橙色,白色
    除了定义的可识别颜色外,其他返回其对应的rgb值,提示用户根据rgb值去找寻相应颜色                 
    除了定义的可识别图形外,其他为未定义的图形  
“““
noise_b = 0.5


class ShapeAnalysis:
    def __init__(self):
        self.shapes = {‘triangle‘: 0
                       ‘quadrilateral‘: 0 ‘trapezium‘: 0 ‘parallelogram‘: 0
                       ‘rectangle‘: 0 ‘rhombus‘: 0 ‘square‘: 0
                       ‘pentagon‘: 0 ‘pentagram‘: 0 ‘hexagon‘: 0
                       ‘polygons‘: 0 ‘ellipse‘: 0 ‘circle‘: 0
                       ‘undefined‘: 0
                       }

        self.colors = {‘white‘: 0 ‘black‘: 0
                       ‘red‘: 0 ‘green‘: 0
                       ‘blue‘: 0 ‘yellow‘: 0
                       ‘orange‘: 0 ‘purple‘: 0
                       ‘others‘: 0
                       }

    def analysis(self frame):
        self.re_strover = ‘识别结果:\n‘
        h w ch = frame.shape  # 获取图形信息
        result = np.zeros((h w ch) dtype=np.uint8)  # 生成跟图形相同大小的矩阵
        cv.imshow(“input image“ frame)

        # 二值化图像
        print(‘start to binary image and detect edges...\n‘)
        gray = cv.cvtColor(frame cv.COLOR_BGR2GRAY)
        # threshold:固定阈值二值化 ret dst输出图 = cv2.threshold(src输入图 thresh阈值 maxval type)
        # type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY;
        # cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
        # adaptiveThreshold自适应阈值二值化
        ret binary = cv.threshold(gray 0 255 cv.THRESH_BINARY_INV | cv.THRESH_OTSU)

        # 函数cv2.findContours()有三个参数。第一个是输入图像,第二个是轮廓检索模式,第三个是轮廓近似方法。
        # 轮廓的点集(contours)[Next Previous First_Child Parent]
        # 各层轮廓的索引(hierarchy)
        contours hierarchy = cv.findContours(binary cv.RETR_TREE cv.CHAIN_APPROX_SIMPLE)
        if len(contours) < 1e-6:
            print(‘there is nothing can be detected! Please check the input image. Thanks!‘)
        else:
            shape_numbers = 0
            for cnt in range(len(contours)):

                # 通过计算周长和面积来排除一些图像干扰
                # 计算面积与周长
                p = cv.arcLength(contours[cnt] True)
                area = cv.contourArea(contours[cnt])

                if area > noise_b and p > noise_b:  # 如果面积和周长小于0.5判断为噪声干扰,不是图形
                    shape_numbers += 1   # 统计检测到图形

                    # 为图形,做统计分析
                    cv.drawContours(result contours cnt (0 255 0) 2)  # 画出轮廓

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

                    # 获取颜色信息
                    color = fr

评论

共有 条评论