Opencv查找、绘制轮廓、圆形矩形轮廓和近似轮廓

查找、绘制轮廓、圆形矩形轮廓和近似轮廓

目录

  • 查找、绘制轮廓、圆形矩形轮廓和近似轮廓
    • [1 轮廓查找和绘制](#1 轮廓查找和绘制)
      • [1.1 轮廓查找](#1.1 轮廓查找)
        • [1.1.1 函数和参数](#1.1.1 函数和参数)
        • [1.1.2 返回值](#1.1.2 返回值)
      • [1.2 轮廓绘制](#1.2 轮廓绘制)
        • [1.2.1 函数和参数](#1.2.1 函数和参数)
      • [1.3 步骤](#1.3 步骤)
      • [1.4 实际测试绘制轮廓](#1.4 实际测试绘制轮廓)
    • [2 绘制近似轮廓](#2 绘制近似轮廓)
      • [2.1 函数和参数](#2.1 函数和参数)
      • [2.2 查找特定轮廓](#2.2 查找特定轮廓)
      • [2.3 近似轮廓测试](#2.3 近似轮廓测试)
    • [3 绘制圆形矩形轮廓](#3 绘制圆形矩形轮廓)
      • [3.1 圆形函数和参数](#3.1 圆形函数和参数)
      • [3.2 矩形函数和参数](#3.2 矩形函数和参数)
      • [3.3 实际测试](#3.3 实际测试)

1 轮廓查找和绘制


1.1 轮廓查找

1.1.1 函数和参数

cv2.findContours(图片,检索方式,轮廓近似方法)

  • 图片最好为二值图,即非黑即白,非0即255
  • 检索方式
    • cv2.RETR_TREE,只检测外轮廓
    • cv2.RETR_LIST,检测轮廓,不建立等级关系,所有轮廓在同一等级
    • cv2.RETR_CCOMP,检测轮廓,建立两个等级关系,一个对象的外轮廓是第一级组织结构,内部空洞轮廓为第二级组织机构,空洞中的任何对象的轮廓又是第一级组织机构
    • cv2.RETR_TREE,返回所有轮廓,建立一个完整的组织机构轮廓
  • 轮廓近似方法
    • cv2.CHAIN_APPROX_NONE,存储所有轮廓点
    • cv2.CHAIN_APPROX_SIMPLE,压缩模式,只保留该方向的终点坐标
1.1.2 返回值

_,contours,hier = cv2.findContours(con_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

  • contours ,包括查找的所有轮廓的list对象 ,其中每一个独立的轮廓信息以边界点坐标(x,y)存在numpy数组中
  • hierarchy,轮廓层次结构,当前轮廓同层下一轮廓,当前轮廓同层上衣轮廓,当前轮廓子轮廓,当前轮廓父轮廓

1.2 轮廓绘制

1.2.1 函数和参数

con_con = cv2.drawContours(img片,contours=contours,contourIdx=-1,color=(255,0,0),thickness=3)

  • img绘制轮廓的图片
  • contours=contours轮廓,
  • contourIdx=-1轮廓索引值,-1表示全部
  • color=(255,0,0)绘制线条颜色,
  • thickness=3线条大小
    返回值为根据设置绘制轮廓的图像

1.3 步骤

  • 图片
  • 灰度图
  • 二值图
  • 根据二值图查找轮廓返回轮廓
  • 根据返回轮廓在图像上绘制轮廓,返回图像

1.4 实际测试绘制轮廓

原图:

代码展示:

python 复制代码
import cv2
con = cv2.imread('con.png')
con_0 = cv2.imread('con.png',0)
r,con_binary = cv2.threshold(con_0,125,255,cv2.THRESH_BINARY)
_,contours,hier = cv2.findContours(con_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
con_copy = con.copy()
con_con_1 = cv2.drawContours(con_copy,contours=contours,contourIdx=-1,color=(255,0,0),thickness=3)
con_copy = con.copy()
con_con1 = cv2.drawContours(con_copy,contours=contours,contourIdx=1,color=(255,0,0),thickness=3)
cv2.imshow('con',con )
cv2.waitKey(0)
cv2.imshow('con_binary',con_binary)
cv2.waitKey(0)
cv2.imshow('con_con1',con_con1)
cv2.waitKey(0)
cv2.imshow('con_con_1',con_con_1)
cv2.waitKey(0)

运行结果:

2 绘制近似轮廓


2.1 函数和参数

  • arc_0005=0.005*cv2.arcLength(contours1,True),计算轮廓长度
    • 0.005表示近似的程度,值越小,近似的点越多,值越大近似的点越少,线条越多少
    • contours1为要近似的目标轮廓,True,表示曲线是闭合
    • arc_0005为返回值,为近似后的轮廓周长数值,
  • apporx_0005 = cv2.approxPolyDP(max_area_con,arc_0005,True),返回值为逼近的轮廓,需要加\[\]使用
  • cv2.drawContours(con_copy,apporx_0005,contourIdx=-1,color=(0,0,255),thickness=3)
    • con_copy,绘制轮廓的图像,
    • apporx_0005,返回的轮廓
    • contourIdx=-1,表示索引全部
    • color=(255,0,0)绘制线条颜色
    • thickness=3线条大小

2.2 查找特定轮廓

这里找的是最大的轮廓

原图:

代码展示:

python 复制代码
import cv2
con = cv2.imread('wang.png')
con_0 = cv2.imread('wang.png',0)
r,con_binary = cv2.threshold(con_0,125,255,cv2.THRESH_BINARY)
_,contours,hier = cv2.findContours(con_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
con_area = [(i,cv2.contourArea(i)) for i in contours]
## 排序
con_area_sorted = sorted(con_area,key=lambda x:x[1],reverse=True)
max_area_con = con_area_sorted[1][0]
arc_0005 = 0.005*cv2.arcLength(max_area_con,True)
apporx_0005 = cv2.approxPolyDP(max_area_con,arc_0005,True)
con_copy = con.copy()
con_0005 = cv2.drawContours(con_copy,[apporx_0005],contourIdx=-1,color=(255,0,0),thickness=3)
cv2.imshow('con',con)
cv2.waitKey(0)
cv2.imshow('con_0005',con_0005)
cv2.waitKey(0)

运行结果:

2.3 近似轮廓测试

原图:

代码展示:

python 复制代码
import cv2
con = cv2.imread('kl.jpg')
con_0 = cv2.imread('kl.jpg',0)
r,con_binary = cv2.threshold(con_0,125,255,cv2.THRESH_BINARY)
_,contours,hier = cv2.findContours(con_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
arc_0005= 0.005*cv2.arcLength(contours[1],True)
arc_001 = 0.01*cv2.arcLength(contours[1],True)
arc_005 = 0.05*cv2.arcLength(contours[1],True)
apporx_0005 = cv2.approxPolyDP(contours[1],arc_0005,True)
apporx_001 = cv2.approxPolyDP(contours[1],arc_001,True)
apporx_005 = cv2.approxPolyDP(contours[1],arc_005,True)
con_copy = con.copy()
con_0005 = cv2.drawContours(con_copy,[apporx_0005],contourIdx=-1,color=(0,0,255),thickness=3)
con_copy = con.copy()
con_001 = cv2.drawContours(con_copy,[apporx_001],contourIdx=-1,color=(0,0,255),thickness=3)
con_copy = con.copy()
con_005 = cv2.drawContours(con_copy,[apporx_005],contourIdx=-1,color=(0,0,255),thickness=3)
cv2.imshow('con',con)
cv2.waitKey(0)
cv2.imshow('con_0005 ',con_0005)
cv2.waitKey(0)
# #
cv2.imshow('con_001',con_001)
cv2.waitKey(0)
cv2.imshow('con_005 ',con_005)
cv2.waitKey(0)

运行结果:

3 绘制圆形矩形轮廓


3.1 圆形函数和参数

  • (x,y),m = cv2.minEnclosingCircle(contours7)
    • (x,y)坐标,m,圆形轮廓半径
    • contours7,轮廓
  • circle = cv2.circle(con_copy,(int(x),int(y)),int(m),(255,0,0),2)
    • con_copy,绘制图像
    • (int(x),int(y)),int(m),坐标和半径,要求是整数
    • (255,0,0)颜色,2线条大小
    • circle,返回的绘制好的图像

3.2 矩形函数和参数

  • x,y,w,h = cv2.boundingRect(contours7)
    • x,y,w,h (x,y)起始坐标,矩形轮廓宽高
  • rectangle = cv2.rectangle(con_copy,(x,y),(x+w,y+h),(255,0,0),2)
  • (x,y)起始坐标,(x+w,y+h)矩形结束坐标

3.3 实际测试

原图:

代码展示:

python 复制代码
import cv2
con = cv2.imread('con.png')
con_0 = cv2.imread('con.png',0)
r,con_binary = cv2.threshold(con_0,125,255,cv2.THRESH_BINARY)
_,contours,hier = cv2.findContours(con_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
(x,y),m = cv2.minEnclosingCircle(contours[7])
con_copy = con.copy()
circle = cv2.circle(con_copy,(int(x),int(y)),int(m),(255,0,0),2)
x,y,w,h = cv2.boundingRect(contours[7])
con_copy = con.copy()
rectangle = cv2.rectangle(con_copy,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('circle',circle)
cv2.waitKey(0)
cv2.imshow('rectangle',rectangle)
cv2.waitKey(0)

运行结果:

相关推荐
sell-cloud24 分钟前
Prompt Engineering要凉了?Fable 5.5能“猜“意图,但银行正在封杀AI Agent——企业AI的真正护城河是什么
人工智能·prompt
Navicat中国2 小时前
Navicat 18 内置 AI 助手让数据库开发从繁琐操作迈向智能协作
大数据·人工智能·数据库开发
4SAPI2 小时前
多模型请求路由怎么设计?成本、速度和能力如何平衡
人工智能·python·gateway·php
魔乐社区2 小时前
翼芯・智算测试与适配优化专区,让国产算力“选得准、跑得通、用得好“
人工智能·开源·大模型
XCDoris4 小时前
郴州logo设计机构
大数据·人工智能·python
Goboy5 小时前
一个人带三个Agent,我用全新TRAE从0到1搭了个资讯周刊站
人工智能·trae
俊哥V5 小时前
每日 AI 研究简报 · 2026-10-19
人工智能·ai
AI_AGENT_DEV_AI5 小时前
AI英语教培智能体的开发
人工智能
物联网软硬件开发-轨物科技5 小时前
【技术白皮书】光伏清检一体化机器人系统解决方案技术白皮书
大数据·运维·网络·人工智能·机器人
gCode Teacher 格码致知5 小时前
Pandas教学-17:Series与Dataframe的关系
开发语言·python·pandas