OpenCV中几何形状识别与测量
经常看到有学习OpenCV不久的人提问,如何识别一些简单的几何形状与它们的颜色,其实通过OpenCV的轮廓发现与几何分析相关的函数,只需不到100行的代码就可以很好的实现这些简单几何形状识别与对象测量相关操作。本文就会演示给大家如何通过OpenCV 轮廓发现与几何分析相关函数实现如下功能:
- 几何形状识别(识别三角形、四边形/矩形、多边形、圆)
- 计算几何形状面积与周长、中心位置
-
提取几何形状的颜色
在具体代码实现与程序演示之前,我们先要搞清楚一些概念。
一:基本概念与函数介绍
1. 轮廓(contours)
什么是轮廓,简单说轮廓就是一些列点相连组成形状、它们拥有同样的颜色、轮廓发现在图像的对象分析、对象检测等方面是非常有用的工具,在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
二:代码实现与演示
整个代码实现分为如下几步完成
- 加载图像,
- 图像二值化
- 轮廓发现
- 几何形状识别
- 测量周长、面积、计算中心
- 颜色提取
完整的源代码如下:
#################################################### # 作者:zhigang, #################################################### 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)) cv.imwrite("D:/test-result.png", self.draw_text_info(result)) return self.shapes def draw_text_info(self, image): c1 = self.shapes['triangle'] c2 = self.shapes['rectangle'] c3 = self.shapes['polygons'] c4 = self.shapes['circles'] cv.putText(image, "triangle: "+str(c1), (10, 20), cv.FONT_HERSHEY_PLAIN, 1.2, (255, 0, 0), 1) cv.putText(image, "rectangle: " + str(c2), (10, 40), cv.FONT_HERSHEY_PLAIN, 1.2, (255, 0, 0), 1) cv.putText(image, "polygons: " + str(c3), (10, 60), cv.FONT_HERSHEY_PLAIN, 1.2, (255, 0, 0), 1) cv.putText(image, "circles: " + str(c4), (10, 80), cv.FONT_HERSHEY_PLAIN, 1.2, (255, 0, 0), 1) return image if __name__ == "__main__": src = cv.imread("D:/javaopencv/gem_test.png") ld = ShapeAnalysis() ld.analysis(src) cv.waitKey(0) cv.destroyAllWindows()
原图
运行结果:
控制台输出:
欢迎继续关注本博客,学习OpenCV Python教程
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Oracle HA双机主备基于共享存储模式并利用keepalived管理实现高可用
HA概述 HA(High Available)即由两台计算机组成并对外提供一组相同的服务,也叫做一主一备模式。正常情况下由主服务器提供服务,备服务器处于待机备用,备机可以随时接替主服务器的工作。也就是当主服务器宕机或所提供的服务不可用时,备用服务器会主动激活并且替换主服务器继续提供服务,这时主服务器上的服务资源包括网络(IP)、存储、服务(Web/数据库)就会转移到备机接管,从而提供不间断的服务。基于此,便可以将服务器的宕机时间减少到最低,对业务实现不中断或短暂中断。 由一组计算机(多台)组成一个整体并向用户提供相同的网络资源或服务,这种模式叫做HA集群(High Available Cluster)。 Oracle HA Oracle HA高可用,又叫做双机热备,一般用于关键性业务。 Oracle双机热备模式 常用的有Data Guard、RAC(Real Application Clusters)、基于HA软件实现的双机热备。 作用和区别 l Data Guard采用重做日志复制技术,对主业务数据进行实时的异步同步备份,有一主一备、一主多备模式,一般常用于容灾(异地备份...
- 下一篇
十年老站吐血迁移实录
因为一些内容审查方面的原因,一个运行了很久的论坛被要求限期迁移出现有机房。管制很严,要求在1-2天内完成。论坛的文件(主要是图片及附件)100多G,数据库有80G。我评估了一下,导出数据,部署新环境,导入数据,调试到能正常访问,1-2天可能有点紧张,万一迁移不顺利,还得花费更多的时间。但没办法拒绝,先答应下来再说。 如果不想看文字,猛戳此处看视频,临场感更强。 跟其它技术人员讨论了一下,先临时采取投机取巧方式,应付检查,其措施如下: 1、在其它不受内容审核的地区,部署一个代理,用nginx就行。 2、修改现论坛web的监听端口(由80改成8989),暂时先不改,配好nginx反向代理以后,绑定本地hosts,域名指向新部署服务器的ip地址,访问确认没问题,再修改到8989端口。同时代理nginx转发端口也对应改成8989。 3、修改dns,把域名解析到代理web服务器的ip。 这样处理,避开了审查,为迁移赢得了时间。 安排异地机房的技术给我们部署系统,因为经验以及其它方面的原因,花了将近一天的时间才交付过来(幸亏采取了前边的临时措施)。为了加快进度,我们自己做了分工,一人负责新系统部署...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS6,CentOS7官方镜像安装Oracle11G
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能