0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenCV中几何形状识别与测量

OpenCV学堂 来源:OpenCV学堂 作者:OpenCV学堂 2022-06-02 15:31 次阅读

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]) + ")"

运行显示原图如下:

a8ed07b0-e191-11ec-ba43-dac502259ad0.png

分析结果:

a923e762-e191-11ec-ba43-dac502259ad0.png

控制台输出:

a9471d18-e191-11ec-ba43-dac502259ad0.png

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 几何
    +关注

    关注

    0

    文章

    37

    浏览量

    12313
  • 测量
    +关注

    关注

    10

    文章

    4596

    浏览量

    110532
  • OpenCV
    +关注

    关注

    29

    文章

    622

    浏览量

    41069

原文标题:OpenCV中几何形状识别与测量

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    opencv图像识别有什么算法

    图像识别算法: 边缘检测 :边缘检测是图像识别的基本步骤之一,用于识别图像的边缘。常见的边缘检测算法有Canny边缘检测器、Sobel边
    的头像 发表于 07-16 10:40 343次阅读

    基于OpenCV的人脸识别系统设计

    基于OpenCV的人脸识别系统是一个复杂但功能强大的系统,广泛应用于安全监控、人机交互、智能家居等多个领域。下面将详细介绍基于OpenCV的人脸识别系统的基本原理、实现步骤,并附上具体
    的头像 发表于 07-11 15:37 1.1w次阅读

    精准测量第一步:如何选择合适的几何尺寸测量仪器?

    在现代工业和制造业几何尺寸测量是确保产品质量和精度的关键环节。选择合适的几何尺寸测量仪器,不仅能提升
    的头像 发表于 07-01 10:46 207次阅读
    精准<b class='flag-5'>测量</b>第一步:如何选择合适的<b class='flag-5'>几何</b>尺寸<b class='flag-5'>测量</b>仪器?

    机床的几何精度什么和什么时是有区别的

    机床的几何精度是指机床在加工过程,其各部件的几何形状和相互位置精度。它直接关系到机床的加工精度和加工质量。机床的几何精度主要包括机床的直线
    的头像 发表于 06-07 10:31 627次阅读

    三坐标测量需要哪些基础知识?

    三坐标测量(CoordinateMeasuringMachine,CMM)是一种利用测头沿三个坐标轴移动来测量工件几何尺寸和形状的精密测量
    的头像 发表于 05-17 09:51 1664次阅读
    三坐标<b class='flag-5'>测量</b>需要哪些基础知识?

    基于图像处理技术的螺纹几何参数测量系统设计

    摘要:针对螺纹几何参数测量过程中,传统人工测量效率低、仪器昂贵、耗时费力、偶伴有人为误差等不足。本研究采用非接触测量的方法, 利用计算机视觉的图像处理技术,通过系统标定、图像采集、图像
    的头像 发表于 01-15 11:13 720次阅读
    基于图像处理技术的螺纹<b class='flag-5'>几何</b>参数<b class='flag-5'>测量</b>系统设计

    几何尺寸测量工具介绍

    原理测量物体的三维形状,到百米级激光跟踪仪高精度(μm级)、大工作空间(百米级)的坐标和空间姿态测量,大大提高了几何尺寸测量仪器设备的精度和
    的头像 发表于 12-26 17:16 842次阅读
    <b class='flag-5'>几何</b>尺寸<b class='flag-5'>测量</b>工具介绍

    几何测量基本原理及精密仪器

    从纳米级光学3D表面轮廓仪通过光学原理测量物体的三维形状,到百米级激光跟踪仪高精度(μm级)、大工作空间(百米级)的坐标和空间姿态测量,越来越多高精度测量仪器被应用于
    的头像 发表于 12-20 16:43 648次阅读
    <b class='flag-5'>几何</b>量<b class='flag-5'>测量</b>基本原理及精密仪器

    几何量公差与检测基本原理及测量仪器

    三本精密仪器小编获悉,在现代科技的发展几何测量已经成为许多工程领域不可或缺的一部分。通过准确测量物体的形状、尺寸等
    的头像 发表于 12-20 15:48 509次阅读
    <b class='flag-5'>几何</b>量公差与检测基本原理及<b class='flag-5'>测量</b>仪器

    如何在 CFD 设计利用网格维护几何形状并减少运行时间?

    如何在 CFD 设计利用网格维护几何形状并减少运行时间?
    的头像 发表于 11-24 17:07 395次阅读
    如何在 CFD 设计<b class='flag-5'>中</b>利用网格维护<b class='flag-5'>几何</b><b class='flag-5'>形状</b>并减少运行时间?

    对于形状近似矩形但边缘有规则起伏的情况,可以使用OpenCV的approxPolyDP函数进行多边形拟合和矩形检测。

    对于形状近似矩形但边缘有规则起伏的情况,可以使用OpenCV的approxPolyDP函数进行多边形拟合和矩形检测。 approxPolyDP函数通过在给定的点集上使用动态规划算法,计算出近似
    发表于 11-01 09:23

    智能车识别图an用openmv还是用opencv

    智能车创意组识别图an用openmv 还是用 opencv 比较好
    发表于 10-24 06:24

    【幸狐Core3566模组试用体验】基于openCV的猫脸识别

    本文主要介绍如何基于openCV来实现一个简单的猫脸识别应用。
    的头像 发表于 09-25 09:05 828次阅读
    【幸狐Core3566模组试用体验】基于<b class='flag-5'>openCV</b>的猫脸<b class='flag-5'>识别</b>

    【幸狐 Core3566 模组试用体验】基于openCV的猫脸识别

    本文主要介绍如何基于openCV来实现一个简单的猫脸识别应用。 一、基础准备 首先需要安装openCV,因为python版的方便点,所以直接安装python版openCV,通过命令su
    发表于 09-24 23:50

    OpenCV的BGR格式,在libyuv对应的那个格式?OpenCV的RGB格式呢?

    OpenCV的BGR格式,在libyuv对应的那个格式?OpenCV的RGB格式呢?
    发表于 09-19 06:00