OpenCv之图像轮廓(二)

目录

一、多边形逼近

二、凸包

 三、最小外接矩形与最大外接矩形


一、多边形逼近

参照函数:

approxPolyDP就是以多边形去逼近轮廓,采用的是Douglas-Peucker算法(DP)

DP算法原理比较简单,核心就是不断找多边形最远的点加入形成新的多边形,直到最短距离小于指定的精度。

案例代码如下:

import cv2
import numpy as np# 该图像显示效果是黑白的,但是实际上确实三个通道的彩色图像
img = cv2.imread('6.jpg')# 变成单通道的黑白图片
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 二值化,注意有两个返回值,阈值和结果
ret,binary = cv2.threshold(gray,150,255,cv2.THRESH_BINARY)# 轮廓查找,新版本返回两个结果,轮廓和层级,老版本返回三个 参数,图像,轮廓和层级
result,contours,hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓会直接修改原图
# 如果想保持原图不变,建议copy一份
img_copy = img.copy()
cv2.drawContours(img_copy,contours,0,(0,0,255),2)# 使用多边形逼近,近似模拟手的轮廓
approx = cv2.approxPolyDP(contours[0],5,closed=True)
# 画出多边形逼近的轮廓
cv2.drawContours(img_copy,[approx],0,(0,0,255),2)# 释放资源
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下:

二、凸包

逼近多边形是轮廓的高度近似,但是有时候,我们希望使用一个多边形的凸包来简化它。凸包跟逼近多边形很像,只不过它是物体最外层的凸多边形。凸包指的是完全包含原有轮廓,并且仅由轮廓上的点所构成的多边形。凸包的每一处都是凸的,即在凸包内连接任意两点的直线都在凸包的内部。在凸包内,任意连续三个点的内角小于180°。

案例代码如下:

import cv2
import numpy as npimg = cv2.imread('6.jpg')gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 二值化
thersh,binary = cv2.threshold(gray,150,255,cv2.THRESH_BINARY)# 查找轮廓
result,contours,hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓(0代表一个轮廓)
cv2.drawContours(img,contours,0,(0,0,255),2)# 多边形逼近
approx = cv2.approxPolyDP(contours[0],20,closed=True)
# 画出轮廓
cv2.drawContours(img,[approx],0,(0,0,255),2)# 凸包
hull = cv2.convexHull(contours[0])
# 画出凸包
cv2.drawContours(img,[hull],0,(255,0,0),2)cv2.imshow('img',img)cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下:

 三、最小外接矩形与最大外接矩形

外接矩形分为最小外接矩形与最大外接矩形

 案例代码如下:

import cv2
import numpy as np# 该图像显示效果是黑白的,但是实际上确实三个通道的彩色图像
img = cv2.imread('6.jpg')# 变成单通道的黑白图片
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 二值化,注意有两个返回值,阈值和结果
ret,binary = cv2.threshold(gray,150,255,cv2.THRESH_BINARY)# 轮廓查找,新版本返回两个结果,轮廓和层级,老版本返回三个 参数,图像,轮廓和层级
result,contours,hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)# rect是一个旋转的矩形,矩形的其实坐标(x,y),矩形的长宽,矩形旋转角度
# 画最小外接矩形
rect = cv2.minAreaRect(contours[1])
# 坐标必须为整数,需要转换一下
box = cv2.boxPoints(rect)
box = np.int0(box)
# 或者四舍五入一下
box = np.round(box).astype('int64')
cv2.drawContours(img,[box],0,(255,0,0),2)# 最大外接矩形,返回最大外接矩形的参数,(x,y),(w,h)
x,y,w,h = cv2.boundingRect(contours[1])
cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)

运行结果如下:

 

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

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

相关文章

数据结构-栈和队列

栈和队列 栈栈的基本概念栈的结构初始化栈销毁栈压栈出栈栈中元素的个数查找栈顶的元素压栈和出栈的一个演示全部代码Stack.hStack.cTest.c 队列队列的基本概念节点和队列的定义队列的初始化销毁队列入队出队计算队列中元素的个数判断队列是否为空返回队列中的队头元素返回队列…

暑期代码每日一练Day3:874. 模拟行走机器人

题目 874. 模拟行走机器人 分析 这道题就是个简单的模拟 主要有两点考察点: 对方向数组的运用 方向数组存储的是各个方向的单位向量,也即: 方向XY向北01向东10向南0-1向西-10 存储在数组中,则是方向数组: in…

Spring(一):Spring 的创建和使用

目录 Spring 是什么? 什么是容器? 什么是 IoC? 什么是 IoC? IoC的优点是啥呢? 理解 IoC DI 概念说明 Spring 的创建 创建 Spring 项目 1. 创建⼀个普通 Maven 项⽬。 2. 添加 Spring 框架⽀持(s…

基于FPGA的按键消抖

文章目录 基于FPGA的按键消抖一、按键消抖原理二、按键消抖代码三、仿真代码编写四:总结 基于FPGA的按键消抖 一、按键消抖原理 按键抖动:按键抖动通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性…

uboot移植裁剪原理和流程

一、Uboot的裁剪是裁剪什么? Uboot的裁剪分为两个方面:Uboot本身命令的裁剪和具体SoC硬件配置的裁剪。 1、Uboot本身命令的裁剪   Uboot提供了很多的操作命令,我们使用Uboot的时候通常只使用最常用的一些命令,其他很多的命令有…

类 和 对象

目录 1、面向对象编程 2、面向对象编程 2.1面向对象编程特征 3、类和对象的概念 3.1类的定义 3.11属性 3.12方法 3.13重载 3.14递归 3.13返回值return 3.2对象 3.2.1对象组合 4、jvm内主要三块内存空间 5、参数传值 1、面向对象编程 面向过程:关注的是步骤…

webpack笔记二

文章目录 背景拆分环境清除上次构建产物插件:clean-webpack-plugin合并配置文件插件:webpack-merge实时更新和预览效果:webpack-dev-server babel配置参考 背景 webpack笔记一 在前面的学习,完成了webpack的基本配置&#xff0c…

【云原生】k8s之包管理器Helm

前言 每个成功的软件平台都有一个优秀的打包系统,比如Debian、Ubuntu 的 apt,RedHat、CentOS 的 yum。Helm 则是 Kubernetes上 的包管理器,方便我们更好的管理应用。 1.Helm的相关知识 1.1 Helm的简介与了解 Helm本质就是让K8s的应用管理&…

Profibus DP主站转Modbus TCP网关profibus从站地址范围

远创智控YC-DPM-TCP网关。这款产品在Profibus总线侧实现了主站功能,在以太网侧实现了ModbusTcp服务器功能,为我们的工业自动化网络带来了全新的可能。 远创智控YC-DPM-TCP网关是如何实现这些功能的呢?首先,让我们来看看它的Profib…

Linux 学习记录52(ARM篇)

Linux 学习记录52(ARM篇) 本文目录 Linux 学习记录52(ARM篇)一、汇编语言相关语法1. 汇编语言的组成部分2. 汇编指令的类型3. 汇编指令的使用格式 二、基本数据处理指令1. 数据搬移指令(1. 格式(2. 指令码类型(3. 使用示例 2. 立即数(1. 一条指令的组成 3. 移位操作指令(1. 格式…

Meta 最新发布 LLaMA 2(允许商业化)

2023年7月18日,Meta 发布了LLaMA 2,包含7B,13B,70B三种参数(34B暂时还未发布)。 官方: https://ai.meta.com/llama/ 论文:Llama 2: Open Foundation and Fine-Tuned Chat Models 模型…

网络编程——RPC与HTTP基本介绍、历史追溯、主流应用场景、对比分析、为什么还需要使用RPC

一、HTTP与RPC基本介绍 HTTP协议(Hyper Text Transfer Protocol)超文本传输协议: 一个用于在网络上交换信息的标准协议,它定义了客户端(例如浏览器)和服务器之间的通信方式。如平时上网在浏览器上敲个网址url就能访问网页&#x…