OpenCV(图像处理)-基于Python-轮廓查找

news/2024/11/8 20:03:04/

在这里插入图片描述

轮廓查找

  • 1. 轮廓
  • 2.轮廓查找
    • 2.1 findContours()
    • 2.2 drawContours()
    • 2.3 contourArea()和arcLength()
    • 2.4 多边形逼近与凸包
    • approxPolyDP()
    • convexHull()
    • 2.5 外接矩形
    • minAreaRect()
    • boundingRect()

1. 轮廓

一个图像中具有相同颜色或强度(灰度图)的连续点所组成的集合,就是轮廓。轮廓可用于图形分析、物体的识别与检测等等。

2.轮廓查找

在图像中,为了防止轮廓边缘强弱不明显,需要先对图像进行二值化或Canny操作(一般改为黑底白字),画轮廓时会修改输入的图像。

2.1 findContours()

查找图形的轮廓
contours, hierarchy = cv2.findContours(img, mode, ApproximationMode…)
contours:查找到所有轮廓的列表(点的集合)
hierarchy:层级,轮廓有无顺序

mode:(检测方式)

  • RETR_EXTERNAL = 0 :表示只检测外部轮廓(红色为轮廓)
    在这里插入图片描述
  • RETR_LIST = 1 :检测的轮廓不建立等级关系,从里到外、从右到左,一层一层的编号,返回的列表也是按这个顺序排列的
    在这里插入图片描述
  • RETR_CCOMP = 2 :每层最多两级,从里到外、从右到左,单个图形,每两级为一层
    在这里插入图片描述
  • RETR_TREE = 3 :按树形存储轮廓 ,从右到左,从外到里,一个图形一个图像的来,符合正常逻辑
    在这里插入图片描述
    ApproximationMode:(逼近方式)
  • CHAIN_APPROX_NONE:保存所有轮廓上的点
  • CHAIN_APPROX_SIMPLE:只保存角点

2.2 drawContours()

根据获得到的坐标点(contours)绘制轮廓
cv2.drawContours(img, contours, contourIdx, color, thickness…)
img:需要画轮廓的图像
contours:轮廓的点集
contourldx:-1表示绘制所有轮廓 0~n
color:颜色(255,255,255)
thinckness:线宽,-1是全部填充,1~n

import cv2
import numpy as npimg = cv2.imread('./image/contours1.png')
# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化,使轮廓更明显
ret, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)# 获得轮廓列表
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)# 画全部的轮廓
cv2.drawContours(img, contours, -1, (0, 0, 255), 2)cv2.imshow('img', img)
# cv2.imshow('gray', gray)
cv2.imshow('binary', binary)cv2.waitKey(0) 

在这里插入图片描述

2.3 contourArea()和arcLength()

求轮廓的面积和周长
cv2.contourArea(contour)
contour:点集(轮廓)
cv2.arcLength(curve, closed)
curve:点集(轮廓)
closed:True/False是否是封闭的轮廓

# 计算面积
area = cv2.contourArea(contours[0])
print('面积 = %d' % area)# 计算周长
len = cv2.arcLength(contours[0], True)
print('周长 = %d' % len)

2.4 多边形逼近与凸包

多边形逼近就是按照画多边形的方式画出图形的轮廓,而凸包只需画出大概轮廓即可。左图为多边形逼近,右图为凸包。
在这里插入图片描述

approxPolyDP()

多边形逼近轮廓
approx = cv2.approxPolyDP(curve, epsilon, closed)
curve:点集(轮廓)
epsilon:精度(越小越逼近)
closed:是否是闭合的轮廓True/False
返回值approx是一个列表

import cv2
import numpy as npdef drawShape(src, points):i = 0while i<len(points):if i == len(points)-1:x1, y1 = points[i][0]x2, y2 = points[0][0]cv2.line(src, (x1, y1), (x2, y2), (0, 255, 0), 2)else:x1, y1 = points[i][0]x2, y2 = points[i+1][0]cv2.line(src, (x1, y1), (x2, y2), (0, 255, 0), 2)i = i+1img = cv2.imread('./image/hand.png')
# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化,使轮廓更明显
ret, binary = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)# 获得轮廓列表
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)# 多边形逼近法
e = 5
approx = cv2.approxPolyDP(contours[0], e, True)
drawShape(img, approx)
print(approx[0][0])cv2.imshow('img_5', img)
# cv2.imshow('gray', gray)
cv2.imshow('binary', binary)cv2.waitKey(0)

分别是精度为20,精度为5的逼近图像
在这里插入图片描述

convexHull()

凸包
hull = cv2.convexHull(points, clockwise, …)
points:轮廓
clockwose:是否顺时针绘制True/False
返回值同样是一个列表

import cv2
import numpy as npdef drawShape(src, points):i = 0while i<len(points):if i == len(points)-1:x1, y1 = points[i][0]x2, y2 = points[0][0]cv2.line(src, (x1, y1), (x2, y2), (0, 255, 0), 2)else:x1, y1 = points[i][0]x2, y2 = points[i+1][0]cv2.line(src, (x1, y1), (x2, y2), (0, 255, 0), 2)i = i+1img = cv2.imread('./image/hand.png')
# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化,使轮廓更明显
ret, binary = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)# 获得轮廓列表
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)# 凸包
hull = cv2.convexHull(contours[0])
drawShape(img, hull)cv2.imshow('img', img)
cv2.imshow('binary', binary)cv2.waitKey(0)

在这里插入图片描述

2.5 外接矩形

分为最大外接矩形和最小外接矩形,如下图所示。
在这里插入图片描述

minAreaRect()

最小外接矩形
RotatedRect = cv2.minAreaRect(points)
points:点集(轮廓)
返回值:矩形中心点坐标,宽高,旋转角度

boundingRect()

最大外接矩形
x, y, w, h = cv2.boundingRect(array)
array:点集(轮廓)
返回值是矩形的列表:(x,y是起始坐标,w是宽度,h是高度)

import cv2
import numpy as npimg = cv2.imread('./image/hello.jpeg')
# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化,使轮廓更明显
ret, binary = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)# 获得轮廓列表
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)# 获取最小外接矩阵,中心点坐标,宽高,旋转角度
r = cv2.minAreaRect(contours[1])
# 获取矩形四个顶点,浮点型
box = cv2.boxPoints(r)
# 取整
box = np.intp(box)
# 画轮廓
cv2.drawContours(img, [box], -1, (0, 255, 0), 2)# 获取最大外接矩形
x, y, w, h = cv2.boundingRect(contours[1])
# 画矩形
cv2.rectangle(img, (x, y), (x+w, y+h),(255, 0, 0), 2)cv2.imshow('img', img)
cv2.imshow('binary', binary)cv2.waitKey(0)

在这里插入图片描述


http://www.ppmy.cn/news/484330.html

相关文章

电压电流的驱动能力分析以及计算方法

&#xff08;文章为笔者学习过程中看到的&#xff0c;感觉帮助较大&#xff0c;分享出来希望能帮助到大家&#xff09; 在电子电路中为什么有的地方电压会被拉低2&#xff0c;驱动能力是什么意思&#xff0c;如何提高驱动能力&#xff1f; 在很多资料上看到说驱动能力不够是因…

拆解USB电压电流表,并分析测量原理(转数码之家)测电流需串一小电阻到电路。测电压不用按照文中,可以直接让电压正进AD的输入端口测试

收拾物品的时候&#xff0c;发现了一个USB电压测量表然后就有了以下拆解完后&#xff0c;发现它测量原理很简单&#xff0c;利用了电路的串并联的分压与分流来进行测量&#xff0c;测量精度取决于采样电阻与AD的精度&#xff0c;如果精度使用环境中不是很高&#xff0c;这种做法…

INA230测量电压电流功率

INA320测量电压电流功率 INA320 可以测量电压电流功率 基本ADC功能 可以测试分流电阻的电流和VBUS的电压 工作电压2.7--5.5V 可以测量电压为0---28V 测量电流是VIN VIN-&#xff0c;测量电压是VBUS 对地的电压 VBUS电压寄存器每个单位是1.25mv&#xff0c;最大量程是40.98V&am…

【AUTOSAR】UDS协议的代码分析与解读(九)----UDS读取数据2Ah

8.11 读取数据(周期标识符) Read Data By Periodic Identifier (2Ah) 此服务允许诊断工具请求读取ECU中由一个或多个周期数据标识符(periodic Data Identifier)标识 的周期发送的数据记录值。 在初始响应报文之后&#xff0c;有两种方式来发送周期数据响应报文给诊断工具。本规…

湖大CG满分教程:作业训练一编程题9. 二叉树遍历,从前序、中序到后序

【问题描述】 二叉树是一种非常重要的数据结构&#xff0c;非常多其他数据结构都是基于二叉树的基础演变而来的。对于二叉树&#xff0c;深度遍历有前序、中序以及后序三种遍历方法。 三种基本的遍历思想为&#xff1a; 前序遍历&#xff1a;根结点 ---> 左子树 ---> …

下拉加载刷新

注意传参没有pageNo的话,就不能实现下拉刷新,因为不知道当前要加载哪页的内容 const [list, setList] useState<IgetListUserResponce[data]>(); const [showLoading, setShowLoading] useState(false);const memoState useMemo<{pageNo: number;total: number;ca…

electron 连接打印机打印pdf文件

electron 打印内容 区分系统 类似unix系统的使用 npm包&#xff1a;unix-printwindow系统使用&#xff1a; pdf-to-printer 运行线程 视图线程 函数参数 两个包都提供了print函数来打印文件&#xff0c;配置基本一致&#xff0c;只是参数形式有所不同&#xff0c;pdf-to-pr…

保证水库大坝安全需要做好哪方面的监测

水库安全监测是保证水库大坝安全的重要手段是确保水库大坝安全运行的基础也是做好水库安全管理的重要技术保障。根据《水库大坝安全管理条例》《水库大坝安全监测技术规范》等有关规定&#xff0c;对坝体变形、渗透、应力应变等进行监测&#xff0c;以掌握坝体、坝基和库岸的运…