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

news2024/11/25 22:47:25

在这里插入图片描述

轮廓查找

  • 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 np

img = 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 np

def drawShape(src, points):
    i = 0
    while 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+1




img = 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 np

def drawShape(src, points):
    i = 0
    while 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+1




img = 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 np

img = 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.coloradmin.cn/o/666773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jetson-TX2刷机与镜像生成、恢复

目录 1. 系统与SDK烧录 2. tx2系统镜像备份与恢复 1. 系统与SDK烧录 1. 准备一台ubuntu系统的主机&#xff0c;一根安卓数据线&#xff0c;主机需连网&#xff0c;jetson设备无需连网。 2. 宿主机安装sdkmanager&#xff0c;建议安装版本较新一点的。 先下载sdkmanager的安…

C++基础(11)——STL(基本概念和string)

前言 本文主要介绍C中STL基本知识和string类 7.1&#xff1a;初识STL 7.1.1&#xff1a;STL六大组件 算法要通过迭代器来访问容器中的数据 STL的六大组件&#xff1a;容器、算法、迭代器、仿函数、适配器、空间配置器 1.容器&#xff1a;各种数据结构&#xff0c;如vecto…

2.9 epoll的实现原理

目录 一、epoll的数据结构1、epoll的数据结构选择2、epoll数据结构图 二、epoll的线程安全三、epoll的内核回调epoll 回调函数epoll回调时机 四、epoll的用户态接口epoll_createepoll_ctl epoll_wait 五、epoll的LT和ET 在前文已经基于dpdk实现了用户态协议栈&#xff0c;但是有…

编译原理笔记(哈工大编译原理)(及格版)

文章目录 前言概论语言与文法基本概念字母表串字母表与串的联系 文法语言推导和规约句型与句子语言与字母表 文法的分类CFG的分析树 词法分析正则式正则定义有穷自动机&#xff08;FA&#xff09;DFANFAFA之间的等价性 从RE到DFARE转NFANFA确定化&#xff1a;子集法DFA最小化&a…

Vue.js 内部运行机制

在 new Vue() 之后。 Vue 会调用 _init 函数进行初始化,也就是这里的 init 过程,它会初始化生命周期、事件、 props、 methods、 data、 computed 与 watch 等。其中最重要的是通过 Object.defineProperty 设置 setter 与 getter 函数,用来实现「响应式」以及「依赖收集」,…

spring boot 运行报错: 找不到或无法加载主类

原文地址&#xff1a;spring boot 运行报错: 找不到或无法加载主类 - 走看看 一&#xff1a;当在eclipse启动spring boot项目时出现问题&#xff1a; springboot错误: 找不到或无法加载主类 解决办法&#xff1a; 1&#xff0c;通过cmd命令行&#xff0c;进入项目目录进行&am…

Linux5.7 MySQL 高级(进阶) SQL 语句

文章目录 计算机系统5G云计算第四章 LINUX MySQL 高级(进阶) SQL 语句一、高级SQL 语句1&#xff09;SELECT2&#xff09;DISTINCT3&#xff09;WHERE4&#xff09;AND OR5&#xff09;IN6&#xff09;BETWEEN7&#xff09;通配符8&#xff09;LIKE9&#xff09;ORDER BY10&…

【软件测试面试题】offer又失之交臂?项目经验项目描述看这个篇就够了

前言 我们测试人员在找工作中&#xff0c;基本都会碰到让介绍项目的这种面试题。 如何正确介绍自己的项目&#xff1f;需要做哪些技术准备&#xff1f; 关于介绍自己的项目&#xff1f; 可以从以下几个方面来表述&#xff1a; 项目基本介绍&#xff1a;项目架构、项目业务流…

如何模拟一个僵尸进程

原理 子进程先于父进程退出&#xff0c;父进程还在继续运行&#xff0c;且没有调用wait函数。 实验代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <errno.h>#define _DEBUG_INFO #ifdef _DEB…

Zabbix“专家坐诊”第196期问答汇总

问题一 Q&#xff1a;统计一个主机群组里&#xff0c;值为A的某个监控项的个数&#xff0c;函数应该怎么写&#xff1f; A&#xff1a;参考&#xff1a; https://www.zabbix.com/documentation/6.0/zh/manual/config/items/itemtypes/calculated/aggregate。 Q&#xff1a;文…

零基础如何学习 Web 安全,如何让普通人快速入门网络安全?

前言 网络安全现在是朝阳行业&#xff0c;缺口是很大。不过网络安全行业就是需要技术很多的人达不到企业要求才导致人才缺口大 【一一帮助安全学习&#xff08;网络安全面试题学习路线视频教程工具&#xff09;一一】 初级的现在有很多的运维人员转网络安全&#xff0c;初级…

lammps案例:原子倒入容器

本文介绍lammps向体系内动态添加原子的一种方法。 在绝大多数的分子动力学模拟过程中&#xff0c;原子数量保持恒定。 如果需要按一定步数动态的减少原子&#xff0c;可参考&#xff1a; 删除蒸发原子 动态的增加原子&#xff0c;可以使用fix deposit沉积命令&#xff1a; 沉积…

《Stable Diffusion WebUI折腾实录》在Windows完成安装, 从社区下载热门模型,批量生成小姐姐图片

环境 操作系统: Windows11 显卡: RTX2060 6GB 显存 安装Python 下载 Python3.10.6 https://www.python.org/ftp/python/3.10.6/python-3.10.6-amd64.exe安装 注意勾选 Add Python 3.10.6 to PATH &#xff0c;然后一路下一步即可 打开powershell&#xff0c; 确认安装成功 …

Opencv项目实战:23 智能计数和表单信息

目录 0、项目介绍 1、效果展示 2、项目搭建 3、项目代码展示与部分讲解 拍照脚本data_collection.py 图片检测Picdetect.py 摄像头检测Videodetect.py 主函数CountMain.py 自定义模块tally.py 4、项目资源 5、项目总结 0、项目介绍 有一段时间没有更新专栏了&#…

“专精特新”企业数字化转型,如何激发增长新动能

随着数字技术的不断发展&#xff0c;越来越多的企业开始意识到数字化转型的重要性。对于专精特新的企业来说&#xff0c;数字经济的发展也同样给中小企业带来难得的发展机遇&#xff0c;数字化在助力中小企业降本、增效和提质方面发挥着日益重要的作用&#xff0c;数字化转型已…

英伟达发布GeForce 536.23游戏驱动,一键快速获取

英伟达又赶在6月发布了一款超强游戏驱动&#xff0c;NVIDIA GeForce 536.23 WHQL&#xff0c;并有两款游戏大作宣布&#xff0c;首发日即支持 NVIDIA DLSS 2 和 NVIDIA Reflex&#xff0c;驱动人生带大家一起了解一下这款NVIDIA GeForce 536.23 WHQ驱动&#xff0c;以及获取英伟…

Linux【系统学习】(命令及虚拟机篇-无shell)

目录 第 1 章 Linux 入门 1.1 概述 1.2 Linux 和 Windows 区别 ​编辑 1.3 CentOS 下载地址 第 2 章 VM 与 Linux 的安装 2.1 VMWare 安装 CentOS 安装 第 3 章 Linux 文件与目录结构 3.1 Linux 文件 3.2 Linux 目录结构 第 4 章 VI/VIM 编辑器&#xff08;重要&…

智能客服机器人:基于知识图谱的多轮对话系统

━━━━ 近年来&#xff0c;随着人工智能的快速发展&#xff0c;人机交互能力不断增强&#xff0c;其中问答技术能够在保证一定准确度的情况下极大地简化用户的搜索操作&#xff0c;在节约时间的同时&#xff0c;还能够加深用户对搜索事物的了解程度&#xff0c;百度公司的小…

一篇文章搞定《Android中View的绘制流程》

一篇文章搞定《CoordinatorLayout完成电商首页》 本文前言怎样到达ViewRootImpl过程如下&#xff1a;流程图小结&#xff1a; 到达ViewRootImpl做了什么第一步&#xff1a;setView()第二步&#xff1a;performTraversals()第三步&#xff1a;DecorView中的Measure()、Layout()、…

nginx配置代理报错

1.背景 因部署需要将项目用nginx进行二次转发访问&#xff0c;配置过程中出现各种报错&#xff0c;现将记录如下 Whitelabel Error PageThis application has no explicit mapping for /error, so you are seeing this as.... 2.nginx配置如下 upstream wuhan1 {#server 19…