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

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

目录

  • 查找、绘制轮廓、圆形矩形轮廓和近似轮廓
    • 1 轮廓查找和绘制
      • 1.1 轮廓查找
        • 1.1.1 函数和参数
        • 1.1.2 返回值
      • 1.2 轮廓绘制
        • 1.2.1 函数和参数
      • 1.3 步骤
      • 1.4 实际测试绘制轮廓
    • 2 绘制近似轮廓
      • 2.1 函数和参数
      • 2.2 查找特定轮廓
      • 2.3 近似轮廓测试
    • 3 绘制圆形矩形轮廓
      • 3.1 圆形函数和参数
      • 3.2 矩形函数和参数
      • 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 实际测试绘制轮廓

原图:在这里插入图片描述

代码展示:

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 查找特定轮廓

这里找的是最大的轮廓
原图:
在这里插入图片描述

代码展示:

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 近似轮廓测试

原图:
在这里插入图片描述

代码展示:

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 实际测试

原图:
在这里插入图片描述

代码展示:

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)

运行结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/66884.shtml

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

相关文章

【Linux】模拟Shell命令行解释器

一、知识补充 1.1 snprintf snprintf() 是 C语言的一个标准库函数&#xff0c;定义在<stdio.h>头文件中。 snprintf() 函数的功能是格式化字符串&#xff0c;并将结果存储在指定的字符数组中。该函数的原型如下&#xff1a; int snprintf(char *str, size_t size, con…

云计算基础,虚拟化原理

文章目录 一、虚拟化1.1 什么是虚拟化1.2 虚拟化类型 二 、存储虚拟化2.1 存储指标2.2 存储类型2.3 存储协议2.4 RAID 三、内存 i/O虚拟化3.1 内存虚拟化基本概念地址空间转换原理内存共享与隔离原理 3.2 I/O 虚拟化基本概念模拟&#xff08;Emulation&#xff09;方式半虚拟化…

Vue3 + Vite + Electron + Ts 项目快速创建

一、创建 Vue 项目 1. 创建项目 pnpm create vite 2. 安装依赖 cd excel-electron pnpm install 3. 运行项目 pnpm dev 二、添加 Electron 1. 安装 electron pnpm add electron -D 2. 修改 package.json 添加入口 js 和执行命令。 {"main": "dist-ele…

pytest+allure 入门

使用allure如何生成自动化测试报​​​​​​告 &#xff1f;一文详解allure的使用 。_allure测试报告-CSDN博客 例子&#xff1a; import allure import pytest import osallure.epic("闹钟") allure.feature("闹钟增删") class TestSchedule():def setu…

新活动平台建设历程与架构演进

01 前言 历时近两年的重新设计和迭代重构&#xff0c;用户技术中心的新活动平台建设bilibili活动中台终于落地完成&#xff01;并迎来了里程碑时刻 —— 接过新老迭代的历史交接棒&#xff0c;从内到外、从开发到搭建实现全面升级&#xff0c;开启了活动生产工业化新时代&#…

从CentOS到龙蜥:企业级Linux迁移实践记录(系统安装)

引言&#xff1a; 随着CentOS项目宣布停止维护CentOS 8并转向CentOS Stream&#xff0c;许多企业和组织面临着寻找可靠替代方案的挑战。在这个背景下&#xff0c;龙蜥操作系统&#xff08;OpenAnolis&#xff09;作为一个稳定、高性能且完全兼容的企业级Linux发行版&#xff0…

MR实战:IP地址去重

文章目录 1. 实战概述2. 提出任务2.1 原始问题2.2 简单化处理 3. 准备数据3.1 在云主机上创建文本文件3.2 上传文件到HDFS指定目录 4. 实现步骤4.1 创建Maven项目4.2 添加相关依赖4.3 创建日志属性文件4.4 创建网址去重映射器类4.5 创建网址去重归并器类4.6 创建网址去重驱动器…

AnaConda下载PyTorch慢的解决办法

使用Conda下载比较慢&#xff0c;改为pip下载 复制下载链接到迅雷下载 激活虚拟环境&#xff0c;安装whl&#xff0c;即可安装成功 pip install D:\openai.wiki\ChatGLM2-6B\torch-2.4.1cu121-cp38-cp38-win_amd64.whl

Photoshop PS批处理操作教程(批量修改图片尺寸、参数等)

前言 ‌Photoshop批处理的主要作用‌是通过自动化处理一系列相似的操作来同时应用于多张图片&#xff0c;从而节省时间和精力&#xff0c;提高工作效率。批处理功能特别适用于需要批量处理的任务&#xff0c;如图像尺寸调整、颜色校正、水印添加等‌。 操作步骤 1.创建动作 …

Web渗透测试之XSS跨站脚本 防御[WAF]绕过手法

目录 XSS防御绕过汇总 参考这篇文章绕过 XSS payload XSS防御绕过汇总 服务端知道有网络攻击或者xss攻 Html 通过js代码 标签属性等手段进行一个过滤 不允许出现css的payload 前端过滤 我可以在抓包工具里面修改 抓包工具是不受前端的防御 也 就是浏览器 服务端过滤…

git提交

基本流程&#xff1a;新建分支 → 分支上开发(写代码) → 提交 → 合并到主分支 拉取最新代码因为当前在 master 分支下&#xff0c;你必须拉取最新代码&#xff0c;保证当前代码与线上同步&#xff08;最新&#xff09;&#xff0c;执行以下命令&#xff1a;bashgit pull orig…

多云架构,JuiceFS 如何实现一致性与低延迟的数据分发

随着大模型的普及&#xff0c;GPU 算力成为稀缺资源&#xff0c;单一数据中心或云区域的 GPU 资源常常难以满足用户的全面需求。同时&#xff0c;跨地域团队的协作需求也推动了企业在不同云平台之间调度数据和计算任务。多云架构正逐渐成为一种趋势&#xff0c;然而该架构下的数…

【Git原理和使用】Git 分支管理(创建、切换、合并、删除、bug分支)

一、理解分支 我们可以把分支理解为一个分身&#xff0c;这个分身是与我们的主身是相互独立的&#xff0c;比如我们的主身在这个月学C&#xff0c;而分身在这个月学java&#xff0c;在一个月以后我们让分身与主身融合&#xff0c;这样主身在一个月内既学会了C&#xff0c;也学…

静态路由配置与调试——计算机网络实训day1

文章目录 操作前准备一、实验目的二、实验要求三、实验过程1、在R1和R2上配置设备名称。基本配置设备命名 2、在R1和R2上配置接口IP地址&#xff0c;并查看IP地址的配置情况。3、在R1和R2上配置静态路由&#xff0c;并查看路由表。静态路由缺省路由&#xff08;默认路由&#x…

农产品直播带货方案拆解

作为一名经验丰富的营销策划人道叔&#xff0c;今天我来拆解一下咱们4A营销广告圈的这份《直播天府川农好物带货方案》&#xff0c;让你能学到很多实用的策略和技巧&#xff0c;直接应用到你的策划工作中去。 首先&#xff0c;咱们看看背景分析。 助农直播现在可是个大热门&a…

【Qt】控件概述和QWidget核心属性1(enabled、geometry、windowTitle、windowIcon、QRC机制)

一、控件概念 界面上各种元素、各种部分的统称&#xff08;如按钮、输入框、下拉框、单选复选框...&#xff09; Qt作为GUI开发框架&#xff0c;内置了各种的常用控件&#xff0c;并支持自定义控件。 二、控件体系发展 1.没有完全的控件&#xff0c;需要使用绘图API手动绘制…

【杂谈】-50+个生成式人工智能面试问题(四)

7、生成式AI面试问题与微调相关 Q23. LLMs中的微调是什么&#xff1f; 答案&#xff1a;虽然预训练语言模型非常强大&#xff0c;但它们并不是任何特定任务的专家。它们可能对语言有惊人的理解能力&#xff0c;但仍需要一些LLMs微调过程&#xff0c;开发者通过这个过程提升它…

spring boot 多数据源集成mysql、postgresql、phoenix、doris等

如何搭建多数据源项目只要以下简单几步; 一. 创建核心在config.datasource文件夹里 二. 引入相对应的jar包 三. 创建数据库连接配置 四. 写逻辑代码进行验证 1.DataSource package com.irootech.config.datasource;import java.lang.annotation.*;Target({ElementType.MET…

01-51单片机LED与独立按键

一、单片机概述 注意&#xff1a;个人学习笔记&#xff0c;里面涉及到的C语言和进程转换相关的知识在C语言部分已经写了&#xff0c;这里是默认都会的状态学习单片机。 1.什么是单片机 单片机&#xff0c;英文Micro Controller Unit&#xff0c;简称MCU。其内部集成了CPU、R…

音视频入门基础:MPEG2-PS专题(6)——FFmpeg源码中,获取PS流的视频信息的实现

音视频入门基础&#xff1a;MPEG2-PS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;1&#xff09;——MPEG2-PS官方文档下载 音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ps文件 音视频入门基础…