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(contours[1],True),计算轮廓长度
    • 0.005表示近似的程度,值越小,近似的点越多,值越大近似的点越少,线条越多少
    • contours[1]为要近似的目标轮廓,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(contours[7])
    • x,y)坐标,m,圆形轮廓半径
    • contours[7],轮廓
  • 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(contours[7])
    • 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)

运行结果:

相关推荐
2301_7875528718 分钟前
node-DeepResearch开源ai程序用于深入调查查询,继续搜索、阅读网页、推理,直到找到答案
人工智能·开源
struggle202528 分钟前
SPEAR开源程序是用于逼真演示 AI 研究的模拟器
人工智能·开源
云空33 分钟前
《ChatGPT o3抗命:AI失控警钟还是成长阵痛?》
人工智能·深度学习·神经网络·机器学习·chatgpt
蹦蹦跳跳真可爱58939 分钟前
Python----神经网络(基于ResNet的汽车分类)
人工智能·python·深度学习·神经网络·汽车
新中地GIS开发老师1 小时前
25年GIS开发暑期实训营,15天Get三维可视化智慧城市开发项目
前端·人工智能·智慧城市·web·gis开发·webgis·地信
IT科技那点事儿1 小时前
Accelerate 2025北亚巡展正式启航!AI智御全球·引领安全新时代
人工智能·安全
AI街潜水的八角1 小时前
手写字魔法消除3:深度学习PmrNet神经网络实现图片修复(含训练代码、数据集和GUI交互界面)
人工智能·深度学习·神经网络
肥猪猪爸1 小时前
使用LSTM进行时间序列分析
数据结构·人工智能·rnn·深度学习·算法·lstm·时间序列分析
cnbestec1 小时前
开源即战力!从科研到商用:Hello Robot 移动操作机器人Stretch 3多模态传感融合(RGB-D/激光/力矩)控制方案
人工智能·具身智能·hellorobot·移动操作机器人·stretch 3
大刘讲IT1 小时前
WMS系统选型与实施避坑手册
运维·人工智能·经验分享·程序人生·能源·制造