CV:cv2实现检测几何形状并进行识别、输出周长、面积、颜色、形状类型

简介: CV:cv2实现检测几何形状并进行识别、输出周长、面积、颜色、形状类型

输出结果

image.png

image.png


实现代码

# -*- 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()


相关文章
|
4月前
|
存储 编解码 算法
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
69 0
|
4月前
|
计算机视觉
OpencV图像几何形状绘制
OpencV图像几何形状绘制
|
4月前
|
计算机视觉
OpenCV图像像素值统计
OpenCV图像像素值统计
|
4月前
|
Web App开发 算法 Java
图像放缩之双线性内插值
图像放缩之双线性内插值
23 0
|
12月前
|
计算机视觉
OpenCV-计算轮廓面积cv::contourArea
OpenCV-计算轮廓面积cv::contourArea
211 0
|
5月前
|
计算机视觉
OpenCV(三十三):计算轮廓面积与轮廓长度
OpenCV(三十三):计算轮廓面积与轮廓长度
190 0
|
计算机视觉
opencv 之图像的边界填充及一些数据计算
opencv 之图像的边界填充及一些数据计算
|
存储 API 图形学
OpenCV_11 轮廓检测:图像的轮廓+绘制轮廓+轮廓近似+边界矩形+椭圆拟合+直线拟合
轮廓检测指检测图像中的对象边界,更偏向于关注上层语义对象。如OpenCV中的findContours()函数, 它会得到每一个轮廓并以点向量方式存储,除此也得到一个图像的拓扑信息,即一个轮廓的后一个轮廓、前一个轮廓等的索引编号。
1517 0
|
计算机视觉
五、OpenCV绘制线、矩形、圆等基本几何形状
通过javaOpenCV中的Imgproc函数进行简单几何图形的绘制
124 0
五、OpenCV绘制线、矩形、圆等基本几何形状
|
编解码 计算机视觉
CV13 图像分辨率操作(图像金字塔与resize()函数)
其中,高斯核卷积运算就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值(券种不同)经过加权平均后得到。常见的 33与 55 高斯核(CV9 2D卷积与图像滤波)
191 0