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


相关文章
|
算法 数据可视化
Halcon边缘检测和线条检测(3),文章含BLOB检测常用方法和shape_trans内接和外接算子的说明
Halcon边缘检测和线条检测(3),文章含BLOB检测常用方法和shape_trans内接和外接算子的说明
2261 0
Halcon边缘检测和线条检测(3),文章含BLOB检测常用方法和shape_trans内接和外接算子的说明
|
3月前
|
算法 计算机视觉 Python
圆形检测算法-基于颜色和形状(opencv)
该代码实现了一个圆检测算法,用于识别视频中的红色、白色和蓝色圆形。通过将图像从RGB转换为HSV颜色空间,并设置对应颜色的阈值范围,提取出目标颜色的区域。接着对这些区域进行轮廓提取和面积筛选,使用霍夫圆变换检测圆形,并在原图上绘制检测结果。
110 0
|
7月前
|
存储 编解码 算法
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
127 0
|
7月前
|
计算机视觉
OpencV图像几何形状绘制
OpencV图像几何形状绘制
|
7月前
|
计算机视觉
OpenCV图像像素值统计
OpenCV图像像素值统计
|
7月前
|
Web App开发 算法 Java
图像放缩之双线性内插值
图像放缩之双线性内插值
33 0
|
计算机视觉
OpenCV-计算轮廓面积cv::contourArea
OpenCV-计算轮廓面积cv::contourArea
284 0
|
数据安全/隐私保护 计算机视觉
opencv边缘检测加提取(圆形和矩形)
opencv边缘检测加提取(圆形和矩形)
79 0
|
C++ Python
pcl/pcd/liblas点云强度intensity反射图像过滤显示
pcl/pcd/liblas点云强度intensity反射图像过滤显示
412 0
pcl/pcd/liblas点云强度intensity反射图像过滤显示
|
计算机视觉
OpenCV-最小包围旋转矩形边框cv::minAreaRect
OpenCV-最小包围旋转矩形边框cv::minAreaRect
230 0