cv2.drawContours

article/2025/9/22 15:56:34

参考cv2.drawContours - 云+社区 - 腾讯云

1.1什么是轮廓
轮廓可以简单认为成连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析和物体的检测和识别中很有用。

  • 为了准确,要使用二值化图像。需要进行阀值化处理或者Canny边界检测。
  • 查找轮廓的函数会修改原始图像。如果之后想继续使用原始图像,应该将原始图像储存到其他变量中。
  • 在OpenCV中,查找轮廓就像在黑色背景中超白色物体。你应该记住,要找的物体应该是白色而背景应该是黑色。
    如何在一个二值图像中查找轮廓。
    函数cv2.findContours()有三个参数,第一个是输入图像,第二个是轮廓检索模式,第三个是轮廓近似方法。返回值有三个,第一个是图像,第二个是轮廓,第三个是(轮廓的)层析结构。轮廓(第二个返回值)是一个Python列表,其中储存这图像中所有轮廓。每一个轮廓都是一个Numpy数组,包含对象边界点(x,y)的坐标。
    1.2怎样绘制轮廓
    函数cv2.drawContours()可以被用来绘制轮廓。它可以根据你提供的边界点绘制任何形状。它的第一个参数是原始图像,第二个参数是轮廓,一个python列表,第三个参数是轮廓的索引(在绘制独立轮廓是很有用,当设置为-1时绘制所有轮廓)。接下来的参数是轮廓的颜色和厚度。
    在一幅图像上绘制所有的轮廓:
import numpy as np
import cv2img = cv2.imread('1024.jpg')
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
image ,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#绘制独立轮廓,如第四个轮廓
#imag = cv2.drawContour(img,contours,-1,(0,255,0),3)
#但是大多数时候,下面方法更有用
imag = cv2.drawContours(img,contours,3,(0,255,0),3)while(1):cv2.imshow('img',img)cv2.imshow('imgray',imgray)cv2.imshow('image',image)cv2.imshow('imag',imag)if cv2.waitKey(1) == ord('q'):break
cv2.destroyAllWindows()

1.3轮廓的近似方法
之前提到轮廓是一个形状具有相同灰度值的边界,它会存储形状边界上所有的(x,y)坐标。实际上我们不需要所有的点,当需要直线时,找到两个端点即可。cv2.CHAIN_APPROX_SIMPLE可以实现。它会将轮廓上的冗余点去掉,压缩轮廓,从而节省内存开支。
下面用矩阵来演示,在轮廓列表中的每一个坐标上画一个蓝色圆圈。第一个显示使用cv2.CHAIN_APPROX_NONE的效果,一共734个点,第二个图是使用cv2.CHAIN_APPROX_SIMPLE的结果,只有4个点。

2.轮廓特征
2.1矩
图像的矩可以帮助我们计算图像的质心,面积等。
函数cv2.moments()会将计算得到的矩以一个字典的形式返回。

import numpy as np
import cv2img = cv2.imread('1024.jpg',0)
ret,thresh = cv2.threshold(img,127,255,0)
image,contours,hierarchy=cv2.findContours(thresh,1,2)
cnt=contours[0]
M=cv2.moments(cnt)
print(M)

根据这些矩的值,我们可以计算出对象的重心:

cx=int(M['m10']/M['m00'])
cy=int(M['m01']/M['m00'])

2.2轮廓面积
可以使用函数cv2.contourArea()计算得到,也可以用矩(0阶矩),M['m00']。

area=cv2.contourArea(cnt)

2.3轮廓周长
也被称为弧长。可以使用函数cv2.arcLength()计算得到。这个函数的第二参数可以用来指定对象的形状是闭合的(True),还是打开的(一条曲线)。

perimeter = cv2.arcLength(cnt,True)

2.4轮廓近似
将轮廓形状近似到另外一种由更少点组成的轮廓形状,新轮廓的点的数目由我们设定的准确度来决定,使用的Douglas-Peucker算法,可以自己Google。
假设我们要在一幅图像中查找一个矩形,但是由于图像的种种原因我们不能得到一个完美的矩形,而是一个“坏形状”,现在就可以使用这个函数来近似这个形状,第二个参数是epsilon,它是从原始轮廓到近似轮廓的最大距离,它是一个准确度参数。

epsilon=0.1*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)

2.5凸包
凸包与轮廓近似相似,但不同,虽然有些情况下它们给出的结果是一样的。函数cv2.convexHull()可以用来检测一个曲线是否具有凸性缺陷,并能纠正缺陷。一般来说,凸性曲线总是凸出来的,至少是平的。如果有地方凹进去了就被叫做凸性缺陷。例如下图中的手,红色曲线显示了手的凸包,凸性缺陷被双箭头标出来了。

hull = cv2.convexHull(points,hull,clockwise,returnPoints)

参数:

  • points我们要传入的轮廓
  • hull输出,通常不需要
  • clockwise方向标志,如果设置为True,输出的凸包是顺时针方向的,否则为逆时针方向。
  • returnPoints默认值为True。它会返回凸包上点的坐标,如果设置为False,就会返回与凸包点对应的轮廓上的点。
    要获得上图的凸包,可以用下面命令:
hull=cv2.convexHull(cnt)

但是如果你想获得凸性缺陷,需要把returnPoints设置为False。以上面矩形为例,首先我们找到他的轮廓从cnt。现在把returnPoints设置为True查找凸包,得到的就是矩形的四个角点。把returnPoints设置为False,得到的是轮廓点的索引。
2.6凸性检测
函数cv2.isContourConvex()可以检测一个曲线是不是凸的。它只能返回True或者False。

k=cv2.isContourConvex(cnt)

2.7边界矩形
直边界矩形,一个直矩形,没有旋转。不会考虑对象是否旋转。所以边界矩形的面积不是最小的。可以使用函数cv2.boundingRect()查找得到

#(x,y)为矩形左上角的坐标,(w,h)是矩形的宽和高
x,y,w,h=cv2.boundingRect(cnt)
img=cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

旋转的边界矩形,这个边界矩形是面积最小的,因为它考虑了对象的旋转。用函数cv2.minAreaRect()。返回的是一个Box2D结构,其中包含矩形最上角角点坐标(x,y)矩形的宽和高(w,h)以及旋转角度。但是要绘制这个矩形需要矩形的4个角点,可以通过函数cv2.boxPoints()获得。
其中绿色的为直矩形,红色为旋转矩形。

2.8最小外接圆
函数cv2.minEnclosingCircle()可以帮我们找到一个对象的外接圆。它是所有能够包括对象的圆中面积最小的一个。

(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
img = cv2.circle(img,center,radius,(0,255,0),2)

2.9椭圆拟合
使用函数cv2.ellipse(),返回值其实就是旋转边界矩形的内切圆。

ellipse = cv2.fitEllipse(cnt)
img = cv2.ellipse(img,ellipse,(0,255,0),2)

2.10直线拟合
可以根据一组点拟合出一条直线,同样我们也可以为图像中的白色点拟合出一条直线。

rows,cols = img.shape[:2]
[vx,vy,x,y]=cv2.fitLine(cnt,cv2.DIST_L2,0,0.01,0.01)
lefty=int((x*vy/vx)+y)
righty=int(((cols-x)*vy/vx)+y)
img = cv2.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)


http://chatgpt.dhexx.cn/article/Qfir9VBA.shtml

相关文章

python cv2模块安装,python cv2模块怎么安装

安装方法:1、配置python环境;2、打开cmd命令窗口,执行“python”命令检查环境是否配置好;3、如果配置成功,则执行“exit()”命令;4、执行“pip install opencv-python”命令来安装cv2模块。 本教程操作环境…

python 安装 cv2 - 已解决

我的网站已上线 http://javapub.net.cn/ 建议收藏 提供多种操作,一定有一种适合你的 文章目录 1. 传统方式12. 第一阶段 终极办法013. 第二阶段 终极办法024. 终极办法3附加 情况就这么个情况,就是装不上。本文没一句废话,仔细阅读。 1. 传…

图像处理——Image和cv2

1、打开图像 # 路径可带汉字,图像数据RGB image Image.open(test.jpg)# 路径不可带汉字,图像数据BGR cv2image cv2.imread(test.jpg) # 路径可带汉字,图像数据BGR # cv2.IMREAD_COLOR:默认参数,读入彩色图像&#…

cv2.contourArea函数详解

问题:cv2.findContours找到所有的轮廓之后,想取出包含面积最大的轮廓,用cv2.contourArea算一下,但是得到的结果跟实际差别相当大,最大轮廓面积的计算成很小的一个值,而其中一个不太起眼的区域被计算得倒最大…

计算机视觉 – Computer Vision | CV

计算机视觉(Computer Vision)是人工智能领域的一个重要分支。它的目的是:看懂图片里的内容。 本文将介绍计算机视觉的基本概念、实现原理、8 个任务和 4 个生活中常见的应用场景。 计算机视觉为什么重要? 人的大脑皮层&#xff0…

Py之cv2:cv2库(OpenCV,opencv-python)的简介、安装、使用方法(常见函数、方法等)最强详细攻略

关于OpenCV简介 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C 类构成,同时提供了Python、Ruby、MATLAB等语言的接…

Python第三方cv2库介绍

Python第三方cv2库介绍 CV2指的是OpenCV2(Open Source Computer Vision Library),是一个开源的库平台计算机视觉库。有很强大的图片处理功能,可实现图像处理和计算机视觉方面的很多通用算法。 OpenCV官网文档 https://docs.open…

cv2安装与基本函数

简介 cv2是一个python的图像处理库,依赖c的opencv库处理图像。 安装 使用 pip install numpy pip install opencv-python 即可安装cv2及numpy 输入 >>> import cv2 >>> import numpy as np#cv2读取的图片都是numpy数组 >>> cv2.__…

Py之cv2:cv2(OpenCV,opencv-python)库的简介、安装、使用方法(常见函数、图像基本运算等)最强详细攻略

Py之cv2:cv2(OpenCV,opencv-python)库的简介、安装、使用方法(常见函数、图像基本运算等)最强详细攻略 目录 cv2(OpenCV,opencv-python)库的简介 1、OpenCV应用领域 1.1、计算机视觉领域方向 1.2、计算机操作底层技术 cv2(OpenCV&#x…

常用的SQL语句

删除数据库中表的某些相同的某些记录 OR 查找数据库的表中的相同记录 一、删除数据库中表的某些相同的某些记录 delete from tablename where only_Id not in(select min(only_id) from tablename group by sameName) 二、选出相同记录的SQL语句 AND 删除相同记录的SQL语句…

数据库基础(常用SQL语句)

一、数据库级及SQL语言简介 1、目前主流数据库 微软:sql server、access 瑞典:mysql ibm: db2 sybase:sybase ibm: informix oracle: oracle 2、SQL语言 DQL-------------数据查询语言 select … From … Where DML-------------数据操纵语言 insert、…

SQL基本语句(整理)

一、DDL(Data Definition Language) 数据定义语言,用来定义数据库对象(数据库,表,字段) ①查询 查询所有数据库 show databases; 查询当前数据库 select database(); ②创建 create database [if not exists] 数…

SQL常用语句(基础篇)

SQL常用语句(基础篇) 说明:创建数据库 CREATE DATABASE database-name 说明:删除数据库 drop database dbname 说明:备份sql server —创建备份数据的device USE master EXEC sp_addumpdevice ‘disk’,‘testBac…

SQL最常用的语句

语法: 一步步由浅到深,这里用的都是mysql做的。 基础: 连接数据库: mysql -h10.20.66.32 -uroot -p123456 1 -h后面是mysqlServer所在地址,-u后面是用户名,-p后面是密码。 查看数据库 show database…

数据库常用sql语句总结

查看时右侧可以打开CSDN自带的目录,方便查看 目录 一、基础 1.SELECT 语句 2.SELECT DISTINCT 语句 3.WHERE 子句 4.AND 和 OR 运算符 5.ORDER BY 语句 6.INSERT INTO 语句 7.Update 语句 8.DELETE 语句 二、高级 1.TOP 子句 2.LIKE 操作符 3.SQL 通配…

10个必须掌握的SQL常用语句

世界上70%的相关性数据可以被储存为表格数据,即类似Excel,Csv类型的数据,如何去查询和分析相关性的数据?对于少量数据,我们可以使用Excel,更多一点数据,我们可以使用Python, pandas 处理大数据 …

从零开始USRP+GNRRADIO系列(基础入门篇和C++自定义模块)

从零开始USRPGNRRADIO系列(基础入门篇) 文章目录 从零开始USRPGNRRADIO系列(基础入门篇)usrp简介创建第一个usrp图C自定义模块 usrp简介 通用软件无线电外设(USRP)是由Ettus Research及其母公司National I…

入门学习计算机第十八天——自定义数据类型(结构体)

入门学习计算机第十八天——自定义数据类型(结构体) 编译器:Microsoft Visual Studio 2019 自定义类型: 结构体枚举联合体 结构体 结构体类型的声明 结构的基础知识 结构是一些值的集合,这些值称为成员变量 结构的…

【计算机基础】

文章目录 线程、协程的状态 计算机网络DNS解析 计算机基础进程间通讯的7种方式讲一下程序的虚拟内存、常驻内存和逻辑内存。堆和栈是存啥的?什么是大小端? 什么是死锁?什么情况下会发生(避免)死锁?死锁产生的4个必要条…

计算机基础(1)

目录 一、计算机发展 1.1计算机发展史 1.2计算机分类 1.2.1按规模划分 1.2.2服务器与客户机 1.2.2.1 服务器按外形分类 1.3服务器硬件 一、计算机发展 1.1计算机发展史 1、第一代计算机(1946-1957) 电子管时代 冯诺依曼体系结构:数字计算机的数制采用二进…