当前位置: 首页 > news >正文

opencv学习(轮廓检测)

目录

1.相关概念

2.核心函数

3.常见的几种操作处理


1.相关概念

轮廓是图像中连续的、有相同颜色 / 灰度值的像素点组成的曲线,代表物体的边界。

与边缘的区别:边缘是离散的像素突变点,轮廓是连续的闭合曲线,更强调 “连接性”。

轮廓检测的前提必须输入二值图像(黑白图像)

2.核心函数

cv2.findContours():用于从二值图像中提取轮廓,返回轮廓列表和层级信息

# OpenCV 4.x/2.x 版本
contours, hierarchy = cv2.findContours(binary_img, mode, method)# OpenCV 3.x 版本(多一个返回值,通常用_忽略)
_, contours, hierarchy = cv2.findContours(binary_img, mode, method)

参数:: 

  • mode(轮廓检索模式):决定轮廓的层级关系(父子关系)

    • cv2.RETR_EXTERNAL:只保留最外层轮廓(常用,减少干扰)。

    • cv2.RETR_TREE:保留所有轮廓并构建完整层级树(适合分析嵌套轮廓,如 “同心圆”)。

    • cv2.RETR_LIST:保留所有轮廓,但不构建层级(简单场景用)。

  • method(轮廓逼近方法):决定轮廓点的存储方式

    • cv2.CHAIN_APPROX_NONE:存储所有轮廓点(精确但占内存)。

    • v2.CHAIN_APPROX_SIMPLE:压缩冗余点(如矩形只保留 4 个角点,节省内存,常用)。

3.常见的几种操作处理

 绘制轮廓,轮廓特征,边界矩形,外接圆,轮廓近似

import cv2
import matplotlib.pyplot as plt
import numpy as np#为了更高的准确率,采用二值图像img=cv2.imread('stru2.jpg')
def cv_show(name,imag):cv2.imshow(name,imag)cv2.waitKey(0)cv2.destroyAllWindows()
cv_show('stru',img)gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
res,thresh=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)  #二值处理
cv_show('thresh',thresh)#轮廓特征(求轮廓的面积和周长)con=contours[1]#[1]表示轮廓列表的第一个
area=cv2.contourArea(con)#求面积
arc=cv2.arcLength(con,True)#求周长,True表示轮廓是闭合的
print(area,'      ',arc)#边界矩形x,y,w,h=cv2.boundingRect(con)#cv2.boundingRect() 是 OpenCV 中用于计算轮廓最小外接矩形(边界矩形)的函数
#x:矩形左上角的 x 坐标,y:矩形左上角的 y 坐标,w:矩形的宽度,h:矩形的高度
imag=cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
#cv2.rectangle() 是 OpenCV 中用于在图像上绘制矩形的函数,常与 cv2.boundingRect() 配合使用,
#(x,y)是矩形的左上角坐标,(x+w,y+h)是矩形的右下角坐标
cv_show('imag',imag)#外接圆
'''
v2.minEnclosingCircle()是计算轮廓 con 的最小外接圆(能完全包围轮廓的最小圆形)
其中,(x1,y1)是圆心坐标,是浮点数类型,r是半径也是浮点数类型'''
(x1,y1),r=cv2.minEnclosingCircle(con)
center=(int(x1),int(y1))
r=int(r)
imag1=cv2.circle(draw_img,center,r,(0,255,0),2)#cv2.circle()是OpenCV中用于在图像上绘制圆形的函数,可用于标记目标中心、绘制轮廓外接圆等场景
cv_show('imag1',imag1)#轮廓近似con1=contours[2]
arc1=cv2.arcLength(con1,True)
epsilon=0.1*arc1#精度(0.1)越小,近似结果越接近原始轮廓;精度越大,轮廓越简化。
approx=cv2.approxPolyDP(con1,epsilon,True)
draw_img1=img.copy()
res1=cv2.drawContours(draw_img1,[approx],-1,(0,0,255),2)
cv_show('res1',res1)#用for循环遍历所有的轮廓并进行轮廓近似draw_img2 = img.copy()
for i,contour in enumerate(contours):'''
i:接收当前轮廓的索引(从 0 开始的整数),用于标识当前处理的是第几个轮廓。
contour:接收 contours 列表中的每个轮廓元素(即单个轮廓的坐标数据)。不这样用:contour=contours[i]
enumerate() 是 Python 内置函数,用于将一个可迭代对象(这里是 contours 轮廓列表)转换为一个枚举对象。'''arc2=cv2.arcLength(contour,True)epsilon2=0.2*arcapprox2=cv2.approxPolyDP(contour,epsilon2,True)cv2.drawContours(draw_img2,[approx2],-1,(0,0,255),2)
cv_show('draw_all',draw_img2)

http://www.dtcms.com/a/302471.html

相关文章:

  • ACL 访问控制列表全解析:从规则语法到实战配置
  • 旧物回收小程序:科技赋能,让旧物回收焕发生机
  • Avalonia的自定义边框窗口
  • React中为甚么强调props的不可变性
  • TMS320F2812PGFA TI:150MHz工业级DSP控制芯片,电机控制专用
  • 腾讯AI IDE
  • 天学网面试 —— 中级前端开发岗位
  • 动/静态库的原理及制作
  • 测试用例设计常用方法
  • MR-link-2:多效性顺式孟德尔随机化分析!
  • Windows 系统分辨率切换** 与 **Qt4 无边框窗口管理机制** 的交互
  • 2025年7月21–28日AI开发周报:新模型、新战略与开源亮点
  • 全新AI工具小程序源码 全开源
  • 北京-4年功能测试2年空窗-报培训班学测开-第六十二天-模拟未通过,继续准备自我介绍项目介绍面试题中
  • java中一些数据结构的转换
  • C++模板元编程从入门到精通
  • 从“PPT动画”到“丝滑如德芙”——uni-app x 动画性能的“终极奥义”
  • 能源智跃:大模型破壁数据孤岛,铸就智能转型新范式
  • ofd文件转pdf
  • 打通视频到AI的第一公里:轻量RTSP服务如何重塑边缘感知入口?
  • InsightFace(RetinaFace + ArcFace)人脸识别项目(预训练模型,鲁棒性很好)
  • 端到端的核心区别点
  • Ubuntu24安装MariaDB/MySQL后不知道root密码如何解决
  • 如何实现任务附件管理功能:ONLYOFFICE协作空间文件选择器集成指南
  • (LeetCode 面试经典 150 题 ) 155. 最小栈 (栈)
  • 【Oracle】数据泵
  • Rk3568-芯片内看门狗
  • Laravel 分页方案整理
  • Apache Kafka实时数据流处理实战指南
  • 稳定币催化下,Web3 支付赛道将迎来哪些爆发?