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
二:代码实现与演示
基于轮廓发现与多边形逼近、几何距实现几何形状识别与对象测量,测量时候还用到另外两个相关API分别是计算轮廓的周长与面积。具体用法在代码中体现。整个代码实现分为如下几步完成:1.图像二值化
# 二值化图像
print("start to detect lines... ")
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)
2.轮廓发现
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)
3.几何形状识别
# 轮廓逼近
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 = "多边形"
4.测量周长、面积、计算中心
# 求解中心位置
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)
# 计算面积与周长
p = cv.arcLength(contours[cnt], True)
area = cv.contourArea(contours[cnt])
5.颜色提取
# 颜色分析
color = frame[cy][cx]
color_str = "(" + str(color[0]) + ", " + str(color[1]) + ", " + str(color[2]) + ")"
运行显示原图如下:
分析结果:
控制台输出:
审核编辑 :李倩
-
几何
+关注
关注
0文章
37浏览量
12389 -
测量
+关注
关注
10文章
4963浏览量
111907 -
OpenCV
+关注
关注
31文章
635浏览量
41615
原文标题:OpenCV中几何形状识别与测量
文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
如何用OpenCV进行手势识别--基于米尔全志T527开发板
![如何用<b class='flag-5'>OpenCV</b>进行手势<b class='flag-5'>识别</b>--基于米尔全志T527开发板](https://file.elecfans.com/web2/M00/08/64/pYYBAGDwFEGADIPWAAFlJOlmLxg664.jpg)
【AI实战项目】基于OpenCV的“颜色识别项目”完整操作过程
![【AI实战项目】基于<b class='flag-5'>OpenCV</b>的“颜色<b class='flag-5'>识别</b>项目”完整操作过程](https://file1.elecfans.com/web3/M00/01/9C/wKgZPGdWrW6ALvshAAAgxUs2CfI310.png)
影响超声波液位计测量结果的因素
OpenCV图像识别C++代码
opencv图像识别有什么算法
opencv-python和opencv一样吗
基于OpenCV的人脸识别系统设计
cmm三坐标测量仪精准掌握形状与位置公差
![cmm三坐标<b class='flag-5'>测量</b>仪精准掌握<b class='flag-5'>形状</b>与位置公差](https://file1.elecfans.com/web2/M00/F2/D0/wKgZomZ6bQ2AMEWDAADiR1TKcbE650.png)
OpenCV携奥比中光3D相机亮相CVPR 2024
机床的几何精度什么和什么时是有区别的
ELF 1技术贴|如何在Ubuntu中编译OpenCV库
![ELF 1技术贴|如何在Ubuntu<b class='flag-5'>中</b>编译<b class='flag-5'>OpenCV</b>库](https://file1.elecfans.com/web2/M00/EB/90/wKgaomZZjUuAPcB7AAA6n2s3T5U762.png)
评论