基于python OpenCV多边形图像识别的实现

您所在的位置:网站首页 python提取图片中的物体 基于python OpenCV多边形图像识别的实现

基于python OpenCV多边形图像识别的实现

2023-08-15 00:29| 来源: 网络整理| 查看: 265

首先说一下我的整体思路:

① 首先定义了一个识别器类型,封装了计算边长,识别形状和展示结果三个函数。

② 主函数先读入图片,然后将图片转化为灰度图片,然后高斯滤波平滑处理,然后将灰度图片转化为黑白两色图片。

③ 调用函数识别图片中所有的轮廓,然后列表形式返回图片,轮廓等信息,然后只取轮廓的所有点信息(每个点的信息为平面坐标)作为一个列表程序(第91,92,93行代码)

④ 用之前创建的识别器实例对每个轮廓中的点进行多边形拟合,得到顶点的坐标的列表中去(class中28~32行代码)

⑤ 输出识别结果

以下是代码部分:(注意,这里是opencv3的代码,请先检查自己的opencv版本)

import cv2 import math THRESHOLE_VALUE=60 COEFFICIENT=0.02 class ShapeDetector: #初始化类 def __init__(self): #字典类型对应每一种图形的计数器 self.counter = {"unrecognized image": 0, "triangle": 0, "rhombus": 0, "rectangle": 0, "pentagon": 0, "hexagon": 0, "circle": 0} #初始化图形类型为不可识别 self.shape = "unrecognized image" #图形顶点集置空 self.approx = [] #初始化该图形的周长为0 self.peri = 0 # 计算欧式距离(主要作用通过计算边长区分菱形和长方形) def distance(self, x1, y1, x2, y2): return math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2) def detect(self, c): #cv2.arcLength函数返回周长 self.peri = cv2.arcLength(c, True) #cv2.approxPolyDP用多边形取拟合,返回的是顶点的列表 self.approx = cv2.approxPolyDP(c, COEFFICIENT * self.peri, True) #3个顶点,三角形 if len(self.approx) == 3: self.shape = "triangle" #同理,四个顶点,四边形 elif len(self.approx) == 4: #计算相邻两边的长度,做差判在误差范围内是否相等 dist1 = self.distance(self.approx[0][0][0], self.approx[0][0][1], self.approx[1][0][0], self.approx[1][0][1]) dist2 = self.distance(self.approx[0][0][0], self.approx[0][0][1], self.approx[3][0][0], self.approx[3][0][1]) result = math.fabs(dist1 - dist2) # print(result) #误差小于10,可近似认为相等,为菱形 if result


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3